Ваша проблема вызвана тем, что внутри потока установлен бит Bad.
Операции с потоком будут игнорироваться до тех пор, пока бит Bad не будет сброшен.
// After the loop reset the Bad Bits.
m_fileIn.clear()
Примечание. Плохой бит — это одно из многих состояний ошибки, включая EOF.
Но это не ваши основные проблемы:
Вы используете Classic anti pattern
для чтения файла:
Лучше используйте это.
while (getline (m_fileIn,lineRead))
{
int lineID = getLineID(lineRead);
if(lineID==1) //if its an STRM
{
//save the index
}
}
Проблема в том, что EOF не устанавливается до тех пор, пока вы не прочитаете его.
Последнее действительное чтение читается UPTO, но не после EOF (поэтому EOF не установлен).
Итак, рассмотрим ситуацию, когда вы прочитали последнюю строку в файле. EOF не был установлен, так как вы его не прочитали. Итак, петля введена. Теперь вы выполняете getline(). Это пытается прочитать прошлое EOF, поскольку нет абсолютно никаких данных для чтения (ни одного байта). Таким образом, getline() терпит неудачу, теперь вы вызываете getlineID(), используя lineRead, значение которого неопределенно (стандарт не говорит, что происходит с lineRead при выполнении условия EOF; но он, вероятно, имеет значение последней прочитанной строки, поскольку вы не кажетесь чтобы сбросить его внутри цикла).
Другая проблема с этим кодом заключается в том, что он проверяет только EOF. Что происходит, когда возникает ошибка другого типа? Цикл фактически застревает в бесконечном цикле; это связано с тем, что при установке флага ошибки чтение больше не происходит, поэтому вы никогда не сможете добраться до EOF.
while (! m_fileIn.eof())
{
getline (m_fileIn,lineRead)
int lineID = getLineID(lineRead);
if(lineID==1) //if its an STRM
{
//save the index
}
}
Решение состоит в том, чтобы выполнить операцию чтения в цикле while. Это работает, потому что getline() возвращает поток, переданный в качестве первого параметра. Поэтому поток используется в логическом контексте. Когда поток используется в логическом контексте, он преобразуется в тип, который можно использовать как логический; значение этого объекта эквивалентно true, если ошибок нет, и false в противном случае.
В этой ситуации предпринимается попытка чтения, но если это не удается, цикл никогда не запускается.
person
Martin York
schedule
31.08.2010