C语言 文件访问模式“w”和“wb”的区别

oknrviil  于 2023-04-19  发布在  其他
关注(0)|答案(4)|浏览(284)

这些代码块之间有什么不同。我试图搜索“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);
    }
zed5wv10

zed5wv101#

在访问模式中指定"b"可以防止标准库(的某些实现)在阅读/写入文件时转换一些字符。

  • 最常见的翻译是行尾:\n在Windows中转换为\r\n。*
gorkyyrv

gorkyyrv2#

绝对 * 任何 * 关于fopen()函数的引用都会告诉你这一点。例如manual page,它是类Unix环境中使用的常见文档:
模式字符串也可以包括字母'B',作为最后一个字符或作为上述任何两个字符串中字符之间的字符。在所有符合POSIX的系统上,包括Linux,'B'都被忽略。(其他系统可能会以不同的方式处理文本文件和二进制文件,如果您对二进制文件进行I/O操作,并希望将程序移植到非UNIX环境中,则添加'b'可能是一个好主意。)
因此,它代表Binary,用于指示您打算将文件的内容视为非文本。
对于你的代码来说,二进制访问似乎是正确的。然而,直接写原始struct值通常是一个非常糟糕的主意,因为你不知道编译器使用的确切内部格式,它可能会意外地改变。对于应该共享和/或“稍后”访问的文件,这不是C中正确的方法。

00jrzges

00jrzges3#

fopen documentation中:
使用上面的模式说明符,文件将作为文本文件打开。为了将文件作为二进制文件打开,必须在模式字符串中包含一个“b”字符。这个额外的“b”字符可以附加在字符串的末尾(从而形成以下复合模式:“rb”、“wb”、“ab”、“r+b”、“w+b”、“a+b”),或者对于混合模式,插入在字母和“+”符号之间(“rb+”、“wb+”、“ab+”)。

juzqafwq

juzqafwq4#

将“wb”改为“wb+”

相关问题