2010-06-17 58 views
34

大部分像C語言++寫入文件時,就把即使我們錯過寫這樣的語句EOF字符:我們可以自己寫一個EOF角色嗎?

filestream.close

但是有什麼辦法,我們可以把EOF字符根據我們的要求,以C++爲例。或者除了使用C++提供的功能外,我們還可以使用其他任何方法。

如果您需要了解更多的信息,請隨時發表評論。

在此先感謝。

編輯:感謝您的支持,但這裏是一個除了這個問題:

如果我們想欺騙OS和放置一個EOF字符的文件和EOF了一些數據後寫什麼,這樣應用程序像notepad.exe無法在我們的EOF字符後讀取。 我已閱讀與此主題相關的問題的答案,並且已經知道,現在的操作系統通常不會看到EOF字符,而是檢查文件的長度以獲得有關文件長度的正確理念,但是,在操作系統中必須有一個過程來檢查文件的長度,然後更新文件記錄。

對不起,如果我在我的估計任何一點錯了,但請幫助我因爲它可以導致很多新的想法。

+1

我一定很傻,因爲我不知道這意味着什麼。 – 2010-06-17 11:15:44

+14

你的意思是像'CP/M'(control-Z)中的EOF字符?我不認爲過去30年的任何操作系統都使用EOF字符作爲文件結束標記? – 2010-06-17 11:16:11

+1

加EOF指標是操作系統特定的,例如在UNIX上,它的ctrl-D – 2010-06-17 11:39:52

回答

48

沒有EOF字符。 EOF的定義「不等於任何有效的字符代碼」。通常它是-1。它在任何時候都不會寫入文件。

DOS中有一個歷史的EOF字符值(CTRL + Z),但它現在已經過時了。

要回答Apoorv的後續問題:操作系統從不使用文件數據來確定文件長度(文件不以任何方式「空終止」)。所以你不能欺騙操作系統。也許舊的,愚蠢的程序不會在CTRL + Z字符後讀取。我不會認爲任何Windows應用程序(甚至是記事本)都會這樣做。我的猜測是用一個空字符(\0)欺騙他們會更容易。

+0

這是一個閱讀EOF - 我們正在談論寫作。 – 2010-06-17 11:23:04

+8

我只解釋了EOF實際是什麼,它不是一個字符代碼。我沒有看到你的問題與答案。 – ypnos 2010-06-17 16:20:25

+0

所以我想欺騙一個自定義的流編寫器類,我已經人爲接受EOF。除了完成我的覆蓋測試之外,沒有任何有用的目的。 – Stephen 2014-02-27 17:09:53

3

如果通過EOF字符表示Control-Z之類的東西,那麼現代操作系統不需要這樣的事情,而C++運行時不會爲你寫一個。你當然可以自己寫一個:

filestream.put(26);  // write Ctrl-Z 

但是沒有很好的理由這樣做。也沒有必要做:

filesystem.close(); 

的文件流會爲你自動關閉時,它的析構函數被調用,但它是(我覺得)很好的做法這樣做。

7

實際上在C++中,沒有使用fprintf()或ostream機制寫入文件的物理EOF字符。 EOF是一個I/O條件,指示沒有更多數據要讀取。

一些像CP/M這樣的早期磁盤操作系統實際上使用物理0x1A(ASCII SUB字符)來表示EOF,因爲文件系統只是以塊的形式維護文件大小,因此您永遠不知道文件的字節長度。隨着在目錄中存儲實際長度計數的出現,將「EOF」字符存儲爲「帶內」文件數據的一部分不再是典型的。

2

在現代文件系統EOF不是一個字符,所以在完成寫入文件時不必發出它。您只需關閉該文件或讓操作系統在您的進程終止時爲您執行此操作。

+0

我有疑問:如果EOF僅用於返回值目的&沒有這樣的字符實際寫入文件,那麼C程序如何確定End of文件已到達&沒有更多的輸入可用(文件讀取進程)?請幫助我。 – 2012-11-13 06:34:06

+1

@SandeepSingh - 文件系統上文件的大小決定是否沒有更多輸入可用。如果EOF是一個字符,那麼零字節文件如何存在? – mouviciel 2012-11-13 06:39:41

+0

感謝您的澄清。 – 2012-11-14 03:55:13

10

我來到這裏的時候通過Kernighan &裏奇C演習。

Ctrl鍵 + d發送從stdio.hEOF常數相匹配的字符。

(編輯:這是在Mac OS X;感謝@markmnl用於指出在Windows 10相當於是按Ctrl +ž

+0

謝謝,這是我需要的。 – 2015-04-17 18:42:27

+0

Ctrl-Z爲我做了(Windows 10) – markmnl 2015-09-29 13:37:51

4

有作爲 「EOF」 字符沒有這樣的事。關閉流自身的事實是「EOF」條件。

當按下Ctrl鍵+d在UNIX殼,簡單地關閉標準輸入流,而這又是由shell識別爲「EOF」,它退出。

因此,要「發送」一個「EOF」,只需關閉需要發送「EOF」的流。

1

沒有人提到過系統調用[f]truncate,這就是如何縮短文件而不重新創建文件。

truncate()ftruncate()功能引起的path命名或fd引用被截斷的大小精確length字節的常規文件。

如果以前的文件大於此大小,則額外的數據將丟失。如果以前的文件較短,則擴展,擴展部分讀取爲空字節('\0')。

瞭解這是將任何類型的數據寫入文件的獨特操作。該文件是一個線性的字節數組,以某種方式在磁盤上進行佈置,元數據表明它有多長; truncate更改元數據。

3

在Windows下,如果在stdin中遇到ASCII 26(EOF),它將停止讀取其餘數據。我相信寫這個字符也會終止輸出發送到stdout,但我還沒有證實這一點。您可以將流切換到二進制模式as in this SO question

#include <io.h> 
#include <fcntl.h> 
... 
_setmode(0, _O_BINARY) 

而且你不僅會停止的0x0A被轉換爲0X0D的0x0A,但你也將獲得讀/寫0X1A以及能力。請注意,您可能必須同時切換stdin(0)和stdout(1)。

+0

感謝提及stdin,stdout。儘管如此,它仍然不起作用。用C++編譯是否有所作爲? – eleijonmarck 2014-12-15 15:30:52

+0

否語言不會有所作爲,因爲這是Windows API的問題。我可以確認上面的代碼,但請確保將0更改爲要切換的流的編號。 – Malvineous 2014-12-16 02:07:19

+0

噢,我看到了,所以我必須切換到'_setmode(0,_0_BINARY)'而不是'_setmode(stdin,_0_BINARY)'將stdin設置爲二進制 – eleijonmarck 2014-12-16 05:57:24

相關問題