Ошибка оператора извлечения istringstream

Я работаю над очень простым парсером файлов wavefront *.obj.

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

bool Model::loadModel(const char* fileName)
{
 std::ifstream file(fileName, std::ios::binary);

 if(file.fail())
  return false;

 std::string line;
 std::string type;
 std::istringstream istr;

 while(std::getline(file, line))
 {
  istr.str(line); 
  istr>>type;

.
.
.

Например, файл, который у меня есть, находится в первой строке:

g Дракон

поэтому в «типе» у меня хранится «g». Проблема в том, что когда я читаю следующую строку

v -0,136296 0,0938588 -0,0307373

istr, по-видимому, инициализирован, но после операции >> тип операции все еще имеет «g».

Цикл продолжается, и это значение «g» никогда не меняется.

У меня есть несколько других файлов *.obj, которые я отлично читаю, единственная разница в том, что в отладчике я вижу '\r' в конце всех строк.

Нужен ли этот символ для извлечения данных из istringstream?


person user1274605    schedule 24.07.2013    source источник
comment
Вы пытались поместить объявление istr внутри цикла while, а не снаружи?   -  person Marius Bancila    schedule 25.07.2013
comment
Вы пробовали ответить на первый вопрос на боковой панели «Связанные»? C++ - многократное использование istringstream --> используйте istr.reset() после istr.str(..).   -  person dyp    schedule 25.07.2013
comment
@Marius Bancila спасибо за ответ, это сработало!! хотя я не знаю, почему это не удалось в первую очередь. ??   -  person user1274605    schedule 25.07.2013
comment
@DyP ммм ... вы имеете в виду функцию очистки (), верно? это тоже сработало!!   -  person user1274605    schedule 25.07.2013
comment
@user1274605 user1274605 Я предполагаю, что произошло следующее: некоторые из ваших файлов имели окончание строки в стиле Windows ("\r\n"). getline читается до '\n', поэтому включает '\r', который становится последним символом в istr. Теперь, когда вы извлекаете что-то из istr, \r остается. Если в конце строки нет '\r', в какой-то момент ваше извлечение достигает конца istr, тогда устанавливается eof-бит istr. После этого любое дальнейшее извлечение из istr не удается. При вызове istr.clear() бит eof сбрасывается. istr.str(..) не очищает eof бит.   -  person dyp    schedule 25.07.2013
comment
@ user1274605 Ой, да, я имел в виду .clear() :)   -  person dyp    schedule 25.07.2013
comment
@DyP ОТЛИЧНОЕ объяснение, большое спасибо!!!   -  person user1274605    schedule 25.07.2013