c ++ ifstream, определить, является ли письмо или EOLine?
Вопрос
У меня есть эта функция для чтения всех целых чисел из файла.Проблема в том, что когда я читаю письма, я запускаю новую строку и всегда ищу по 1, а не до конца строки.Как я могу лучше написать эту функцию?
int v;
while (!in.eof())
{
while (in >> v)
cout << v << " ";
cout << endl;
if (in.eof())
break;
in.clear();
in.seekg(1, ios::cur);
int a;
a=0;
}
Решение
Если ваш файл состоит только из целых чисел, разделенных пробелами (включая), то это должно быть достаточно.
while( in >> v )
{
// do something with v
}
Если после файла значение in.fail () равно false, а in.eof () - значение true, вы достигли конца файла без ошибки форматирования. В противном случае произошла ошибка чтения int.
Если вы получили неверный ввод и хотите восстановить данные, вам нужно решить, как вы хотите восстановить. Если вы хотите пропустить до конца строки и снова начать синтаксический анализ, вы можете использовать что-то вроде этого.
in.clear();
in.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );
Другие советы
Первая проблема приведенный выше код не заканчивается в конце строки.
Оператор>>() игнорирует "Символы пробела" который включает в себя символ новой строки.
Как это можно написать лучше?
Это трудно сказать, не зная, что вы пытаетесь сделать с числами и каков формат ввода файла!
Но если бы я писал это, я бы написал это без использования этих строк:
if (in.eof())
break;
in.clear();
in.seekg(1, ios::cur);
При обработке форматированного текстового файла редко можно увидеть использование функции seek().
Предполагать:
Файл содержит только цифры.
Вы хотите считывать все числа в контейнер.
std::vector<int> data;
std::copy( std::istream_iterator<int>(in), // An iterator from current point
std::istream_iterator<int>(), // To end of file.
std::inserter(data) // Destination (insert into data)
);