2012-11-09 102 views
5

我期待在一个文本文件来覆盖数据,但所有我似乎可以做的就是追加到它覆盖文本文件VS追加

mFile.open(QFile::ReadWrite) 

QTextStream in(&mFile); 
QString first = in.readLine(); //discard the headers 
QString dataLine = in.readLine(); //headers 
QStringList sql_row = dataLine.split("\t"); //first row (sake of proj only 1 row) 

if(sql_row[1].isEmpty()) //no user name registered 
{ 
    QByteArray user= getenv("USERNAME"); //for windows 
    if(user.isEmpty()) 
     { 
       user = getenv("USER"); ///for MAc or Linux 
      } 
    dataLine = dataLine.insert(dataLine.indexOf("\t")+ 1,user); 

    in << first << endl << dataLine << endl; 
    mFile.flush(); 
    mFile.close(); 

回答

18

变化

mFile.open(QFile::ReadWrite); 

mFile.open(QIODevice::ReadWrite | QIODevice::Truncate | QIODevice::Text); 

QIODevice应用VS QFile时的区别是没有必要的,但我使用基类亲自青睐。截断标志将覆盖(即删除)现有文件。您没有问过这个问题,但您应该添加QIODevice::Text标志以确保换行符可以翻译成本地编码(原始\n\r\n)。

或者,您可以按照other suggestion并使用QTextStream的构造函数之一直接打开文本文件。相同的QIODevice::OpenMode惯例适用。

7

使用QTextStream的重载的构造函数:

QTextStream in(&mFile, QIODevice::ReadWrite | QIODevice::Truncate); 

QIODevice::Truncate将删除该文件的所有以前的内容,并QIODevice::ReadWrite将打开它的读取和写入访问。