当我发现一个我无法解释的怪异错误时,我正在尝试从头开始创建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/

10-12 12:39
查看更多