在UNIX系统上,当应用程序读取文件时,它会获得确切地说,磁盘上的文件中有什么,反之亦然。在DOS/Windows世界中,情况有所不同,因为文件可以以二进制或文本两种模式之一打开。在二进制模式下系统的行为与UNIX中完全相同。然而,在以文本模式写入时NL(\n,^J)被转换为序列CR(\r,^M)NL。
这可能会严重破坏seek/fseek调用,因为文件中实际的字节数可能与应用程序。
可以按照编程中的说明明确指定模式第节。在理想的DOS/Windows环境中,所有使用行作为记录(例如猛击,制作,塞德…)将打开文件(并更改其模式标准输入和输出)作为文本。所有其他程序(例如猫,合作管理计划,信托收据...)将使用二进制模式。在Cygwin的实践中用对象文件显式地指定二进制模式(这是日,这有助于诊断CR问题)。大多数其他程序(例如塞德,合作管理计划,信托收据)使用默认模式。
Cygwin系统为我们提供了一些灵活性,可以决定如何使用文件当未明确指定模式时,将打开。规则在不断演变,本节给出了设计目标。
如果文件名被指定为POSIX路径驻留在已装载的文件系统上(即,如果其路径名启动目录由显示攀登),然后是默认值由mount标志指定。如果文件是符号链接,应用目标文件系统的模式。
如果文件是通过MS-DOS路径名指定的(即,它包含反斜杠或冒号),默认为二进制。
管道、套接字和非文件设备以二进制模式打开。对于通过pipe()系统调用打开的管道,可以使用setmode()功能(请参阅“编程”一节切换到文本模式。对于通过popen()打开的管道,只需指定文本或二进制模式,就像调用fopen()一样。
套接字和其他非文件设备始终以二进制模式打开。
重定向时,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保留写入的默认行为。