91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

c++中的基本IO類型是什么

發布時間:2022-03-28 15:42:21 來源:億速云 閱讀:198 作者:iii 欄目:大數據

這篇文章主要講解了“c++中的基本IO類型是什么”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“c++中的基本IO類型是什么”吧!

引言

c++不直接處理輸入和輸出,而是通過標準庫中的類型處理IO。IO的設備可以是文件、控制臺、string。c++主要定義了三種IO類型,分別被包含在iostreamfstreamsstream頭文件中。

為了支持使用寬字符的語言,標準庫定義了一組類型和對象操縱wchar_t類型的數據。

以下是這三種IO庫類型以及頭文件:

  • iostream頭文件

istream(寬字符版本wistream),從流讀取數據。
ostream (寬字符版本wostream),向流寫入數據。
iostream(寬字符版本wiostream),讀寫流。

  • fstream頭文件

ifstream(寬字符版本wifstream),從文件讀取數據。
ofstream (寬字符版本wofstream),向文件寫入數據。
fstream(寬字符版本wfstream),讀寫文件。

  • sstream頭文件

istringstream(寬字符版本wistringstream),從string讀取數據。
ostringstream (寬字符版本wostringstream),向string寫入數據。
stringstream(寬字符版本wstringstream),讀寫string。

設備類型和字符大小不會影響我們要執行的IO操作。得益于繼承機制,以上類型都可以使用>><<運算符以及getline()函數。

IO類型的通用特性

IO對象不能拷貝或賦值

istream is1,is2;
is1 = is2; //錯誤,流對象不能賦值
istream is3(is1); //錯誤,流對象不能拷貝

由于無法拷貝IO對象,因此不能將形參或返回類型設置為流類型。通常使用引用方式傳遞和返回流。但傳遞和返回的引用不能是const的,因為讀寫IO對象會改變IO對象的狀態,也就是改變了IO對象。

IO對象的狀態信息

IO類定義了一些函數和標志位,幫助我們檢查和操縱流的狀態:

  • strm::iostate是一種類型,這種類型就像一串二進制位串,每個二進制位串指出了流的狀態。(strm為引言中的任意一種IO類型)。

  • eof()函數用于在IO對象上調用,如cin.eof()。如果流檢測到eof(文件結束標志),該函數返回true。

  • fail()函數使用同上。如果流處于崩潰或IO操作失敗的狀態,返回true。

  • bad()函數使用同上。如果流處于崩潰狀態,返回true。

  • good()函數使用同上。如果流處于有效狀態,返回true。clear()函數使用同上。將IO對象中的所有條件狀態為復位,流的狀態變為有效狀態,返回void。

  • setstate(flags),將IO對象的狀態為按flags(類型為strm::iostate)指示的那樣置位。

  • rdstate()函數用于在IO對象上調用,讀取IO對象的狀態位,返回類型為strm::iostate

一旦流發生錯誤,這個流上的后續IO操作都會失敗,因此最好在使用流之前檢查它是否處于良好狀態。如

// 如果輸入成功,流保持有效狀態,條件為真
while(cin >> word){
    //讀操作成功,其他操作。
}

輸出緩沖

所有輸出流都管理一個緩沖區,用來保存程序讀寫的數據。

cout << "Hello World!";

串"Hello World!"可能被立即打印出來,也可能被操作系統保存在緩沖區,隨后打印。

以下原因可以刷新緩沖(即真正將數據輸出到目標設備或文件中):

  • 程序正常結束,自動刷新。

  • 緩沖區滿時,自動刷新。

  • 可以使用操作符endlflushends手動刷新緩沖區(只作用一次輸出)。

cout << "1" << endl; //字符串后添加換行,然后刷新緩沖區
    cout << "2" << flush; //僅刷新緩沖區
    cout << "3" << ends;  //字符串后添加一個空字符,然后刷新緩沖區。

通過操作符unitbuf設置自動刷新。不同于endlflushends只作用于一次輸出,設置了unitbuf后的輸出流每輸出一次都會自動刷新緩沖區。

