2009-07-04 38 views
6

是否有一個平臺無關的方式將EOF符號寫入Ruby中的字符串。在* nix中我相信符號是^D,但在Windows中是^Z,這就是爲什麼我問。紅寶石跨平臺的方式來編寫EOF符號

+0

只是出於好奇,爲什麼你需要這個? – 2009-07-04 02:29:15

+0

例如我有一些PDF文件,我無法通過「convert」(ImageMagick)進行轉換,因爲它們缺少EOF標記。同時這些文件可以被桌面應用程序查看。我想嘗試添加這樣的標記,然後轉換PDF ... – 2012-01-18 13:35:25

回答

17

EOF不是一個字符,它是一個狀態。終端使用控制字符來表示這種狀態(C-d)。 「讀EOF 人物」並沒有這樣的東西,寫同一件事情也是一樣。如果您正在寫入文件,請在完成後關閉它。看到這個mailing list post

這聽起來像你正在爲帶內,但特殊字符 值標誌着文件的結束思維的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並沒有在文件中結束。它只是由終端/外殼用來關閉管道。

5

通常沒有EOF字符。也就是說,沒有跨平臺的解決方案,甚至在特定的平臺上,處理這樣的角色也是純粹的傳統和不一致的。通過關閉它來結束文件。

但是,在某些模式下讀取文件時,某些操作系統確實支持字面文件結尾字符。例如,如果您在Windows下運行並使用C stdio API以文本模式讀取文件,那麼文字控制-Z(字符代碼26)將以文件結尾標記爲stdio。這是來自MS/DOS的保留,它作爲CP/M的保留。如果使用stdio並以二進制模式讀取文件,那麼control-Z將不會結束文件。

儘管如此,你只應該把它想成「知道,不要用」的特性。如果你在Windows上看到trucated輸入/輸出,你會想知道它,但使用它是瘋狂的。