2013-08-13 1 views
1

поэтому у меня есть список слов, которые нужно проверять каждый раз. Я пробовал сделать это со следующим кодом:qt file readline всегда возвращает -1 во втором чтении

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; 

Это, кажется, работает каждый раз, когда вызывается функция. Во второй раз длина линии будет равна -1, и он просто пропустит цикл. Я что-то упускаю? спасибо заранее

текстового файла выглядит следующим образом, только одно слово в каждой строке:

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

Вы устанавливаете 'woordKlopt'' false' перед тем, как идти в цикл while? Вы абсолютно уверены, что 'readLine' возвращает' -1'? – thuga

+0

yes woordklopt инициализируется с ошибкой перед циклом, и да, я отлаживал его, и он говорит -1 –

ответ

0

Проблема окончания строк. В файле у вас строка заканчивается в стиле Windows «\ r \ n», и вы читаете в двоичном режиме. Чтобы исправить это исправить, как открыт файл:

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


Off Тема: лучший способ чтения текстового файла в Qt является использование QTextStream.

+0

открытие этого способа возвращает false, любая идея, что может быть причина? –

+1

Эта строка является скопированной пастой из документации QFile. Я всегда использую QTextStream и никогда не сталкивался с такими проблемами, вы конвертируете из 'char *' в 'QString' вручную, чтобы вы также должны использовать QTextStream. Будет легче поддерживать кодировку файлов (важно, если вы поддерживаете некоторые языки с акцентированными буквами или с латинским алфавитом). –

+0

У меня такая же проблема, даже с QTextStream. Функция atEnd() возвращает только false, когда я вызываю функцию в первый раз: S –

0

Если строка не может быть прочитан, но не ocurred никакой ошибки, эта функция возвращает 0. Если ошибка эта функция возвращает длину , что можно прочитать, или -1, если ничего не было прочитано.

Что вы скажете errorString()?

+0

. Он говорит о неизвестной ошибке: S –

+0

Таким образом, ошибка не возникала. Это ваши данные. Возможно, это не текст. Или он содержит только одну строку. – Greenflow

+0

Нет в нем много строк одного слова: S, как я уже сказал, первый вызов функции всегда работает, но во втором он возвращает -1: S –

0

Я не думаю, что это правильный путь, но не закрывает файл, казалось, решить эту проблему: S

+0

Это не имеет смысла. По крайней мере, не с фрагментом кода, который вы показываете нам здесь. Является ли код выше себя в другом цикле? Я настоятельно рекомендую просто не закрывать файл и игнорировать проблему. Что-то вроде этого ** ** укусит вас рано или поздно. – Greenflow

+0

Да, приведенный выше код находится в другом цикле, потому что нужно проверять несколько слов, единственная изменяемая переменная - woord: S –

+0

Я полагаю, что раньше проблема заключалась в том, что вы показали нам. Ничто из того, что я читаю здесь, не может объяснить такое странное поведение. – Greenflow