0

我习惯于使用 fwrite 将缓冲区的内容写入 gcc 中的文件。但是,由于某种原因,fwrite 在 Visual C++ 2005 中似乎无法正常工作。

我现在正在做的是将文本文件转换为二进制文件。该程序在前 61 行运行良好,但在第 62 行,它在输出二进制文件中插入了一个 0x0d。基本上,它变成了原版

12 0a 00

12 0d 0a 00

我检查了缓冲区,内容是正确的,即

buffer[18] = 0x12, buffer[19] = 0x0a, buffer[20] = 0x00

我试图将这个缓冲区写入文件

fwrite(buffer, 1, length, fout)

其中长度是缓冲区内容大小的正确值。

这发生在我身上一次,我必须将我的代码从 fwrite 更改为 WriteFile 才能正常工作。我的输出中插入 0x0d 是否有原因?我可以解决这个问题,还是我必须尝试使用​​ WriteFile 来代替?

4

1 回答 1

2

问题是因为文件已经在文本模式下打开,所以它正在将它看到的每个换行符转换为换行符+回车符序列。

打开文件时,使用文件模式上的b限定符指定二进制模式:

FILE *pFile = fopen(szFilename, "wb");

在 VC++ 中,如果文件模式中没有给出tb,则默认翻译模式由全局变量定义_fmode。这可以解释编译器之间的差异。

读取二进制文件时也需要这样做。在文本模式下,回车-换行组合在输入时转换为单个换行符,换行符在输出时转换为回车-换行组合。

于 2013-05-09T12:32:19.260 回答