Не могу прочитать входной файл, если поток - PullRequest
1 голос
/ 22 июля 2011

Я пытаюсь прочитать входной файл, отформатированный с двумя числами в строке, и сохранить первое число в строке в одном векторе, а второе число в другом векторе.

Каждая часть моего кода работает нормально, за исключением фактического чтения файла .

Я поместил couts повсюду, и похоже, что во время открытия моего файла он не читается, поэтому мои векторы продолжают заполняться, пока у меня не кончится память.

Вот часть моего кода, которая читает файл:

cout << "Input Filename: ";
cin >> input;
//open input file
inputdata.open(input.c_str());
if(!inputdata){
cerr << "Error: Unable to open file!" << endl;
}

while(!inputdata.eof()){
    counter++;
    hold = 0;
    if(counter > 0){
        inputdata >> hold;
        //cout << hold << endl;
        if(counter%2 != 0)
            data.push_back(hold);
        else
            weight.push_back(hold);
    }
}

(где counter - это целое число, инициализированное -1, поскольку в начале входного файла есть заголовок из одного слова, который мне нужно игнорировать).

Я знаю, что использование .eof() осуждается, но это не повлияет на то, что я делаю.

Кто-нибудь видит проблему в моем коде или почему он не читает файл?

Ответы [ 3 ]

1 голос
/ 22 июля 2011

Почему бы не использовать:

std::string firstword;
inputdata >> firstword; // or std::getline(inputdate, firstword);

while (inputdata >> w >> d)
{
  weight.push_back(w);
  data.push_back(d);
}

Это намного чище, поскольку данные и вес идут парами (возможно, я изменил w и d).

1 голос
/ 22 июля 2011

Неправильно использовать .eof() в цикле while.Например,

while(!inputdata.eof()){
   ... 
}

Неверно .

Это правильное использование .

if (!(cin >> foo)) {
  if (cin.eof()) {
    cout << "read failed due to EOF\n";
  } else {
    cout << "read failed due to something other than EOF\n";
  }
}

Дополнительно на C ++ FAQ, в Разделе 15.5 написано «Почему мой ввод обрабатывается после конца файла?»

Поскольку состояние eof может быть установлено только послепопытка чтения за концом файла.То есть чтение последнего байта из файла может не установить состояние eof.Например, предположим, что входной поток сопоставлен с клавиатурой - в этом случае даже для библиотеки C ++ теоретически невозможно предсказать, будет ли последний набранный символ последним символом.

Вы также должны проверить, правильно ли ваш fstream открыт, выполнив это,

if (inputdata.is_open()) { /* ok, proceed with output */ }

Выполнение if(!inputdata) не является правильной проверкой.

0 голосов
/ 22 июля 2011

"поскольку в начале входного файла есть заголовок из одного слова, который мне нужно игнорировать" Это может быть проблематично. Попытка прочитать текст с помощью целочисленных значений или чисел с плавающей точкой порождает проблемы.

Если это слово в отдельной строке, попробуйте это: http://www.cplusplus.com/reference/iostream/istream/getline/

Иначе, попробуйте прочитать первое слово с временной строкой. \

...