cout << unitbuf;//下面的語句每執行一次輸出,就刷新一次緩沖區。
    cout << "1"; //輸出"1",自動刷新緩沖區
    cout << "2"; //輸出"2",自動刷新緩沖區
    cout << "3"; //輸出"3",自動刷新緩沖區
    cout << "4"; //輸出"4",自動刷新緩沖區
    ...
    cout << "nounitbuf"; //回到流默認的緩沖方式

關聯流。讀寫被關聯的流時,關聯到的流的緩沖區會被刷新(tie()函數括號里面的是關聯到的流,調用tie()的流是被關聯的流)。cout 和 cin默認關聯在一起,使用cin讀取數據時,cout的緩沖區被刷新。

 cout << "Fuck you!"; //沒有指定操作符,cout默認不刷新,該語句執行完后"Fuck you!"可能立即被輸出到屏幕,也可能稍后被輸出。
    int i;
    cin >> i; //cout的緩沖區被刷新,此時"Fuck you!"一定已經真正輸出(可能在之前就已經真正輸出,此時刷新緩沖區等于什么都沒做)。

使用tie()函數關聯流和解除關聯:

 cin.tie(&cout); //有參數的tie(),參數為指向流的指針,且指針不為空,此時建立關聯。
    cin.tie(nullptr); //有參數的tie(),且指針為空,此時解除cin和其他流的關聯。
    cin.tie(); //無參tie(),返回指向cin當前關聯到的流的指針。

Note:

若程序崩潰即異常終止,輸出緩沖區不會被刷新,換言之,緩沖區中的數據可能并沒有真正被輸出到文件或設備。

文件IO

創建文件流

前面所過,所有IO類型都可以使用>>、 <<getline(),除此之外,文件IO還有一些特有的操作。

創建文件流:

 fstream fstrm1; //創建未綁定文件的文件流
    fstream fstrm2(s1); //創建綁定到指定文件s1的文件流(自動調用open())。s1是string或指向c風格字符串的指針。
    //fstream fstrm3(s2, mode); 與第二條語句類似,但指定打開文件的模式。

Note:

當一個fstream的作用域內的代碼執行完畢,fstream關聯的文件被自動關閉,即fstream對象被銷毀時,close()會自動調用。

open和close

使用open打開文件,close關閉文件。對一個已經打開的文件調用open會失敗,并且failbit被置位。

string file1 = "qq.dat";
    ifstream ifs;
    ifs.open(file1);
    //讀取操作
    ifs.close();

文件模式mode

常用的文件模式mode如下:

  • in 只讀方式打開文件

  • out 以寫方式打開文件

  • app 每次寫操作在文件末尾進行

  • ate 打開文件后立即定位到文件末尾

  • trunc 截斷文件,即輸出會覆蓋文件中的原有數據。

  • binary 以二進制方式打開文件

同時指定多個模式時使用|分隔:

ofstream ofs("file1", ofstream::out | ofstream::app);

Note:

out模式隱含trunc即覆蓋原文件,若要在原文件末尾添加數據,則需要顯式指明app模式。

若沒有指定任何模式,則使用默認模式。

string IO

stringstream獨有的操作如下:

 sstream strm;   //sstream為sstream頭文件中定義的類型,具體可以是istringstream等。
    sstream strm(s); //建立一個sstream對象,保存字符串s的一個拷貝。
    strm.str(); //返回strm保存的string的拷貝。
    strm.str(s); //將string s拷貝到strm。

感謝各位的閱讀,以上就是“c++中的基本IO類型是什么”的內容了,經過本文的學習后,相信大家對c++中的基本IO類型是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

嘉禾县| 江源县| 双牌县| 海宁市| 大埔区| 恭城| 龙胜| 永登县| 莎车县| 肃北| 河源市| 咸宁市| 尤溪县| 安新县| 杭锦旗| 象州县| 五峰| 龙山县| 德钦县| 西城区| 新野县| 夏河县| 阿尔山市| 长沙市| 潮安县| 林芝县| 阿克陶县| 高阳县| 门头沟区| 灵石县| 缙云县| 宜丰县| 星子县| 永吉县| 湘西| 民乐县| 古蔺县| 拉萨市| 铜鼓县| 平陆县| 筠连县|