Я работаю над очень простым парсером файлов 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?
istringstream
--> используйтеistr.reset()
послеistr.str(..)
. - person dyp   schedule 25.07.2013"\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.clear()
:) - person dyp   schedule 25.07.2013