qt - 覆盖文本文件与追加

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

最佳答案

改变

mFile.open(QFile::ReadWrite);
mFile.open(QIODevice::ReadWrite | QIODevice::Truncate | QIODevice::Text);
QIODevice 与 QFile 的区别不是必需的,但我个人更喜欢使用基类。 Truncate flag 将覆盖(即删除)现有文件。
或者,您可以关注 other suggestion并使用 QTextStream 的构造函数之一直接打开您的文本文件。一样的 QIODevice::OpenMode 公约适用。这仅适用于 mFileFILE对象而不是 QFile ,在您的示例中并非如此。

给初学者的一些附加说明。
相关注释1
你没有问这个,但我也添加了 QIODevice::Text标志以确保在使用 \n 时将换行符转换为本地编码(纯 \r\nendl 相比) .
一个非常常见的错误是使用 \r\nQIODevice::Text ,这导致文本文件具有双返回 \r\r\n在 Windows 上。只需使用 QIODevice::Text打开时只需\nendl你永远不会有这个问题。
相关说明2
使用 QTextStream::endl会自动调用flush()每一次。如果您的循环很大,请使用 "\n"相反,以防止减速,除非您确实需要刷新每一行。当缓冲区已满或关闭时,流将自动写入磁盘。
QFile::close()也调用flush() ,这使您的 mFile.flush()最后是多余的。

关于qt - 覆盖文本文件与追加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13314289/

相关文章:

c++ - QDial 更改位置指示器文本

c++ - 在Qt中将数据保存到文件

c++ - 使用 QFile().setPermissions() 设置读写权限

c++ - Qt:文件读取不起作用

c++ - QFile::QFile 函数 --> 错误:QFile::QFile (const QFile &) 'is private

c++ - 如何使用 QModelIndex 访问 QTreeView 中的 childWidgets?

c++ - 代理和 fetchMore()/canFetchMore() 背后的 Qt 模型

c++ - 将测试从 GoogleTest 升级到 GoogleMock (Ubuntu 14) 时出现与 pthread 相关的错误

c++ - QT 可以与 Windows 原生集成吗?

c++ - 在当前目录以外的位置创建 QFile 时出现问题