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

2021-08-14 10:51:46 字數 2270 閱讀 3805

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語言中什麼符號作為語句的結束符

c語言中,是以 分號 作為語句的結束符的。舉個栗子 int main c語言中分好 作為語句的結束符 0 是標準的語句結束符 在c語言中各個標點符號的作用是什麼?分號 是一條語句的結束標誌符,每一條語句都必須以分號結尾。冒號 一般在switch語句,三目運算子 例如 類 等等中常用到,逗號 一般用於...

c語言的程式困惑,c語言的一個程式困惑

你的定義裡應該是 define y x 1 否則就成了 5 1 5 2 再取整就是7 這個define一般是定義常數用的,定義全域性變數直接用int y x 1就行 define是定義一個巨集,巨集的意思就是用一串字元來代替令一串字元,只是簡單的替換。你可以把z z由y x 2替換掉,y由x 1替換...

關於結婚的問題困惑中,關於結婚的困惑

哥們,適合自己的才是最好的。我前女友很漂亮,但為人不好,愛發脾氣,交往起來很累。所以分手了。現在的女朋友,交往三年多了,剛開始時是覺得女孩很善良,很好相處,然後在相處過程中感情越來越好,她家裡條件一般。但現在我們準備結婚了,她家因為拆遷一下也變的非常富裕了。所以,人不能短視。就象 一樣,你永遠不能確...