【问题标题】:unable to read data form xml file using QTextStream无法使用 QTextStream 读取数据表单 xml 文件
【发布时间】:2013-10-25 11:22:58
【问题描述】:

我尝试使用 QTextStream 从 xml 文件中读取数据,但最后我得到了空字符串。 这是我的代码:

QFile f("note.xml");
if(f.open(QIODevice::ReadWrite)){
    QTextStream in(&f);
    in.setCodec("UTF-8");
    qDebug()<<in.readAll();
}else qDebug()<<"failed";

这里是xml文件的内容:

<?xml version="1.0" encoding="UTF-8" ?>
<note>
<to>George</to>
</note>

我使用的是 Qt_version 5.1.1 和 MinGW_32bit-Debug,Windows 7。如果我将 xml 文件更改为 txt 文件,结果仍然是空字符串。

【问题讨论】:

  • QFile::open 是否返回 true? f.readAll() 是否返回任何数据?
  • QFile::open reutrn true 并且f.readAll()没有返回数据
  • 确保您打开的文件存在。尝试使用QIODevice::ReadOnly 标志打开它,因为QIODevice::ReadWrite 标志在指定文件不存在时会自动创建一个空文件。
  • 现在QFile::open返回false。但我很确定文件存在。

标签: xml qt qfile qtextstream


【解决方案1】:

我认为您的问题可能与您没有将完整路径传递给 QFile 构造函数的事实有关。如果文件不在当前路径中,对 QFile::open 的调用可能会成功(可能是因为您以读写模式打开)创建一个新文件,因此读取返回一个空字符串。为避免这种情况,您可以检查文件是否存在。试着把代码改成这样:

QFile f("/complete-path/note.xml");
if(f.exists() && f.open(QIODevice::ReadWrite) {
    . . .

编辑:正如汉克刚刚在评论中建议的那样。 :)

【讨论】:

  • ReadOnly 更好,如果在exists() 和open() 之间删除文件,您可能会遇到竞争。
  • 谢谢。我使用完整的文件路径得到了正确的结果。但是我的代码文件和xml文件在同一个目录中,为什么我不能只使用文件名。
  • @camperr 您的文件必须与可执行文件位于同一目录中。
  • @hank 你的意思是文件必须和.exe文件在同一个目录吗?
  • 如果您使用的是 Qt Creator,很可能您有活动的影子构建:可执行文件位于您的项目文件的不同位置,并且很可能是您的 xml 文件。禁用影子构建或将文件复制到可执行位置(影子构建位置,通常类似于 ../&lt;yourProjectName&gt;-&lt;build-type&gt;)。
猜你喜欢
  • 1970-01-01
  • 2012-11-10
  • 2011-11-29
  • 1970-01-01
  • 1970-01-01
  • 2012-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多