文件访问模式“w”和“wb

时间:2017-05-04 08:41:35

标签: c file access mode

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

3 个答案:

答案 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)

fopen documentation中:

  

使用上面的模式说明符,文件将作为文本文件打开。为了将文件作为二进制文件打开," b"字符必须包含在模式字符串中。这个额外的" b"字符可以附加在字符串的末尾(从而产生以下复合模式:" rb"," wb"," ab"," r + b"," w + b"," a + b")或插入字母和" +"签署混合模式(" rb +"," wb +"," ab +")。

相关问题