Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用C+;读取格式化数据的最简单/最清晰的方法+;_C++_Scanf - Fatal编程技术网

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

C++ 用C+;读取格式化数据的最简单/最清晰的方法+;,c++,scanf,C++,Scanf,我正在读一个空格/换行符分隔的数字文件。在尝试STRIGSTROW和IFS之后,C++在简单、可读性和效率方面对FOpenD和FSCANF的改进没有很大的提高。 那么健壮性呢?因为我检查了fscanf是否返回了我期望的项目数,所以这似乎不是问题。我能想到的唯一好处是stringstream为您提供了更多处理失败的选项 下面是一个使用fscanf的快速示例: 文件*pFile; pFile=fopen(“my_file.txt”、“r”); if(pFile==NULL)返回-1; 双x,y,z;

我正在读一个空格/换行符分隔的数字文件。在尝试STRIGSTROW和IFS之后,C++在简单、可读性和效率方面对FOpenD和FSCANF的改进没有很大的提高。 那么健壮性呢?因为我检查了fscanf是否返回了我期望的项目数,所以这似乎不是问题。我能想到的唯一好处是stringstream为您提供了更多处理失败的选项

下面是一个使用fscanf的快速示例:

文件*pFile;
pFile=fopen(“my_file.txt”、“r”);
if(pFile==NULL)返回-1;
双x,y,z;
整数项(u read);;
while(true)
{
项目读取=fscanf(文件,“%lf%lf%lf”,x,y,z);
如果(项读取<3)中断;//检查EOF(为-1)或读取1-2个数字

STD::在我的经验中,C和C++都没有提供“容忍白痴用户的强健输入”。 它适用于“格式良好的输入,可以说‘输入中有错误,请修复’…”,但不适用于需要仔细检查所有内容的健壮情况(例如,有人将两个而不是三个数字放在一行上,这样就可以愉快地接受其余的全部数据,但现在所有的
z
值实际上都是
x
值,其他所有值都是“移位一”)


在这种情况下,您确实需要编写一些函数,通过读取一行来执行适当的检查,检查它是否可以从该行中提取三个数字——或者类似的内容。您可能会发现,使用
stringstream
或类似的方法足以检查该行中是否有三个有效数字,但只需使用u唱<代码> f> x> >y> z;显然会导致下一行被用来满足这一行中缺失的任何内容。

< P>我的经验中,C和C++都不允许你“容忍强盗用户的强健输入”。 它适用于“格式良好的输入,可以说‘输入中有错误,请修复’…”,但不适用于需要仔细检查所有内容的健壮情况(例如,有人将两个而不是三个数字放在一行上,这样就可以愉快地接受其余的全部数据,但现在所有的
z
值实际上都是
x
值,其他所有值都是“移位一”)


在这种情况下,您确实需要编写一些函数,通过读取一行来执行适当的检查,检查它是否可以从该行中提取三个数字——或者类似的内容。您可能会发现,使用
stringstream
或类似的方法足以检查该行中是否有三个有效数字,但只需使用u唱
f>>x>>y>>z;
显然会导致使用下一行来满足这一行中缺少的任何内容。

您希望每行读取三个
double
值吗?还是一次只读取三个,不考虑每行有多少?除了这些数据之外,还有其他您感兴趣的数据吗在标准C+C++中没有这样的函数,如代码> fOpenys/fSCANFFIs。IoSokes是类型安全的(在您的代码中,使用%F为双,这已经是一个错误)。.为什么不使用stringstream?@Lol4t0,很好。我正要说编译器检查类型安全性对我来说不是那么重要,直到你对我的“类型输入错误”发表评论!@cf16,我的问题是,在这种情况下为什么要麻烦呢?您希望每行读取三个
double
值吗?还是一次只读取三个,而不考虑每行有多少个值?除了这些数据之外,还有其他数据您有兴趣从文件中吸取吗?在s中没有类似的功能,例如
fopen_s/fscanf_s
标准的C.C++。IoSokes是类型安全的。(在代码中,你使用%F为两倍,这已经是一个错误)。为什么不使用StrugSuffel.@ LoL4T0,好的捕捉。我要说的是,在你评论我的“类型键入”之前,编译器检查类型安全对我来说不是很重要。!@cf16,我的问题是,在这种情况下为什么要麻烦呢?同意-我提到了错误处理是
stringstream
的主要论点。实际上,疯狂的问题是:为我构建一个可以做所有事情的程序。总是有一些假设、限制Sagreed-我还提到了错误处理是
stringstream
的主要论点,疯狂的问题:给我建立一个可以做任何事情的程序。总是有一些假设,限制