2015-02-02 3 views
0

см. Ниже C++. Его суть состоит в том, чтобы хранить переменные во входном файле («is») для глобальных массивов. Я прохожу через отладчик с часами на переменной «temp» (первый оператор if работает нормально), и после прочтения первой строки входного файла переменная temp больше не обновляется.Данные не корректно считываются из входного файла

Файл указан в определенном формате, поэтому он должен считывать int, хотя в конечном итоге я добавил символ в конце инструкции KEYFRAME if, чтобы узнать, читает ли он символ конца (это не так).

Каковы возможные причины для этого? Спасибо огромное!

void readFile(istream& is){ 
     string next; 
     int j = 0; 
     int i = 0; 
    while (is){ 
    for (int i = 0; i < F; i++){ 
      is >> next; 
      if (next == "OBJECT") 
      { 

       int num; 
       is >> num; 
       string name; 
       is >> name; 
       objects[j].objNum = num; 
       objects[j].filename = name; 
       j++; 
      } 
      else if (next == "KEYFRAME"){ 
       int k; 
       int temp; 
       is >> k; 
       int time; 
       is >> time; 
       objects[k].myData[time].setObjNumber(k); 
       objects[k].myData[time].setTime(time); 
       is >> temp; 
       objects[k].myData[time].setPosition('x', temp) ; 
       is >> temp; 
       objects[k].myData[time].setPosition('y', temp); 
       is >> temp; 
       objects[k].myData[time].setPosition('z', temp); 
       is >> temp; 
       objects[k].myData[time].setRotation('x', temp); 
       is >> temp; 
       objects[k].myData[time].setRotation('y', temp); 
       is >> temp; 
       objects[k].myData[time].setRotation('z', temp); 
       is >> temp; 
       objects[k].myData[time].setScaling('x', temp); 
       is >> temp; 
       objects[k].myData[time].setScaling('y', temp); 
       is >> temp; 
       objects[k].myData[time].setScaling('z', temp); 
       char get; 
       is >> get; 
      } 
      else { 
       cout << "Error reading input file"; 
       return; 
      } 

     } 
    } 
} 
+0

Можете ли вы разместить пример ввода? –

+0

Возможно, вы пытаетесь проанализировать 'int', но файл в этой точке имеет некоторое нечисловое значение, тогда поток застрял в состоянии ошибки. Попробуйте проверить свои конверсии, например. '#define ASSERT (X) do {if (! X) {std :: cerr <<"! "#X" \ n "; выход (1); } while (false) 'then' ASSERT (is >> whatever); 'каждый раз - по крайней мере, он распечатает сообщение, показывающее вам, что ошибка конверсии .... –

ответ

0

Наиболее распространенные причины, почему std::istream «s operator>> не обновляет переменную может быть продемонстрировано с помощью следующего простого примера:

#include <sstream> 
#include <iostream> 

int main() { 

    std::string sample_input="1 2 3 A 4 5"; 

    std::istringstream i(sample_input); 

    int a=0, b=0, c=0, d=0; 
    std::string e; 
    int f=0; 

    i >> a >> b >> c >> d >> e >> f; 

    std::cout << a << std::endl; 
    std::cout << b << std::endl; 
    std::cout << c << std::endl; 
    std::cout << d << std::endl; 
    std::cout << e << std::endl; 
    std::cout << f << std::endl; 
} 

Результирующий выходной сигнал от этой программы является:

1 
    2 
    3 
    0 

    0 

Этот пример приводит к ошибке преобразования для четвертого параметра. Как только operator>> встретит ошибку преобразования форматирования, в потоке установлен бит ошибки, что предотвращает дальнейшие преобразования.

При использовании operator>> необходимо проверить ошибки преобразования после при каждом преобразовании формата ввода и при необходимости сбросить состояние потока.

Итак, ваш ответ заключается в том, что у вас есть ошибка преобразования ввода где-то. Обычно я избегаю использования operator>>. Это нормально для простых ситуаций, когда вход известен, и нет никакой возможности плохого ввода. Но как только вы попадаете в ситуацию, когда вам может потребоваться потенциальная обработка плохого ввода, использование operator>> становится болезненным, и гораздо лучше использовать другой подход для анализа потока на основе ввода.

+0

Спасибо! Это была очень полезная информация – ellen

Смежные вопросы