我正在尝试使用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;
}
文本应该是
ABC
CDE,
但是当我在十六进制编辑器中打开它时,它显示的是:
41 42 43 0D 0D 0A 43 44 45
编辑:我把wb而不是w和它工作
以文本模式打开文件可以使您以某种方式转换数据,以符合基础环境的要求。
例如,在Windows中,以文本模式打开文件可能意味着换行符的C概念与文件中\n
的CRLF字符序列相对应。
因此,当您编写13
(CR)时,它照原样消失。编写10
(LF)时,这是换行符\n
,并转换为Windows行尾CRLF。这就是为什么您0D 0D 0A
在文件中看到的原因。
如果要避免这种转换,只需以二进制模式(a)打开文件:
ptr = fopen("write.txt", "wb");
顺便说一句,这也是一个好主意:
fopen
返回NULL
或fprintf
返回一个以外的任何值(在这种情况下));char c[] = {...}
); 和sizeof(c)
而不是“魔术”数8
。(a)的有关部分ISO C11
是7.21.2 Streams /2
:
文本流是由行组成的有序字符序列,每行由零个或多个字符加上一个终止换行符组成。最后一行是否需要终止换行符是实现定义的。可能必须在输入和输出上添加,更改或删除字符,以符合在主机环境中表示文本的不同约定。因此,流中的字符与外部表示中的字符之间不需要一一对应。
但请记住,按照/3
同一部分的规定,即使二进制数据也可能不会被修改:
二进制流是可以透明记录内部数据的有序字符序列。在相同的实现下,从二进制流中读取的数据应与先前写入该流中的数据进行比较。但是,这样的流可以在流的末尾附加实现定义数量的空字符。
我个人唯一见过该子句起作用的地方是在System z大型机上,必须记录固定长度的记录大小。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句