fprintf 在 txt 文件中写入 0D 0D 0A 而不是 0D 0A

fprintf writting 0D 0D 0A instead of 0D 0A in a txt file

我正在尝试使用 c 编写示例文本,但我的代码做错了。
代码如下

#include <stdio.h>

int main(){
FILE *ptr;
char c[8]={65,66,67,13,10,67,68,69};
int count;
ptr = fopen("write.txt","w");
for(cont = 0 ; cont < 8; count++){
     fprintf(ptr, "%c", c[count]);
}
return 0;
}

文字应该是
美国广播公司
CDE

但是当我在十六进制编辑器中打开它时,它显示的是:

41 42 43 0D 0D 0A 43 44 45 

编辑: 我用 wb 代替 w 并且有效

以文本模式打开文件可以让您以特定方式翻译数据,以符合底层环境的要求。

例如,在Windows中,以文本模式打开文件可能意味着换行符\n的C概念映射到CRLF 文件中的字符序列。

因此,当您写入 13 (CR) 时,它会按原样消失。当您编写 10 (LF) 时,这是换行符 \n 并被转换为 Windows 行结尾,CR LF。这就是您在文件中看到 0D 0D 0A 的原因。

如果你想避免这种翻译,只需以二进制模式打开文件(a):

ptr = fopen("write.txt", "wb");

顺便说一句,以下也是一个好主意:

  • 检查 可以 失败的函数,看看它们是否 失败(例如,fopen 返回 NULLfprintf 返回除 1 以外的任何内容(在本例中));
  • 使用完后明确关闭文件;
  • 让 C 在可能的情况下自动调整数组大小 (char c[] = {...});和
  • 使用 sizeof(c) 而不是“神奇”数字 8

(a) ISO C11 的相关部分是 7.21.2 Streams /2:

A text stream is an ordered sequence of characters composed into lines, each line consisting of zero or more characters plus a terminating new-line character. Whether the last line requires a terminating new-line character is implementation-defined. Characters may have to be added, altered, or deleted on input and output to conform to differing conventions for representing text in the host environment. Thus, there need not be a one-to-one correspondence between the characters in a stream and those in the external representation.

但请记住,即使是二进制数据也可能不会未经修改,如同一部分中的 /3 所述:

A binary stream is an ordered sequence of characters that can transparently record internal data. Data read in from a binary stream shall compare equal to the data that were earlier written out to that stream, under the same implementation. Such a stream may, however, have an implementation-defined number of null characters appended to the end of the stream.

我个人唯一一次看到该条款发挥作用是在 System z 大型机上,这些大型机具有必须填充的固定长度记录大小。