我正在读取空格/换行符分隔数字的文件。尝试使用stringstreams和ifstreams之后,就简单性,可读性或效率而言,C ++在fopen和fscanf方面的改进并没有太多改进。
稳健性如何?因为我检查fscanf返回了我期望的项目数,这似乎不是问题。我能想到的唯一好处是stringstream为你提供了更多的选择来处理失败。
以下是使用fscanf的简单示例:
FILE * pFile;
pFile = fopen ("my_file.txt","r");
if( pFile == NULL ) return -1;
double x,y,z;
int items_read;
while( true )
{
items_read = fscanf( pFile, "%lf %lf %lf", x, y, z );
if( items_read < 3 ) break; // Checks for EOF (which is -1) or reading 1-2 numbers
std::cout << x << " " << y << " " << z << "\n";
}
注意:为了提高安全性,可以在Visual Studio中用fopen_s / fscanf_s替换fopen / fscanf。
答案 0 :(得分:1)
根据我的经验,C和C ++都不能为您提供“容忍白痴用户的强大输入”。
对于“形式良好的输入就足够了,可以在输入中说'输入错误,请修复它'......”,但不适用于需要仔细检查所有内容的强大情况(例如有人放两个而不是一行中有三个数字,所以其余的数据都很乐意加入,但现在所有z
值都是x
值,其他所有值都是“移位一个”。
在这种情况下,你需要编写一些函数来通过读取一行进行适当的检查,检查它是否可以从该行中取出三个数字 - 或类似的东西。您可能会发现使用stringstream
或类似内容足以检查行上有三个有效数字,但只使用f >> x >> y >> z;
显然会导致下一行用于满足丢失的内容在这条线上。