Аналог для Ferror (FILE *) для istringstream? - PullRequest
1 голос
/ 04 мая 2011

В настоящее время я пытаюсь перенести код с разбора файла с помощью FILE в стиле C * на поток istringstream в стиле C ++.Моя программа работает параллельно, и я хотел бы: 1) прочитать файл только на первом ЦПУ, 2) передать содержимое в строковой форме всем другим ЦП и 3) попросить каждый ЦП проанализировать строку.

Старая версия синтаксического анализатора по существу делает следующее:

while (!done) {
    int c = fgetc(infile);
    if (EOF == c) {
        if (ferror(infile)) {
            // throw some error
        }
        return;
    }
    // continue parsing
}

infile - это ФАЙЛ *.Моя попытка конвертировать код теперь выглядит следующим образом:

while (!done) {
    char cchar = iss.get(); int c = int(cchar);
    if (EOF == c) {
        if ((iss.rdstate() & ifstream::failbit ) != 0 ) {
            // throw some error
        }
        return;
    }
    // continue parsing
}

iss - istringstream.Проблема в том, что в настоящее время ошибка всегда выдается в версии C ++ при достижении EOF.Так что у меня нет правильного аналога ferror.Кто-нибудь может мне помочь с этим?

Себастьян

Ответы [ 2 ]

1 голос
/ 04 мая 2011

Ошибка будет всегда установлена, когда вы пытаетесь что-то прочитать, но достигли конца файла.Также будет установлено , если вы попытаетесь что-то прочитать и не достигли конца файла, но данные в файле не могут быть преобразованы в целевой тип (например, вы пытаетесьпрочитайте int, но файл содержит "K").

0 голосов
/ 04 мая 2011

Если поток потерпел неудачу, и вы могли ожидать EOF, просто проверьте его:

// read stuff here
if ( iss.eof() ) {
    // failed, but eof is ok
}
else {
    // a real error
}

бит eof устанавливается только в конце файла, а не из-за других проблем.

...