这些代码块之间有什么不同。我试图搜索“wb”,但没有在任何地方看到它。包含“wb”的文件来自我的导师
FILE *f = fopen(DB_FILE_NAME, "wb");
if (f == NULL) {
printf("Write error\n");
} else {
/* write n_students elements of the studentlist array */
fwrite(studentlist, sizeof(student_t), n_students, f);
fclose(f);
}
和
FILE *f = fopen(DB_FILE_NAME, "w");
if (f == NULL) {
printf("Write error\n");
} else {
/* write n_students elements of the studentlist array */
fwrite(studentlist, sizeof(student_t), n_students, f);
fclose(f);
}
答案 0 :(得分:7)
绝对 fopen()
函数上的任何引用会告诉你这个。例如manual page,它是类Unix环境中使用的通用文档:
模式字符串还可以包含字母' b'要么作为最后一个角色 或者作为任何两个字符中的字符之间的字符 上面描述的字符串这完全是为了与C89兼容 没有效果; ''在所有符合POSIX的系统上被忽略, 包括Linux。 (其他系统可能会处理文本文件和二进制文件 不同的是,添加''如果你做一个I / O,可能是个好主意 二进制文件,并期望您的程序可以移植到非UNIX 环境。)
因此,它代表 b inary并且有助于表明您打算将文件的内容视为不是文本。
对于您的代码,二进制访问似乎是正确的。但是,直接编写原始struct
值通常是一个非常糟糕的主意,因为您不知道编译器使用的确切内部格式,并且它可能会意外更改。对于应该共享和/或访问的文件"稍后",这不是在C中执行此操作的正确方法。查看序列化。
答案 1 :(得分:5)
在访问模式下指定\n
会阻止(某些实现)标准库在读取/写入文件时翻译几个字符。
最常见的翻译是针对行尾:\r\n
在Windows中被翻译为Tags
。
答案 2 :(得分:3)
使用上面的模式说明符,文件将作为文本文件打开。为了将文件作为二进制文件打开," b"字符必须包含在模式字符串中。这个额外的" b"字符可以附加在字符串的末尾(从而产生以下复合模式:" rb"," wb"," ab"," r + b"," w + b"," a + b")或插入字母和" +"签署混合模式(" rb +"," wb +"," ab +")。