这些代码块之间有什么不同。我试图搜索“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);
}
4条答案
按热度按时间zed5wv101#
在访问模式中指定
"b"
可以防止标准库(的某些实现)在阅读/写入文件时转换一些字符。\n
在Windows中转换为\r\n
。*gorkyyrv2#
绝对 * 任何 * 关于
fopen()
函数的引用都会告诉你这一点。例如manual page,它是类Unix环境中使用的常见文档:模式字符串也可以包括字母'B',作为最后一个字符或作为上述任何两个字符串中字符之间的字符。在所有符合POSIX的系统上,包括Linux,'B'都被忽略。(其他系统可能会以不同的方式处理文本文件和二进制文件,如果您对二进制文件进行I/O操作,并希望将程序移植到非UNIX环境中,则添加'b'可能是一个好主意。)
因此,它代表Binary,用于指示您打算将文件的内容视为非文本。
对于你的代码来说,二进制访问似乎是正确的。然而,直接写原始
struct
值通常是一个非常糟糕的主意,因为你不知道编译器使用的确切内部格式,它可能会意外地改变。对于应该共享和/或“稍后”访问的文件,这不是C中正确的方法。00jrzges3#
在fopen documentation中:
使用上面的模式说明符,文件将作为文本文件打开。为了将文件作为二进制文件打开,必须在模式字符串中包含一个“b”字符。这个额外的“b”字符可以附加在字符串的末尾(从而形成以下复合模式:“rb”、“wb”、“ab”、“r+b”、“w+b”、“a+b”),或者对于混合模式,插入在字母和“+”符号之间(“rb+”、“wb+”、“ab+”)。
juzqafwq4#
将“wb”改为“wb+”