覆盖文本文件vs附加

时间:2012-11-09 19:02:37

标签: qt qfile

我想覆盖文本文件中的数据,但我似乎只能附加到它

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();

2 个答案:

答案 0 :(得分:22)

更改

mFile.open(QFile::ReadWrite);

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

QIODevice与QFile的区别不是必需的,但我个人赞成使用基类。 Truncate标志将覆盖(即删除)现有文件。

或者,您可以按照other suggestion直接使用QTextStream的构造函数之一打开文本文件。适用相同的QIODevice::OpenMode惯例。仅当mFileFILE对象而不是QFile时才有效,但在您的示例中并非如此。


为初学者添加一些附加说明。

相关注释1

您没有问过这个问题,但我还添加了QIODevice::Text标记,以确保换行字符转换为本地编码(普通\n\r\n)当您使用endl时。

相关注释2

使用QTextStream::endl每次都会自动调用flush()。如果您的循环很大,请使用"\n"来防止减速,除非您确实需要刷新每一行。

QFile :: close()也会调用flush(),这会使你的mFile.flush()结尾为多余。

答案 1 :(得分:8)

使用QTextStream的重载构造函数:

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

QIODevice::Truncate将删除该文件的所有先前内容,QIODevice::ReadWrite将打开该文件以进行读写访问。