当我发现一个我无法解释的奇怪错误时,我正在尝试从头开始创建 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 个字节。因此,从变量中可以看出,写入的 3 个字节,以及结果中success
的神秘。5
ftell
有人可以告诉我这里到底发生了什么……为什么是 10,为什么不是 97 或 28?
非常感谢您的帮助!
编辑:哦,等等,我想我有一个想法……这不是与 \n 在 Unix 上为 0A,在 Windows 上为 0D 0A 以及编译器的一些内部特性将一个转换为另一个有关吗?我怎样才能强迫它准确地写出我想要的字节?