我目前正在尝试将代码从使用C风格的FILE *解析为C ++风格的istringstream。我的程序并行运行,我想1)只在第一个CPU上读取文件,2)以字符串形式向所有其他CPU广播内容,3)让每个CPU解析字符串。
旧版本的解析器主要执行以下操作:
while (!done) {
int c = fgetc(infile);
if (EOF == c) {
if (ferror(infile)) {
// throw some error
}
return;
}
// continue parsing
}
infile是一个FILE *。我尝试转换代码现在如下:
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。问题是,当达到EOF时,当前在C ++版本中抛出错误总是。所以我没有正确的模拟与恐怖。任何人都可以帮我吗?
塞巴斯蒂安
答案 0 :(得分:1)
当您尝试读取但已到达文件末尾的内容时,将始终设置failbit。如果您尝试读取某些内容并且尚未到达文件末尾,则也将被设置,但文件中的数据无法转换为目标类型(例如,您尝试阅读int
,但该文件包含“K”)。
答案 1 :(得分:0)
如果流失败,并且您可能期望EOF,只需测试它:
// read stuff here
if ( iss.eof() ) {
// failed, but eof is ok
}
else {
// a real error
}
eof位仅由文件末尾设置,而不是由其他问题设置。