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
返回 NULL
或 fprintf
返回除 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 大型机上,这些大型机具有必须填充的固定长度记录大小。
我正在尝试使用 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
返回NULL
或fprintf
返回除 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 大型机上,这些大型机具有必须填充的固定长度记录大小。