当我发现一个我无法解释的怪异错误时,我正在尝试从头开始创建BMP文件。我在此简约程序中隔离了该错误:
int main()
{
FILE* ptr=NULL;
int success=0,pos=0;
ptr=fopen("test.bin","w");
if (ptr==NULL)
{
return 1;
}
char c[3]={10,11,10};
success=fwrite(c,1,3,ptr);
pos=ftell(ptr);
printf("success=%d, pos=%d\n",success,pos);
return 0;
}
输出为:
success=3, pos=5
test.bin
文件的十六进制转储为:0D 0A 0B 0D 0A
简而言之,无论您输入什么值而不是
11
(0x0B),fwrite
都将正确写入该值。但是由于某些原因,当fwrite
遇到10
(0x0A)时-恰好是这个值-它会写入0D 0A
,即2个字节,尽管我在fwrite
中明确指定每次写入1个字节论点。因此,可以在success
变量中看到写入的3个字节,而在5
中得到神秘的ftell
。有人可以告诉我这里到底发生了什么...为什么是10,为什么不是97或28?
非常感谢您的帮助!
编辑:哦,等等,我想我有个主意...这不是链接到\ n在Unix上是0A,在Windows上是0D 0A,以及编译器将一个相互转换的某些内部功能吗?如何强制它准确写入我想要的字节?
最佳答案
您的文件以文本模式打开,因此CRLF转换已完成。尝试:
fopen("test.bin","wb");
关于c - fwrite无法写入值10(0x0A),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18533432/