Visual c++ _read和fscanf之间的差异

Visual c++ _read和fscanf之间的差异,visual-c++,scanf,Visual C++,Scanf,我试图从一个文件中读取数据,但感到困惑。该文件包含三列数据。通过fscanf,它给出了正确的值 FILE* fp = fopen("test.txt"); double buffer[3]; fscanf(fp,"%lf %lf %lf",&buffer[0],&buffer[1],&buffer[2]); 现在我尝试使用_read读取相同的值集。这给了我所有错误的值 int fh; char buffer[50]; _sopen_s( &fh,CStringA

我试图从一个文件中读取数据,但感到困惑。该文件包含三列数据。通过fscanf,它给出了正确的值

FILE* fp = fopen("test.txt");
double buffer[3];
fscanf(fp,"%lf %lf %lf",&buffer[0],&buffer[1],&buffer[2]);
现在我尝试使用_read读取相同的值集。这给了我所有错误的值

int fh;
char buffer[50];
_sopen_s( &fh,CStringA(PointFile),_O_RDONLY|_O_BINARY,_SH_DENYNO,0);
_read(fh,buffer,sizeof(double)*3);

如果有人能告诉我我做错了什么,那将非常有帮助

第一个代码片段读取
double
s的文本表示并转换它们。这就是
*scanf
函数系列所做的

有效输入示例:

1.0 2.7182818 3.14159265358
第二个代码段从文件中读取一些(可能是24)字节,而不进行解析或转换。您没有演示如何从缓冲区提取双倍。类似于
*(double*)buffer
(获取第一个值)的东西是可以预期的,如果您的文件中有3个平台特定的double的“dump”(转储),并且使用适当的
fwrite
\u write
创建,则这是正确的(模对齐问题,但与您的平台无关)

示例有效输入(十六进制转储,假设64位IEEE浮点):


(如果您使用的是POSIX read,这里会有一个关于短读可能性的警告。但是,
\u read
\u s\u open
建议使用Microsoft CRT,并且除非到达文件末尾,否则它不会以二进制模式进行短读)。

非常感谢。我现在明白了。
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00