7

我正在寻找覆盖文本文件中的数据,但我似乎所能做的就是附加到它

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

2 回答 2

25

改变

mFile.open(QFile::ReadWrite);

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

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

或者,您可以按照其他建议直接使用 QTextStream 的构造函数之一打开您的文本文件。相同的QIODevice::OpenMode约定适用。这仅在mFileis a FILEobject 而不是 a时才有效QFile,在您的示例中并非如此。


给初学者的一些附加说明。

相关注释1

您没有问过这个问题,但我还添加了QIODevice::Text标志以确保\n\r\n您使用endl.

一个非常常见的错误是使用\r\nAND ,这会导致文本文件在 Windows 上QIODevice::Text具有双返回。\r\r\n只需QIODevice::Text在打开时使用,\n或者endl,您将永远不会遇到这个问题。

相关注释2

使用QTextStream::endlflush()每次都会自动调用。如果您的循环很大,请"\n"改为使用以防止减速,除非您确实需要刷新每一行。当缓冲区已满或关闭时,流将自动写入磁盘。

QFile::close()也调用flush(),这使您mFile.flush()最终变得多余。

于 2012-11-10T00:13:23.370 回答
10

使用 QTextStream 的重载构造函数:

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

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

于 2012-11-09T19:08:30.983 回答