【问题标题】:The difference in File access mode "w" and "wb文件访问模式“w”和“wb”的区别
【发布时间】:2017-10-02 08:09:24
【问题描述】:

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

【问题讨论】:

    标签: c file mode


    【解决方案1】:

    fopen() 函数上的绝对任何 引用都会告诉你这一点。例如manual page,它是类 Unix 环境中使用的通用文档:

    模式字符串也可以包含字母“b”作为最后一个字符 或作为任何两个字符中的字符之间的字符 上述字符串。这是为了与 C8​​9 和 没有效果; 'b' 在所有符合 POSIX 的系统上都被忽略, 包括Linux。 (其他系统可能会处理文本文件和二进制文件 不同,如果您对 a 执行 I/O,添加“b”可能是个好主意 二进制文件,并期望您的程序可以移植到非 UNIX 环境。)

    因此,它代表 binary,有助于表明您打算将文件的内容视为非文本。

    对于您的代码,二进制访问似乎是正确的。但是,直接写入原始的struct 值通常是一个非常糟糕的主意,因为您不知道编译器使用的确切内部格式,并且它可能会意外更改。对于应该“稍后”共享和/或访问的文件,这不是在 C 中执行此操作的正确方法。请查看序列化。

    【讨论】:

    • 所以如果我添加了“B”,文件将被视为二进制文件,如果不是,它将被视为文本?对了,你能告诉我“f”在FILE *f中的作用吗?
    • @AnhMinhTran f 只是变量名,FILE * ("pointer to FILE") 是变量的类型。这是基本的 C 语法,如果感觉不熟悉,您真的需要更多地学习该语言。
    • 我不同意这个评论。使用“w”和“wb”打开时,我的行为非常不同。就我而言,我将浮点值直接写入文件。
    【解决方案2】:

    fopen documentation

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

    【讨论】:

      【解决方案3】:

      在访问模式中指定"b" 可防止(某些实现)标准库在读取/写入文件时翻译几个字符。

      最常见的翻译是行尾:\n 在 Windows 中被翻译为 \r\n

      【讨论】:

      • 这实际上回答了这个问题。谢谢!有趣的是,其他人引用了未能说明这一事实的文档......(刚刚发现用 'w' 编写结构会破坏数据......)
      猜你喜欢
      • 2010-12-07
      • 2012-12-31
      • 2022-12-18
      • 1970-01-01
      • 2010-11-30
      • 1970-01-01
      • 2019-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多