Аналог ferror(FILE *) для istringstream?

В настоящее время я пытаюсь перенести код из разбора файла с использованием 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. Может ли кто-нибудь помочь мне с этим?

Себастьян


person steigers    schedule 04.05.2011    source источник
comment
char cchar = iss.get(); int c = int(cchar); никогда не может устанавливать c в EOF, в зависимости от подписи char.   -  person Fred Foo    schedule 04.05.2011
comment
В моем примере было достигнуто EOF - но, возможно, это не пуленепробиваемо. Означает ли это, что я могу заменить if (EOF==c) на if (iss.eof()) и вообще пропустить второй тест, чтобы добиться того же, что и в C-версии?   -  person steigers    schedule 04.05.2011


Ответы (2)


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

person Jerry Coffin    schedule 04.05.2011

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

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

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

person Community    schedule 04.05.2011