考虑以下测试程序
#include <iostream>
#include <stdio.h>
using namespace std;
int main(int argc, char* argv[])
{
double a=1,c=0;
double i = a/c; // divide by 0 yields infinity
double j = a*4.5;
double k = c/c; // 0 divide 0 yields NaN
FILE * fp = fopen("ttt.txt","wt");
fprintf(fp,"%f\t%f\t%f\t",i,j,k);
fclose(fp);
double aa,bb,cc;
fp = fopen("ttt.txt","rt");
fscanf(fp,"%lf%lf%lf",&aa,&bb,&cc);
cout<<aa<<endl<<bb<<endl<<cc<<endl;
}
使用gcc编译时(我尝试过的任何平台) 使用内容
创建一个文件ttt.txtInf 4.500000 NaN
给出输出
Inf文件
4.5
为NaN
那里没有惊喜。根据C99的规则进行正确的行为,以及像Matlab这样的事情
在Microsoft Visual Studio 2008下编译相同的程序会产生一个带有内容
的文件ttt.txt1.#INF00 4.500000 -1。#IND00
并给出输出
1
-9.25596e + 061
-9.25596e + 061
这样微软C甚至无法读取它自己对Inf和NaN的描述,更不用说标准的那些,这完全是无用的 - 为什么他们以这种方式实现它完全超出我的范围。 我知道MSVcc并不完全符合C99 - 但是有没有人有任何关于如何说服它来读写这些值,编译器开关,stdio.h的另一个版本,任何东西的建议。
似乎唯一的办法是实现我自己的函数来替换fscanf和fprintf,但这似乎重新发明了轮子。我不敢相信我是第一个发现这个令人讨厌的人 - 让微软的stdio库变得毫无用处,然而谷歌却没有提出这个问题