endl、flush、ends、unitbuf、nounitbuf区别及详解
一般 C++ 我們使用輸出流cout都會用到endl這個操縱符。是吧
C++里有幾個可以來控制緩沖區(qū)刷新的操縱符。
- endl
- flush
- ends
- unitbuf
- nounitbuf?
這幾個操縱符是用來控制輸出流的緩沖區(qū),這里主要要講一下這幾個的作用。
先來介紹一下這幾個的作用:
endl ?//?endl是用來 完成換行并刷新緩沖區(qū)的
flush ?// flush是用來 直接刷新緩沖區(qū)的
cout << unitbuf// 這里unitbuf 不執(zhí)行任何動作,而是設置這個cout輸出流 在接下來的每次操作之后都進行刷新緩沖區(qū)
cout << nounitbuf// 這里nounitbuf則是讓cout 回到正常的緩沖方式
ends:
C++STL官方對std::ends的解釋是:“此操縱符典型地為 std::ostrstream 在關聯(lián)輸出緩沖區(qū)需要為空終止,以作為 C 字符串處理時使用。 不同于 std::endl ,此操縱符不沖入流?!币簿褪钦fends不會立馬刷新緩沖區(qū),其作用是輸出一個字符串?和一個空字符
介紹完了我們個個來試一下:
cout << "hhhh" << endl; //輸出一個字符串 然后 再換行 刷新緩沖區(qū) cout << "hhhh" << flush; //輸出一個字符串 然后 直接刷新緩沖區(qū) cout << "hhhh" << ends; //輸出一個字符串 和一個空字符 不會立馬刷新緩沖區(qū) cout << unitbuf; // 這樣的話 設置 cout 接下來的操作都進行一次刷新緩沖區(qū) cout << "hhh"; // 這里會刷新緩沖區(qū) cout << nounitbuf; //這里則讓cout回到正常的緩沖方式這樣都執(zhí)行完了 ,都會在控制臺上輸出,單是這樣輸出 大家應該沒有什么感受把 都是直接再控制臺輸出 都會出現(xiàn)字符串
下面我們用 文件流 來演示的刷新緩沖區(qū)的作用
ifstream 文件輸入流類型
ofstream 文件輸出流類型
這里我們用到ofstream 類型來創(chuàng)建一個文件流對象。
下面正式演示各個操縱符的作用來刷新緩沖區(qū):
#include <fstream> #include <iostream> #include <string> using namespace std; int main() { ofstream out_file("test.txt", ofstream::trunc); //這里創(chuàng)建一個文件用來輸出寫入,以trunc的方式打開,每次打開都會清空文件里的數(shù)據(jù) for (size_t i = 0; i != 5; ++i) { string t; cin >> t; out_file << t; //這里并沒有設置什么操縱符來刷新緩沖區(qū) } return 0; }下面是我們試著來輸入字符串,然后寫入到文件流里。我們輸入一個字符串 并回車 再看看文本里的數(shù)據(jù)
我們輸入一個字符串 并回車 再看看文本里的數(shù)據(jù)
?程序并沒有真正的寫入到文件里,下面我們用到操縱符來看
#include <fstream> #include <iostream> #include <string> using namespace std; int main() { ofstream out_file("test.txt", ofstream::trunc); //這里創(chuàng)建一個文件用來輸出寫入,以trunc的方式打開,每次打開都會清空文件里的數(shù)據(jù) for (int i = 0; i != 5; ++i) { string t; cin >> t; out_file << t << endl; //這里用到endl 換行并且刷新存入緩沖區(qū)里的數(shù)據(jù) 真正的寫入 } return 0; }用到endl 下面來運行程序
輸入兩個字符串 ,然后看看文本
?也已經(jīng)真正的寫入到文件里了,字符串寫入然后并且換行,這里就是刷新緩沖區(qū)的數(shù)據(jù)真正寫入到文本里來。
這里就已經(jīng)說明如果沒有刷新緩沖區(qū)的話,數(shù)據(jù)是一直再緩沖區(qū)里的,而要利用操縱符來刷新緩沖區(qū),真正的寫入到文件里
下面還有其他的 直接貼上圖片!讓大家看下
flush
out_file << t << flush;flush 刷新緩沖區(qū) 沒有換行 文本就顯示一行
ends
out_file << t << ends;ends 的輸出再加上空字符也就是 一個空格?,但不是立馬輸出的。
然后是?unitbuf :
out_file << unitbuf; //這里先把cout設置成 接下來 每次輸出的進行刷新緩沖區(qū) //然后再在相同的程序里 輸入5 次 for (int i = 0; i != 5; ++i) { string t; cin >> t; out_file << t; }是可以的,先設置緩沖方式,然后接下來都會刷新緩沖區(qū),文本排成一行。
nounitbuf
out_file << nounitbuf; //回到正常的緩沖方式,也就是不立即清空緩沖區(qū)?以上,就講解完了
下面來說一下 ?關聯(lián)輸入和輸出流
C++ 標準庫 ?提供可以把 一個istream 對象 關聯(lián)到一個 ostream, 也可以把 一個ostream 關聯(lián)到 另一個 ostream
提供了一個 成員函數(shù) stream.tie
標準庫把cin和cout關聯(lián)在一起,關聯(lián) 也就是 當一個輸入流被關聯(lián)到一個輸出流時,任何 從輸入等待 的讀取數(shù)據(jù)時,都會先刷新被關聯(lián)的那個 輸出流。
tie 有兩個重載的版本,一個版本不帶參數(shù),返回指向輸出流的指針。如果本對象當前關聯(lián)到一個輸出流,則返回的就是指向這個流的指針,如果對象未關聯(lián)到流,則返回空指針
tie的第二個版本接受一個指向ostream的指針,即,stream.tie(&stream) 將流關聯(lián)到另一個輸出流stream。
cin.tie(&cout); //這樣也就關聯(lián)在一起每次cin讀取數(shù)據(jù)的時候,就會刷新cout的緩沖區(qū)。?
cin.tie(nullptr); //不關聯(lián)任何流這樣就取消關聯(lián)了
最后再總結一下緩沖區(qū)
1.什么是緩沖區(qū)
緩沖區(qū)又稱緩存,它是內存空間的一部分。也就是說,在內存空間中預留了一定的存儲空間,這些儲存空間用來緩沖輸入或輸出的數(shù)據(jù),這部分預留的空間就叫做緩沖區(qū)。
緩沖區(qū)根據(jù)其對應的是輸入設備還是輸出設備,分為輸入緩沖區(qū)和輸出緩沖區(qū)。
2.計算機中的緩沖區(qū)
緩沖器為暫時置放輸出或輸入資料的內存。
緩沖期內資料自儲存設備(如硬盤)來,放置在緩沖器中,待機送至cpu或其他運算設備。
緩沖區(qū)就是一塊內存區(qū),它用在輸入輸出設備和CPU之間,用來緩存數(shù)據(jù)。它使得低速的輸入輸出設備和高速CPU能夠協(xié)調工作,避免低速輸入輸出設備占用CPU,解放出CPU,使其能夠高效率工作。
3.緩沖區(qū)的類型
緩沖區(qū) 分為三種類型:全緩沖、行緩沖和不帶緩沖。
1)全緩沖
在這種請款下,當填滿標準I/O緩存后才進行實際I/O操作。全緩沖代表是對磁盤文件讀寫。
2)行緩沖
在這種情況下,當在輸入和輸出遇到換行符時,執(zhí)行真正的I/O操作。這時,我們輸入的字符先放在緩沖區(qū),等按下回車鍵換行時才進行實際的I/O操作。典型代表時鍵盤輸入數(shù)據(jù)。
3)不帶緩沖
也就是不帶行緩沖,標準出錯情況stderr是典型代表,這使得出錯信息可以直接盡快地顯示出來。
4.緩沖區(qū)地刷新
下列情況會引發(fā)緩沖區(qū)地刷新:
緩沖區(qū)滿;
執(zhí)行flush語句;
執(zhí)行endl語句;
關閉文件;
可見,緩沖區(qū)滿或關閉文件時都會刷新緩沖區(qū),進行真正地I/O操作。
C++中,我們可以使用flush函數(shù)來刷新緩沖區(qū)(執(zhí)行I/O操作并清空緩沖區(qū))
windows 系統(tǒng) 的 的全緩沖區(qū)的大小是4096個字節(jié),也就是輸入到4096字節(jié)就不能再輸入了
清空緩沖區(qū)。
在緩沖區(qū)滿了之后,緩沖區(qū)會刷新緩沖區(qū),執(zhí)行真正的I/O操作。
cerr << "error" ; 這樣則是無緩沖 立即執(zhí)行I/O操作。
?
總結
以上是生活随笔為你收集整理的endl、flush、ends、unitbuf、nounitbuf区别及详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 马斯克不用没有根本性影响 国产厂商放言:
- 下一篇: 武林外传手游装备怎样找回