首先我有这个:
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
如果两次都做同样的事情那么旗帜是什么意思?
答案 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>