c ++ ifstream, определить, является ли письмо или EOLine?

StackOverflow https://stackoverflow.com/questions/477427

  •  20-08-2019
  •  | 
  •  

Вопрос

У меня есть эта функция для чтения всех целых чисел из файла.Проблема в том, что когда я читаю письма, я запускаю новую строку и всегда ищу по 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)
         );
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top