在二进制和文本模式下写入的文件之间的区别

写入以文本模式打开的文件时发生的翻译在二进制模式下不会发生什么? 特别是在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); 

我相信大多数平台在处理数据stream时都会忽略“t”选项或“文本模式”选项。 然而,在Windows上,情况并非如此。 如果您在MSDN上查看fopen()函数的描述,您将看到指定“t”选项将具有以下效果:

  • 换行符('\ n')将被转换为输出中的“\ r \ n”序列
  • 回车/换行顺序将被转换为input的换行符。
  • 如果文件以追加模式打开,文件末尾将检查一个ctrl-z字符(字符26),如果可能的话删除该字符。 它也会将该字符的存在解释为文件的结尾。 从CPM的日子来看,这是一个不幸的遗留问题(关于他们的子女直到第三代或第四代的父母的罪过的事情)。 与之前陈述的观点相反,ctrl-z字符不会被追加。

在文本模式下,换行符“\ n”可能被转换为回车符+换行符“\ r \ n”

通常你会想在二进制模式下打开。 尝试阅读文本模式下的任何二进制数据将无法正常工作,它将被损坏。 你可以在二进制模式下阅读文本,但不会自动翻译“\ n”到“\ r \ n”。

看fopen

另外,当你用“rt”打开文件时,input在Crtl-Z字符上被终止。

另一个区别是使用fseek

如果数据stream以二进制模式打开,则新的位置是从文件起始位置(如果起始位置是SEEK_SET),从当前文件位置(如果起始位置是SEEK_CUR)开始测量的偏移字节,如果起始位置是SEEK_END,则位于文件末尾。 一些二进制stream可能不支持SEEK_END。

如果stream在文本模式下打开,则唯一支持的偏移量值为零(与任何原点一起使用)以及在与同一文件关联的stream上先前对std :: ftell的调用返回的值(仅适用于SEEK_SET的由来。

我们有一个有趣的问题,就是在文本模式下打开文件时,混合了行尾字符:

 1\n\r 2\n\r 3\n 4\n\r 5\n\r 

我们的要求是,我们可以将我们当前的位置存储在文件中(我们使用fgetpos),closures文件,然后重新打开文件并find该位置(我们使用fsetpos)。

但是,如果一个文件包含行结尾的混合,那么这个过程就不能find实际相同的位置。 在我们的例子中(我们的工具parsingC ++),我们重新读取了我们已经看到的文件的一部分。

去二进制 – 那么你可以精确地控制从文件读取和写入的内容。