1

我正在读取空格/换行符分隔的数字文件。在尝试了 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/fscanf 替换为 fopen_s/fscanf_s。

4

1 回答 1

1

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

它适用于“格式良好的输入,可以说‘你的输入有问题,请修复它’......”,但不适用于需要仔细检查所有内容的稳健情况(例如,有人输入两个而不是三个数字在一条线上,所以其余的数据都被愉快地接受了,但是现在你所有的z值实际上都是x值,其他的都是“移位的”)。

在这种情况下,您确实需要编写一些函数,通过读取一行来进行适当的检查,检查它是否可以从该行中获取三个数字 - 或类似的东西。您可能会发现 usingstringstream或类似的东西足以检查该行上是否存在三个有效数字,但仅 usingf >> x >> y >> z;显然会导致下一行用于满足该行中缺少的任何内容。

于 2013-05-02T17:30:05.143 回答