2014-09-04 77 views
0

我是C++的新手學習C++ Primer的書。在第一章中,作者談到了iostream,coutendl的緩衝區。我無法理解。我在這裏有兩個示例代碼。cout緩衝區和C++中的endl的結構

#include<iostream> 
int v1; 
int main() 
{ 

    std::cout<<"First Cout!"; 
    std::cin>>v1; 
    std::cout<<"Second Cout!"<<std::endl; 
    std::cout<<"Third Cout!\n"; 

    return 0; 
} 

我想知道執行每行後的cout緩衝區的狀態。

+0

你有沒有跑這個代碼? – JBL 2014-09-04 14:54:52

+0

是的代碼工作正常 – 2014-09-04 15:05:59

+0

不,我的意思是,「你看過它做了什麼?你有沒有試着去理解?」 – JBL 2014-09-04 15:06:37

回答

5

流包含一個內存緩衝區,其中數據在刷新到最終目標(在本例中爲輸出控制檯)之前被寫入,因爲刷新可能是一個昂貴的操作。

在某些情況下緩衝區可能會自動刷新:當流關閉時,或者緩衝數據很多時,或者流配置爲在每行之後刷新時,因爲std::cerr是。

有時您需要手動刷新,例如以確保用戶看到您寫入std::cout的東西。這可以通過兩種方式完成:

  • 在流上調用flush()成員函數;
  • std::flush操縱器流入流中。

std::endl機械手做兩兩件事:

  • 插入一個新行字符(或序列),相當於<< '\n';然後
  • 刷新流,相當於<< std::flush(這又調用流的flush()成員函數)。

這對寫短消息到控制檯很有用;但應謹慎使用,因爲它在生產大量產品時可能會產生相當大的性能影響。

更復雜的是一個流可以是連接到另一個流,以便在訪問另一個流之前刷新一個流。在這種情況下,coutcin關聯,這就是爲什麼在從cin讀取之前看到第一個輸出,即使沒有顯式刷新。

最後,在程序結束時(具體而言,當std::ios_base::Init全局實例被銷燬,但這是你不應該需要了解細節。)所有的標準流,包括cout,會自動刷新

+0

差不多清楚的答案。你能否詳細說明一下。爲什麼在第一行結束後打印,因爲沒有endl,flush或\ n被調用?這是由於cout被終止/關閉的事實嗎?程序結束時會自動關閉蒸汽嗎? – 2014-09-04 15:09:59

+0

@wafeeq:我已經更新了答案來回答這些問題。 – 2014-09-04 15:16:17

+0

謝謝。我清楚地明白了這一點。 – 2014-09-04 15:20:24

-3

std :: endl只是將EOL(行尾)符號添加到輸出中。通常它的\ n,但它可以從一個OS到另一個不同。

+3

它也刷新了緩衝區。 – 2014-09-04 14:56:45

+0

'std :: endl'和'\ n'有什麼區別?我想在緩衝區操作方面有很大的不同。 – 2014-09-04 14:57:28

+0

@MikeSeymour都會刷新緩衝區? – 2014-09-04 14:57:59

1

第一行後,輸出在緩衝區,所以你不會看到它在終端。

在第二行之後,endl會導致緩衝區被刷新,因此您現在將在終端輸出中看到第1行和第2行。

在第三行之後,輸出位於緩衝區中,直到程序退出時纔會在終端中看到它。

編輯:

當您將線1和2之間的CIN,它會導致COUT被刷新。參見:std::cin

CIN是聯繫在一起的標準輸出流COUT(見IOS ::並列),這表明COUT的緩衝器被刷新(見的ostream ::平齊)上進行CIN每個I/O操作之前。

+0

現在呢?爲什麼我會在第二行之前得到第一行的輸出。我更新了questin。 – 2014-09-04 15:01:08

+0

查看我的更新回答 – imran 2014-09-04 15:12:31

0

第一行後,cout只包含沒有換行字符的給定字符串。 在第二行之後,cout還包含一行結尾,並且文本出現在控制檯窗口中。 在第三行後,cout包含另一個字符串,包括不一定出現在控制檯窗口處的行尾。 退出main後,出現第3行的文本。

+0

我已經更新了代碼。第一行執行後,cout只有字符串。根據定義,它不應該將數據清空到終端,因爲沒有endl或\ n。但在第二行它等待用戶,它​​打印第一行爲什麼如此? – 2014-09-04 15:04:39

相關問題