Рассмотрим следующую тестовую программу
#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.txt с содержимым
Inf 4.500000 NaN
дает вывод
Инф4.5NaN
Никаких сюрпризов.Правильное поведение в соответствии с правилами C99 и такими вещами, как Matlab
Компиляция той же программы в Microsoft Visual Studio 2008, однако, дает файл ttt.txt с содержимым
1. # INF00 4.500000 -1. # IND00
и дает вывод
1-9.25596e + 061-9.25596e + 061
Так что Microsoft C не может даже прочитать свои собственные представления Inf и NaN, не говоря уже о стандартных, что совершенно бесполезно - любая причина, по которой они так это реализовали бы, совершенно мне не подходит.Я знаю, что MSVcc не полностью совместим с C99 - НО у кого-нибудь есть предложения о том, как убедить его прочитать и записать эти значения, переключатели компилятора, другую версию stdio.h, что угодно.
Похоже, чтоЕдинственный способ обойти это - реализовать мои собственные функции для замены fscanf и fprintf, но это похоже на переизобретение колеса.Я не могу поверить, что я первый, кто нашел это раздражающим - вплоть до того, чтобы сделать библиотеку stdio Microsoft бесполезной, и все же Google ничего не поднимает по этому вопросу