覆盖文本文件vs附加

Mat*_*kes 7 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();
Run Code Online (Sandbox Code Playgroud)

Phl*_*ous 22

更改

mFile.open(QFile::ReadWrite);
Run Code Online (Sandbox Code Playgroud)

mFile.open(QIODevice::ReadWrite | QIODevice::Truncate | QIODevice::Text);
Run Code Online (Sandbox Code Playgroud)

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

或者,您可以按照其他建议直接使用QTextStream的构造函数之一打开文本文件.QIODevice::OpenMode适用相同的惯例.这仅mFileFILE对象而非a 时才有效QFile,在您的示例中不是这种情况.


初学者的另外几个注意事项.

相关注释1

你没有问过这个问题,但我还添加了QIODevice::Text标志,以确保在使用时将换行符转换为本地编码(plain \nvs. \r\n)endl.

相关注释2

使用QTextStream :: endlflush()每次自动调用.如果你的循环很大,请使用"\n"相反来防止减速,除非你真的需要冲洗每一行.

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


Vin*_*ira 8

使用QTextStream的重载构造函数:

QTextStream in(&mFile, QIODevice::ReadWrite | QIODevice::Truncate);
Run Code Online (Sandbox Code Playgroud)

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