2

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

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

非常感谢您的帮助!

编辑:哦,等等,我想我有一个想法……这不是与 \n 在 Unix 上为 0A,在 Windows 上为 0D 0A 以及编译器的一些内部特性将一个转换为另一个有关吗?我怎样才能强迫它准确地写出我想要的字节?

4

2 回答 2

9

您的文件以文本模式打开,因此正在完成 CRLF 翻译。尝试:

fopen("test.bin","wb");
于 2013-08-30T12:57:56.870 回答
3

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

于 2013-08-30T12:57:50.120 回答