c ++ ifstream, определить, буква или EOLine? - PullRequest
0 голосов
/ 25 января 2009

У меня есть эта функция, чтобы прочитать все целые из файла. Проблема в том, что когда я читаю буквы, я запускаю новую строку и всегда ищу 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;
    }

Ответы [ 2 ]

3 голосов
/ 25 января 2009

Если ваш файл состоит только из целых чисел, разделенных пробелами (включая), то это должно быть достаточно.

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' );
1 голос
/ 25 января 2009

Первая проблема: приведенный выше код не останавливается в конце строки.
Оператор >> () игнорирует " Символы пробела ", которые включают символ новой строки.

Как это можно написать лучше?
Трудно сказать, не зная, что вы пытаетесь сделать с числами и каков формат ввода файла!

Но если бы я писал это, я написал бы это без использования этих строк:

    if (in.eof())
            break;
    in.clear();
    in.seekg(1, ios::cur);

При обработке форматированного текстового файла редко можно увидеть использование seek ().

Assumign:
Файл содержит только цифры.
Вы хотите прочитать все числа в контейнер.

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)
         );
...