fwrite无法写入值10(0x0A)

时间:2013-08-30 12:54:30

标签: c fwrite

我正在尝试从头开始创建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字节,尽管我明确指出每个1字节写入fwrite参数。因此,可以在success变量中看到写入的3个字节,以及5结果中的神秘ftell

有人可以告诉我这里到底发生了什么......为什么10,为什么不是97或28?

非常感谢你的帮助!

编辑:哦等等,我想我有一个想法......这不是与Unix上的0A和Windows上的0D 0A以及编译器的一些内部特征转换为另一个相关联吗?如何强制它写出我想要的字节?

2 个答案:

答案 0 :(得分:7)

您的文件是以文本模式打开的,因此正在进行CRLF翻译。试试:

fopen("test.bin","wb");

答案 1 :(得分:3)

您必须使用Windows计算机。在Windows中,EOL是CR-LF,而在Unix中,它是单个字符。您的系统正在用0D0A替换0A。