我正在尝试从文件中读取数据而感到困惑。该文件包含三列数据。使用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);
如果有人可以告诉我我做错了什么,那将会非常有帮助。
答案 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,它不会在二进制文件中进行短读取模式除非到达文件末尾。)