文本和二进制模式

问题

在UNIX系统上,当应用程序读取文件时,它会获得确切地说,磁盘上的文件中有什么,反之亦然。在DOS/Windows世界中,情况有所不同,因为文件可以以二进制或文本两种模式之一打开。在二进制模式下系统的行为与UNIX中完全相同。然而,在以文本模式写入时NL(\n,^J)被转换为序列CR(\r,^M)NL。

这可能会严重破坏seek/fseek调用,因为文件中实际的字节数可能与应用程序。

可以按照编程中的说明明确指定模式第节。在理想的DOS/Windows环境中,所有使用行作为记录(例如猛击制作塞德…)将打开文件(并更改其模式标准输入和输出)作为文本。所有其他程序(例如合作管理计划信托收据...)将使用二进制模式。在Cygwin的实践中用对象文件显式地指定二进制模式(这是,这有助于诊断CR问题)。大多数其他程序(例如塞德合作管理计划信托收据)使用默认模式。

默认Cygwin行为

Cygwin系统为我们提供了一些灵活性,可以决定如何使用文件当未明确指定模式时,将打开。规则在不断演变,本节给出了设计目标。

  1. 如果文件名被指定为POSIX路径驻留在已装载的文件系统上(即,如果其路径名启动目录由显示攀登),然后是默认值由mount标志指定。如果文件是符号链接,应用目标文件系统的模式。

  2. 如果文件是通过MS-DOS路径名指定的(即,它包含反斜杠或冒号),默认为二进制。

  3. 管道、套接字和非文件设备以二进制模式打开。对于通过pipe()系统调用打开的管道,可以使用setmode()功能(请参阅“编程”一节切换到文本模式。对于通过popen()打开的管道,只需指定文本或二进制模式,就像调用fopen()一样。

  4. 套接字和其他非文件设备始终以二进制模式打开。

  5. 重定向时,Cygwin shell使用规则(a-d)。非Cygwin shell始终使用二进制模式进行管道和重定向。使用非Cygwin shell命令cat文件名|程序程序<文件名在以下情况下不等效文件名位于文本安装分区上。

    程序二维(u2d)d2u型可以用于从文件中添加或删除CR。二维(u2d)在NL之前添加CR。d2u型删除CR。对这些命令使用--help选项了解更多信息。

二进制还是文本?

为实现最大可移植性而编写的UNIX程序将知道文本文件和二进制文件之间的区别并采取行动在Cygwin的领导下。官方包含的大多数程序Cygwin发行版应该在默认模式下工作良好。

Binmode通常是最好的选择,因为它更快更易于处理,除非您想与本机Win32交换文件应用。保持Cygwin分布最有意义和Bin模式下的Cygwin主目录,并在中生成文本文件binmode(带有UNIX LF行尾)。大多数Windows应用程序都可以可以很好地处理binmode文件。一个显著的例外是迷你编辑便条簿,它错误地处理UNIX行尾并且只生成带有DOS CRLF行尾的输出文件。

您可以使用以下命令在CRLF和LF行尾之间转换文件Cygwin发行版中的某些工具,如dos2unix公司unix2dos公司来自dos2unix包。您还可以指定挂载表中要以文本模式挂载的目录,以便您可以使用用于交换目的的目录。

作为应用程序程序员,您可以逐个文件库决定一个文件,或者,您可以根据目的指定默认打开模式应用程序打开文件。有关的描述,请参阅下一节你的选择。

编程

打开()函数调用,二进制模式可以是用标志指定二进制(_B)和文本模式_文本。这些符号定义于fcntl。小时.

这个mkstemp()mkstemps()调用强制二进制模式。使用mkostemp()mkostemps()具有相同的标志作为打开()以获得对临时文件的更多控制。

fopen()波本()函数调用,可以通过添加b条添加到模式字符串。文本模式是通过添加模式字符串。

可以通过调用更改文件的模式设置模式(fd,mode)哪里fd公司是一个文件描述符(整数)和模式二进制(_B)_文本.功能收益二进制(_B)_文本依靠通话前的模式,以及电动势出错时。

还有一种方便的方法可以设置使用的默认打开模式在应用程序中,只需链接到提供的各种对象文件由Cygwin撰写。例如,如果要确保所有文件应用程序始终以二进制模式打开,而不管模式如何只需添加文件/lib/bin模式。o个到应用程序的链接阶段在您的项目中,如下所示:

$gcc my_tiny_app.c/lib/binmode.o-o my_tiny应用

更简单:

$gcc my_tiny_app.c-lbinmode-o my_tiny_app

这添加了为所有文件设置默认打开模式的代码由打开我的应用程序二进制文件,以便读取和写作。

Cygwin提供了以下库和对象文件来设置仅通过将应用程序链接到默认打开模式:

  • /lib/libautomode.a-打开文件以在文本模式下读取,/lib/automode.o打开文件以二进制模式写入
  • /lib/libbinmode.a-以二进制模式打开文件进行读写/lib/bin模式。o个
  • /lib/libtextmode.a-以文本模式打开文件进行读写/lib/text模式。o个
  • /lib/libtextreadmode.a-打开文件以在textmode中读取,/lib/textreadmode.o保留写入的默认行为。