写入文本文件错误,QT

Posted

技术标签:

【中文标题】写入文本文件错误,QT【英文标题】:Writting in text file error, QT 【发布时间】:2018-05-14 13:07:36 【问题描述】:

我在 QT c++ 中有这段代码

void writeInFile()

    QFile file(":/texts/test.txt");
    if(file.open(QIODevice::ReadWrite))
    
        QTextStream in(&file);
        in<<"test";
    
    file.close();

我想将“test”添加到我的文本文件中,该文件位于前缀为“texts”的资源中,但是这个函数什么都不做,当我用“QIODevice::ReadWrite”打开它时,我无法从文件中写入或读取" 或 "QFile::ReadWrite",我只能在只读模式下读取它。欢迎任何帮助或建议。

【问题讨论】:

为什么不使用 ./texts/test.txt 而不是 :/texts/test.txt? 有区别吗? 我真的不知道 @SpikeBughdaryan,你能添加这些行吗?在 if cnodition qDebug() 它实际上进入了 if 块,它只是没有改变任何东西 【参考方案1】:

Qt 资源文件是只读的,因为它们作为“代码”放入二进制文件中 - 应用程序无法自行修改。

由于根本不可能编辑资源,因此您应该遵循缓存这些文件的标准方法。这意味着您将资源复制到本地计算机并对其进行编辑。

这是一个基本功能,正是这样做的:

QString cachedResource(const QString &resPath) 
    // not a ressource -> done
    if(!resPath.startsWith(":"))
        return resPath;
    // the cache directory of your app
    auto resDir = QStandardPaths::writableLocation(QStandardPaths::CacheLocation);
    auto subPath = resDir + "/resources" + resPath.mid(1); // cache folder plus resource without the leading :
    if(QFile::exists(subPath)) // file exists -> done
        return subPath;
    if(!QFileInfo(subPath).dir().mkpath("."))
        return ; //failed to create dir
    if(!QFile::copy(resPath, subPath))
        return ; //failed to copy file
    // make the copied file writable
    QFile::setPermissions(subPath, QFileDevice::ReadUser | QFileDevice::WriteUser);
    return subPath;

简而言之,它会将资源复制到缓存位置(如果该位置尚不存在)并返回该缓存资源的路径。需要注意的一点是,复制操作保留了“只读”权限,这意味着我们必须手动设置权限。如果您需要不同的权限(即执行或访问组/全部),您可以调整该行。

在你的代码中,你会改变这一行:

QFile file(cachedResource(":/texts/test.txt"));

【讨论】:

谢谢 一直在想,修改后能不能把复制的换成原来的? 如前所述 - 不。不可能替换可执行文件中的原始版本(从技术角度来看) - 这就像在驾驶汽车时更换轮胎......但是这个解决方案具有相同的目的 - 除非您想要一个便携式应用程序。 (在这种情况下,将文件缓存到二进制文件所在的同一文件夹中)

以上是关于写入文本文件错误,QT的主要内容,如果未能解决你的问题,请参考以下文章

Qt (C++):QFile 成功创建文本文件但不写入

Qt--文本流和数据流缓冲操作和数据操作

QT读取文本文件

Qt中如何将信息保存到文本文件并且保留原来的信息,比如在原来的文本文件中添加一行信息。

将胶水pyspark错误写入文本文件

写入文本文件时出现“文件正在使用”错误