_read和fscanf之间的区别

时间:2013-01-14 20:33:34

标签: 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(PointFile),_O_RDONLY|_O_BINARY,_SH_DENYNO,0);
_read(fh,buffer,sizeof(double)*3);

如果有人可以告诉我我做错了什么,那将会非常有帮助。

1 个答案:

答案 0 :(得分:1)

第一个代码段读取double的文本表示并转换它们。这就是*scanf函数族的作用。

示例有效输入:

1.0 2.7182818 3.14159265358

第二个代码段从文件中读取一些(可能是24个)字节,而不进行解析或转换。您没有显示如何从缓冲区中提取双打。像*(double *)buffer(获得第一个值)这样的东西是预期的,如果你有一个“转储”3个特定于平台的双打,它会是正确的(模对齐问题,但它与你的平台无关)文件,使用适当的fwrite_write创建。

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

00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00

(如果你使用POSIX读取,这里会警告短读取的可能性。但是,_read_s_open建议使用Microsoft CRT,它不会在二进制文件中进行短读取模式除非到达文件末尾。)