Ruby 跨平台方式编写 EOF 符号

Ruby cross-platform way to write the EOF symbol

提问人: 提问时间:7/4/2009 最后编辑:Nakilon 更新时间:4/16/2013 访问量:5785

问:

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

Ruby 字符串 跨平台 EOF

评论

0赞 Sasha Chedygov 7/4/2009
只是出于好奇,你为什么需要这个?
0赞 Stan Bright 1/18/2012
例如,我有一些 PDF 文件无法用“转换”(ImageMagick)进行转换,因为它们缺少 EOF 标记。同时,桌面应用程序可以查看这些文件。我想尝试添加这样的标记,然后转换 PDF......

答:

18赞 Mark A. Nicolosi 7/4/2009 #1

EOF不是一个角色,而是一个状态。终端使用控制字符来表示此状态 (C-d)。没有这样的事情是“读取 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 不会出现在文件中。它只是由终端/外壳用来关闭管道。

评论

5赞 GogaRieger 7/4/2009
EOF 是一个角色是一个非常普遍的误解
6赞 George Phillips 7/4/2009 #2

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

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

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