无论标志如何,来自二进制的fread返回相同的内容

时间:2014-01-29 15:03:58

标签: c

首先我有这个:

int main (void)
{
   int m = 10;
   double x[3] = {1.5, -3.5, 3.25};

   int n1, n2; FILE *izTok;
   izTok = fopen ("podaci.bin", "wb");

   n1 = fwrite (&m, sizeof(m), 1, izTok);
   n2 = fwrite (x, sizeof(x[0]), 3, izTok);
   fclose(izTok);

   return 0;
}

然后我尝试用

读取它
   FILE *stream;
   stream = fopen("podaci.bin", "r");

   n1 = fread(&n, sizeof(n), 1, stream);
   n2 = fread(arr, sizeof(arr[0]), 3, stream);

   printf("%d %f %f %f", n, arr[0], arr[1], arr[2]);

而不管我是否把

 stream = fopen("podaci.bin", "r");

 stream = fopen("podaci.bin", "rb");

输出相同

 10 1.500000 -3.500000 3.250000

如果两次都做同样的事情那么旗帜是什么意思?

3 个答案:

答案 0 :(得分:3)

在所有POSIX系统上,b标志被忽略,没有任何意义。来自Linux系统上的man 3 fopen

  

模式字符串也可以包含字母'b'作为最后一个   字符或任何字符之间的字符   上面描述的双字符串。这是严格的   与C89的兼容性并没有效果; 'b'被忽略了   所有符合POSIX标准的系统,包括Linux。 (其他系统   可能会以不同方式处理文本文件和二进制文件,并添加   如果你对二进制文件执行I / O并期望,'b'可能是个好主意   您的程序可能已移植到非UNIX环境。)

在Windows上,b表示数据未经更改即可读取。否则,启用文本模式,其描述为here。其中,行结尾被转换,CTRL + Z被解释为文件结尾。

答案 1 :(得分:1)

文本和二进制文件之间的区别取决于您的系统。许多* nixes指出,在这些系统上,它们之间没有区别。在文本模式下,Windows将在" \ n"之间进行转换。和" \ r \ n" (写入时添加一个字节,读取时减去)。如果您的二进制数据中没有这些字节,那么您也不会注意到它们之间存在差异。

答案 2 :(得分:1)

标志的要点是某些操作系统以不同方式处理文本和二进制流。你的可能没有。但它仍然可能:如果二进制值的double值包含值为'\ r'的字节,您可能会惊讶地发现您读取的数字取决于您是使用“r”还是“rb”来打开文件。 / p>