Ruby 跨平台编写 EOF 符号的方法

6

在Ruby中,是否有一种跨平台的方式将EOF符号写入字符串。在*nix中,我相信该符号是^D,但在Windows中是^Z,所以我想问一下。


只是出于好奇,你为什么需要这个? - Sasha Chedygov
我有一些PDF文件,无法使用“convert”(ImageMagick)进行转换,因为它们缺少EOF标记。同时,这些文件可以通过桌面应用程序查看。我想尝试添加这样的标记,然后转换PDF文件... - Stan Bright
2个回答

18

EOF不是一个字符,而是一种状态。终端使用控制字符来表示这种状态(C-d)。不存在“读取EOF字符”的情况,写入也是同理。如果你要写入文件,完成后只需关闭即可。请参阅此邮件列表帖子

听起来你可能认为EOF是一种特殊的带内字符值,用于标记文件结尾。更好的想法是将其视为带外哨兵值。在C中,EOF通常为-1,并且相关API指定整数返回值,以确保EOF永远不会与有效的带内值混淆。

这里有更多证据(在Unix上执行):

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

输入^V^D会将控制字符D直接插入文件中。在输入world并按下回车键后,^D会关闭管道。文件最终长度为12字节,其中10个字母,另外两个是^D和换行符。最后的^D不会出现在文件中,它只是被终端/Shell用来关闭管道。


5
EOF被认为是一个字符是一个非常普遍的误解。 - GogaRieger

6
一般情况下,不存在EOF字符。也就是说,在跨平台的解决方案中,甚至在特定平台上处理此类字符的方式也是纯传统和不一致的。您需要通过关闭文件来结束文件。
然而,严谨地说,某些操作系统在某些模式下读取文件时确实支持文字文件结束符。例如,如果您在Windows下使用C stdio API以文本模式读取文件,则字面控制-Z(字符代码26)将向stdio发出文件结束信号。这是从MS-DOS保留下来的,它又是从CP/M保留下来的。如果您使用stdio并以二进制模式读取文件,则control-Z将无法结束该文件。
尽管如此,您应该只将其视为“知道但不使用”的功能。如果您在Windows上看到截断的输入/输出,可能需要了解它,但使用它是疯狂的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接