【问题标题】:qt file readline always returning -1 on second readqt 文件 readline 在第二次读取时总是返回 -1
【发布时间】:2013-08-13 10:47:42
【问题描述】:

所以我有一个每次都需要检查的单词列表。我尝试使用以下代码执行此操作:

bool woordenKloppen=true;

//doorloop alle woorden in de array
for (int i=0;i<woordenlijst.size();i++)
{
    m_woordenlijst->open(QIODevice::ReadOnly);
    m_woordenlijst->reset();

    char buffer[1024];
    qint64 lineLength = m_woordenlijst->readLine(buffer, sizeof(buffer));

    //zoek in de woordenlijst zolang het woord niet gevonden is en de woordenlijst niet gedaan is
    while (lineLength!=-1 && woordKlopt==false)
    {
        QString vergelijkWoord=QString(buffer);

        lineLength = m_woordenlijst->readLine(buffer, sizeof(buffer));

        //verwijder de return en newline characters van het woord in de file
        vergelijkWoord.remove(vergelijkWoord.length()-2,2);

        //het woord klopt indien het in de woordenlijst staat
        if (woord==vergelijkWoord)
        {
            woordKlopt=true;
        }
    }
    if (!woordKlopt)
    {
        woordenKloppen=false;
    }

    //sluit de woordenlijst
    m_woordenlijst->close();
}

//return true als alle woorden klopten, anders false
return woordenKloppen;

每次第一次调用该函数时,这似乎都有效。第二次 lineLength 将为-1,他将跳过循环。我错过了什么吗?提前致谢

文本文件如下所示,每行只有一个单词:

aalfuiken
aalgeer
aalgeren
aalglad
aalgladde
aalkorf
aalkorven
aalkuip
aalkuipen
aalmoes
aalmoezen
aalmoezenier
aalmoezeniers
aalmoezenierskamer
aalmoezenierskamers
aalpomp
aalpompen
aalput
aalputten

【问题讨论】:

  • 在进入 while 循环之前,您是否将 woordKlopt 设置为 false?你绝对确定readLine 返回-1
  • 是的,woordklopt 在循环之前被初始化为 false,是的,我调试了它,它说 -1

标签: c++ qt file io readline


【解决方案1】:

问题是行尾。在文件中,您的行以 Windows 样式“\r\n”结尾,并且您正在以二进制模式阅读。要修复它正确打开文件的方式:

m_woordenlijst->open(QIODevice::ReadOnly | QIODevice::Text);


题外话: 在 qt 中读取文本文件的最佳方法是使用 QTextStream。

【讨论】:

  • 以这种方式打开它返回错误,知道可能是什么原因吗?
  • 这一行是从 QFile 的文档中复制粘贴。我一直使用 QTextStream 并且从未遇到过这样的问题,您正在手动将 char* 转换为 QString,因此您也应该使用 QTextStream。维护文件编码会更容易(如果您支持某些带有重音字母或非拉丁字母的语言,这一点很重要)。
  • 我一直遇到同样的问题,即使使用 QTextStream。 atEnd() 函数仅在我第一次调用该函数时返回 false :S
【解决方案2】:

如果无法读取一行但没有发生错误,则此函数 返回0。如果发生错误,此函数返回长度 可以读取什么,如果什么都没有读取,则为 -1。

errorString() 告诉你什么?

【讨论】:

  • 所以没有发生错误。这是你的数据。也许它不是文本。或者它只包含一行。
  • 不,它包含很多行一个单词 :S 就像我说的,第一个函数调用总是有效,但在第二个它返回 -1 :S
  • 我没有在您的代码中看到错误。 errorString() 中的“未知错误”通常意味着没有错误。也许您文件中的“字符串”不以“\n”结尾。很难说。尝试使用 atEnd() 和 canReadLine() 方法获取更多信息。
  • atEnd() 在第一次读取后返回 true :S 并且 canreadline 在第一次读取时返回 true 然后也返回 false :S
  • 将 QIODevice::Text 添加到您的 open()。我的最后一个想法。 :-/
【解决方案3】:

我认为这不是正确的方法,但不关闭文件似乎可以解决问题:S

【讨论】:

  • 这没有意义。至少不是您在此处向我们展示的代码 sn-p。上面的代码是否在另一个循环中?我强烈建议不要关闭文件并忽略问题。这样的事情迟早会咬你。
  • 是的,上面的代码在另一个循环中,因为要检查多个单词,唯一变化的变量是 word :S
  • 我想问题出在您向我们展示的内容之前。我在这里读到的任何东西都无法解释这种奇怪的行为。
  • 这很奇怪。这个 for 循环没有任何意义。您正在做(或尝试做)x 次完全相同的事情:打开文件,将其重置为开头,读取行,关闭文件。打开完全相同的文件,将其重置为开始,读取完全相同的行。这似乎是错误的逻辑,但我承认,目前我不明白这是如何导致您看到的问题。
  • 是的,我只想检查单词是否在同一个列表中,我想您可以一次检查所有单词,但我认为这不是问题
猜你喜欢
  • 2010-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-13
  • 2022-01-11
  • 2023-03-13
相关资源
最近更新 更多