以二进制和文本模式编写的文件的区别

2021-12-02 00:00:00 file-io c c++

写入以文本模式打开但在二进制模式下没有发生的文件时会发生什么转换?特别是在 MS Visual C 中.

What translation occurs when writing to a file that was opened in text mode that does not occur in binary mode? Specifically in MS Visual C.

unsigned char buffer[256];
for (int i = 0; i < 256; i++) buffer[i]=i;
int size  = 1;
int count = 256;

二进制模式:

FILE *fp_binary = fopen(filename, "wb");
fwrite(buffer, size, count, fp_binary);

与文本模式:

FILE *fp_text = fopen(filename, "wt");
fwrite(buffer, size, count, fp_text);

推荐答案

我相信大多数平台在处理流时都会忽略t"选项或text-mode"选项.然而,在 Windows 上,情况并非如此.如果您查看以下 fopen() 函数的说明:MSDN,你会看到指定"t"选项会有如下效果:

I believe that most platforms will ignore the "t" option or the "text-mode" option when dealing with streams. On windows, however, this is not the case. If you take a look at the description of the fopen() function at: MSDN, you will see that specifying the "t" option will have the following effect:

  • 换行符 (' ') 将在输出时转换为 ' " 序列
  • 回车/换行序列将在输入时转换为换行.
  • 如果文件以追加模式打开,将检查文件末尾是否有 ctrl-z 字符(字符 26),并在可能的情况下删除该字符.它还将将该字符的存在解释为文件结尾.这是从 CPM 时代(关于父母的罪孽一直延续到他们的孩子直到第三代或第四代)的不幸遗留.与先前陈述的意见相反,不会附加 ctrl-z 字符.
  • line feeds (' ') will be translated to ' " sequences on output
  • carriage return/line feed sequences will be translated to line feeds on input.
  • If the file is opened in append mode, the end of the file will be examined for a ctrl-z character (character 26) and that character removed, if possible. It will also interpret the presence of that character as being the end of file. This is an unfortunate holdover from the days of CPM (something about the sins of the parents being visited upon their children up to the 3rd or 4th generation). Contrary to previously stated opinion, the ctrl-z character will not be appended.

相关文章