在C ++中读取格式化数据的最简单/最清晰的方法

时间:2013-05-02 17:11:02

标签: c++ scanf

我正在读取空格/换行符分隔数字的文件。尝试使用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。

1 个答案:

答案 0 :(得分:1)

根据我的经验,C和C ++都不能为您提供“容忍白痴用户的强大输入”。

对于“形式良好的输入就足够了,可以在输入中说'输入错误,请修复它'......”,但不适用于需要仔细检查所有内容的强大情况(例如有人放两个而不是一行中有三个数字,所以其余的数据都很乐意加入,但现在所有z值都是x值,其他所有值都是“移位一个”。

在这种情况下,你需要编写一些函数来通过读取一行进行适当的检查,检查它是否可以从该行中取出三个数字 - 或类似的东西。您可能会发现使用stringstream或类似内容足以检查行上有三个有效数字,但只使用f >> x >> y >> z;显然会导致下一行用于满足丢失的内容在这条线上。