ifstream, конец строки и переход к следующей строке? - PullRequest
9 голосов
/ 25 января 2009

как мне обнаружить и перейти к следующей строке, используя std :: ifstream?

void readData(ifstream& in)
{
    string sz;
    getline(in, sz);
    cout << sz <<endl;
    int v;
    for(int i=0; in.good(); i++)
    {
        in >> v;
        if (in.good())
            cout << v << " ";
    }
    in.seekg(0, ios::beg);
    sz.clear();
    getline(in, sz);
    cout << sz <<endl; //no longer reads
}

Я знаю, что хорошо скажет мне, если произошла ошибка, но поток больше не работает, как только это произойдет. Как я могу проверить, нахожусь ли я в конце строки, прежде чем читать другой int?

Ответы [ 2 ]

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

Используйте ignore (), чтобы игнорировать все до следующей строки:

 in.ignore(std::numeric_limits<std::streamsize>::max(), '\n')

Если вам нужно сделать это вручную, просто проверьте другой символ, чтобы увидеть, является ли '\ n'

char next;
while(in.get(next))
{
    if (next == '\n')  // If the file has been opened in
    {    break;        // text mode then it will correctly decode the
    }                  // platform specific EOL marker into '\n'
}
// This is reached on a newline or EOF

Вероятно, это сбой, потому что вы выполняете поиск, прежде чем очищать плохие биты.

in.seekg(0, ios::beg);    // If bad bits. Is this not ignored ?
                          // So this is not moving the file position.
sz.clear();
getline(in, sz);
cout << sz <<endl; //no longer reads
3 голосов
/ 25 января 2009

Вы должны очистить состояние ошибки потока с помощью in.clear(); после цикла, тогда поток будет работать снова, как если бы не было ошибки.

Вы также можете упростить ваш цикл до:

while (in >> v) {
  cout << v << " ";
}
in.clear();

Извлечение потока возвращается, если операция прошла успешно, поэтому вы можете проверить это напрямую, без явной проверки in.good();.

...