写入文本文件错误,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的主要内容,如果未能解决你的问题,请参考以下文章