6

是否有一种独立于平台的方式将EOF符号写入 Ruby 中的字符串。在 *nix 中我相信符号是^D,但在 Windows 中是^Z,这就是我问的原因。

4

2 回答 2

17

EOF 不是一个字符,它是一个状态。终端使用控制字符来表示这种状态(Cd)。没有这样的事情是“阅读一个EOF字符”和写一个同样的事情。如果您正在写入文件,请在完成后将其关闭。请参阅此邮件列表帖子

听起来您将 EOF 视为标记文件结尾的带内但特殊字符值。最好将其视为带外标记值。在 C 中,EOF 通常为 -1,并且相关的 API 指定整数返回值,因此保证 EOF 永远不会与有效的带内值混淆。

这里有一些更多的证据(在 Unix 上这样做):

$ cat > file
hello^V^Dworld
^D
$ cat file
helloworld

键入 ^V^D 会在文件中按字面意思插入一个 control-D 字符。输入 world 并输入后,^D 关闭管道。该文件最终为 12 个字节长 10 个字母,另外两个用于 ^D 和换行符。最后的 ^D 不会出现在文件中。它只是被终端/外壳用来关闭管道。

于 2009-07-04T02:27:14.783 回答
5

通常没有 EOF 字符。也就是说,没有跨平台的解决方案,即使在特定平台上,对这样一个角色的处理也是纯粹的遗留问题和不一致的。您通过关闭文件来结束它。

但是,为了迂腐,某些操作系统在某些模式下读取文件时确实支持文件字符的文字结束。例如,如果您在 Windows 下运行并使用 C stdio API 以文本模式读取文件,则文字 control-Z(字符代码 26)将向 stdio 发出文件结束信号。这是 MS-DOS 的保留,它作为 CP/M 的保留。如果您使用 stdio 并以二进制模式读取文件,则 control-Z 不会结束文件。

不过,您应该只将其视为“知道,不要使用”功能。如果您在 Windows 上看到 trucated 输入/输出,您会想知道它,但使用它是疯狂的。

于 2009-07-04T06:56:17.833 回答