【问题标题】:fread from binary returns the same regardless of flags [duplicate]无论标志如何,来自二进制的 fread 返回相同 [重复]
【发布时间】:2014-02-21 11:29:54
【问题描述】:

首先我有这个:

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

如果两次都做同样的事情,标志的意义何在?

【问题讨论】:

    标签: c


    【解决方案1】:

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

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

    在 Windows 上,b 表示数据被原样读取。否则,使用文本模式,描述为here。其中,行尾被转换,CTRL+Z 被解释为文件结尾。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-11-24
          • 2012-07-27
          • 1970-01-01
          • 2013-04-18
          • 2019-03-18
          • 1970-01-01
          • 2014-06-10
          • 1970-01-01
          相关资源
          最近更新 更多