【问题标题】:How to write bytes individually into a file in C?如何将字节单独写入C中的文件?
【发布时间】:2021-06-21 13:39:29
【问题描述】:

我有一个整数数组,其中每个单元格都是 0-255 之间的数字,代表我要写入输出文件的字节。 我写了这个简单的循环:

for (int i = 0; i < len ; i++)
    putc(write_buffer[i], OutputFile);

但是在使用十六进制编辑器查看输出文件后,我发现某些字节在文件中被复制和/或移动。

以输入数组为例:

int write_buffer[10]= {137,80,78,71,13,10,26,10,0,0}

输出文件内容(十进制)为:137 80 78 71 13 13 10 26 13 10 0 0

有人知道是什么原因造成的吗?

【问题讨论】:

  • 13 和 10 是 windows 换行符,而在类 unix 系统上是 10。似乎它主动将 10 aka \n 转换为 13, 10 aka \r\n
  • 我们希望看到您的完整源代码。请编辑您的问题并发布。 putc 是一个宏。 write_buffer[i]no 副作用,所以应该没问题。你试过fputc函数吗?
  • 根据 Mirronelli 的分析,将"wb" 与您的fopen 一起使用

标签: c windows file


【解决方案1】:

心理调试:您在 Windows 上以文本模式打开文件,通过 fopen 和模式 "wt" 或者,当 _fmode 设置为 _O_TEXT,这是默认值时,"w",这意味着它正在应用行尾翻译,将 LF ('\n'/10) 转换为 CRLF ('\r' '\n', 13 10)。

更改您的fopen 以传递"wb" 的模式,而不仅仅是"w"/"wt",因此文件以二进制模式运行,并且不会使用任何C stdio 函数执行转换。

pts made a useful note in the comments:如果不是您自己打开文件(使用stdout,或者由您无法控制的代码打开的句柄),您可以使用setmode(fileno(OutputFile), O_BINARY); 将其切换到二进制模式(对于@987654339 @、1 可以代替第一个参数)。

【讨论】:

  • 仅供参考 要在标准输出上启用二进制模式,请致电 setmode(1, O_BINARY);。要在任何文件句柄上启用二进制模式(在打开之后),请调用 setmode(fileno(OutputFile), O_BINARY);
  • @pts:感谢您的补充;没有考虑过 OP(或未来的读者)可能正在写入 stdout 管道到文件,它会以这种方式运行并且没有相同的解决方案。我认为那里不会那么混乱(stdout 通常用于文本输出,您希望在那里进行文本翻译),但是“让更少的人感到困惑,但对于那些人来说更令人困惑赶上”并没有太大的改善。我将它添加到我的答案中只是为了确保它可见。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-10
  • 1970-01-01
  • 2016-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多