Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 文件访问模式的差异";w";及;wb_C_File_Mode - Fatal编程技术网

C 文件访问模式的差异";w";及;wb

C 文件访问模式的差异";w";及;wb,c,file,mode,C,File,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, siz

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

当然,
fopen()
函数上的任何引用都会告诉您这一点。例如,这是类Unix环境中使用的常见文档:

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

因此,它代表binary,用于表示您打算将文件内容视为非文本

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

在:

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

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


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

因此,如果我添加了“B”,文件将被视为二进制文件,如果不是,它将被视为文本?顺便问一下,你能告诉我“f”在文件*f中的作用吗?@AnhMinhTran
f
只是变量名,
FILE*
(“指向
FILE
”的指针)是变量的类型。这是基本的C语法,如果你觉得不熟悉,你真的需要进一步学习这门语言。我不同意这个评论。当以“w”和“wb”开头时,我有非常不同的行为。在我的例子中,我将浮点值直接写入一个文件。这实际上回答了这个问题。非常感谢。有趣的是,其他人引用的文档没有说明这一事实。。。(刚刚发现用“w”编写结构会损坏数据…)
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);
    }