Qt 覆盖文本文件vs追加

Qt 覆盖文本文件vs追加,qt,qfile,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 p

我希望覆盖文本文件中的数据,但我所能做的似乎就是附加到它

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();
mFile.open(QFile::ReadWrite)
QTextStream-in(&mFile);
QString first=in.readLine()//丢弃标题
QString dataLine=in.readLine()//标题
QStringList sql_row=dataLine.split(“\t”)//第一行(仅为项目起见,第1行)
if(sql_行[1].isEmpty())//未注册用户名
{
QByteArray user=getenv(“用户名”);//适用于windows
if(user.isEmpty())
{
user=getenv(“user”);///适用于MAc或Linux
}
dataLine=dataLine.insert(dataLine.indexOf(“\t”)+1,用户);

在中,使用QTextStream的重载构造函数:

QTextStream in(&mFile, QIODevice::ReadWrite | QIODevice::Truncate);
QIODevice::Truncate
将删除该文件以前的所有内容,
QIODevice::ReadWrite
将打开该文件进行读写访问。

更改

mFile.open(QFile::ReadWrite);

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

或者,您可以遵循并直接使用QTextStream的构造函数之一打开文本文件。同样的约定也适用。这仅适用于
mFile
文件
对象而不是
QFile
的情况,在您的示例中并非如此


给初学者的一些附加说明

相关注释1

您没有询问这一点,但我还添加了
QIODevice::Text
标志,以确保在使用时,换行符转换为本地编码(纯
\n
\r\n

相关注释2

使用将每次自动调用
flush()
。如果循环较大,请使用
“\n”
,以防止速度减慢,除非您确实需要刷新每一行

QFile::close()还调用
flush()
,这使得最后的
mFile.flush()
变得多余

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