關於C 的檔案結束符的困惑

時間 2021-08-14 10:51:41

1樓:自由心魔

上面都是學c的吧 呵呵 還是我來說這個c++問題吧

ctrl+z是結束符 檔案結束符 並不是讓cin結束 如果你理解的深點的時候你就明白了 它只不過是讓cin變為bad()而已

這點是有點質疑的 你在輸入1 2 3 之後回車 再ctrl+z 然後再來一次 也就是兩次ctrll+z

它才會結束的 我以前也不明白 為什麼需要兩次ctrl+z才行 人們好像說是一個bug

windows系統中一般採用阻塞式檢查 ctrl+z、unix/linux系統下一般採用非阻塞式的檢查 ctrl+d。樓主是在windows系統下,因此使用阻塞式的 ctrl+z 來標識流的結束。

這種阻塞式的方式有一個特點:只有按下回車之後才有可能檢測在此之前是否有ctrl+z按下。還有一個特點就是:

如果輸入緩衝區中有可讀的資料則不會 檢測ctrl+z(因為有要讀的資料,還不能認為到了流的末尾)。還有一點需要知道:ctrl+z產生的不是一個普通的ascii碼值,也就是說它產生的 不是一個字元,所以不會跟其它從鍵盤上輸入的字元一樣能夠存放在輸入緩衝區。

明白了這幾點之後就可以來解釋樓主提出的問題了。

從鍵盤上輸入abcd^z 加 回車之後在windows系統上是這樣處理的:由於回車的作用,前面的 abcd 等字元被送到輸入 緩衝區(注意:上面說過了,^z不會產生字元,所以更不會儲存到輸入緩衝區,緩衝區中沒有 ^z 的存在)。

這時,cin.get() 檢測 到輸入緩衝區中已經有資料存在(因此不再檢查是否有 ^z 的輸入),於是從緩衝中讀取相應的資料。如果都讀取完了,則輸入緩衝區重新變為空, cin.

get() 等待新的輸入。可見,儘管有 ^z 按下,但是由於在此之前還有其它輸入字元(abcd),所以流也不會結束。

因此,輸入流結束的條件就是:^z 之前不能有任何字元輸入(回車除外),否則 ^z 起不到流結束的作用。

這點你不需要太在意 它的目的就在於讓輸入停止 所以不要太摳門了

2樓:許詩文

一個檔案,就是一個單元,是一組相關資料的有機結合,作業系統通過一定的方式訪問檔案,以存取資料。

c++中是通過流的方式來訪問檔案的,比如說語句 ifstream in("str.txt",ios::in); ,就開啟了檔案str.

txt。我們可以通過in.read()來讀取流in(也就是檔案str.

txt)中的資料。現在問題來了:怎麼判斷何時讀到了這個檔案的末尾呢?

在c++中,檔案的結束標誌是eof——顧名思義,end of file。也就是說,在檔案的某個位元組b後面加入一個eof,就表示這個位元組b就是該檔案的最後一個位元組了。這裡順便說一句,eof佔一個位元組的大小,其值為-1。

舉個例子!——執行環境為microsoft visual c++ 2005。

#include

#include

using namespace std;

int main()...

cout<

cin.get();

}在in讀完字元'j'的時候,其實已經到達檔案的末尾了,但此時流in的狀態還是good,也就是說還可以繼續讀入下一個位元組。而當in繼續往下讀的時候,就會讀到eof了,當讀完eof並賦值給c後,流in的狀態就變成了eofbit,不可再讀,在條件判斷語句中流in也就成了false了。所以真正讀入的位元組數其實是11,而不是檔案的長度10。

而檔案的輸出為 abcdefghij11 ,用ultraedit開啟,切換到16進位制模式下可以看到,j和11中間的那個空格的ascii碼為ff,也就是2進位制的11111111,就是-1的補碼。

3樓:

應該是這樣的

程式是在dos下執行的

要輸入字串

結尾用ctrl+ z結束。

就是這樣的,這是windows的字元結束符號,在程式中是這樣的

while(scanf("%s",&i)!=eof)

4樓:科技鳥

檔案的結束符是eof。預設的。

5樓:匿名使用者

你怎麼試的呢?

我不知道c++primer上怎麼說的, 不過一般程式裡按ctrl-z應該也不會打出結束符的, 所謂ctrl-z等於結束符應該就是在console下輸入時才是這樣的

在緩衝模式下回車這個動作有特殊的意義, 除了輸出回車字元之外還有清緩衝的功能。而沒回車的話資料都在緩衝裡,程式根本沒處理到。 所以這個不輸入回車是沒戲的。

就你這個程式, ctrl-z雖然沒結果, 但是再回車就有結果了。 你可以試一下 如果 ctrl-z後面再輸入個數字, 那個數字是讀不到的

關於C 中的修飾符long

long的大小是機器字長,和作業系統有關係。我們常用的windows是32位作業系統,就是說4個位元組,所以long就是4位元組長,64位作業系統long就是8位元組長。short定死了就是兩個位元組長,int的定義是不短於short,不長於long,具體長度與編譯器 機器都有關係。一般,32位作業...

和 運算子優先順序(C,關於c 運算子優先順序 和 的?

菜刀撒 當然 的優先順序高 p 1 就是先做 p 然後 1 p 1 才是p指標的下一個位置 文庫精選 內容來自使用者 苟燁濤 c c 運算子的優先順序比較 優先順序 運算子 名稱 結合方向 說明 1 陣列下標,圓括號,物件,指標 1 2 型別 sizeof 負號,強制型別轉換,自增,自減,取值,取地...

關於考研的一些困惑,關於考研的困惑

很多學生都是這個時候開始準備的,我稍微比這早那麼一點點,如果確定下來要考,就趕快準備,買資料,選學校,選專業。對於輔導班的話,建議你最好報一個,雖然學的不是很多,但是能督促你學習,不讓你考研的決心滅掉。你和我學的專業不同,不知道怎麼說,如果你對你自己所學的專業感興趣,就考這個專業就好了。如果不是的就...