[c++] 文件讀取與文件輸出

總結一下最近用C++寫系統時用到的關於文件流輸入輸出的相關內容。

(最近真的是在懷疑人生了……大一學C++我到底都學了些啥???少壯不努力老大徒傷悲……書到用時方恨少,是非經過不知難……以前欠下的現在都會還回來的……)


一、C++中支持文件輸入輸出的幾個類

fstream提供了三個類,用來實現對文件的操作。

  1. fstream——打開文件以供讀寫
  2. ifstream——從文件中讀取內容
  3. ofstream——向文件中寫入內容

 

二、文件讀入與輸出的一些操作

1. 打開一個文件

被打開的文件在程序中用一個流對象來表示,對該對象所做的任何輸入輸出操作實際上就是對該文件所做的操作。

open( ) 函數用來打開一個文件:

void open ( const char* filename, openmode mode);

filename代表要打開的文件名, mode是打開的方式,是以下標識符的組合:

  •      ios::in             只讀
  •      ios::out            只寫
  •      ios::app            從文件末尾開始寫
  •      ios::binary         二進制方式
  •      ios::nocreate       打開一個文件時,如果文件不存在,不創建文件
  •      ios::noreplace      打開一個文件時,如果文件不存在,創建該文件
  •      ios::trunc          如果文件已存在則先刪除該文件
  •      ios::ate            打開一個文件時,將初始位置移動到文件尾

標識符組合使用時用或(|)操作符隔開

例如,想要打開“ helloworld.txt”文件寫入一些數據:

ofstream file;

file.open( "helloworld.txt", ios::out | ios::app )

ofstream, ifstream 和 fstream 的成員函數 open( ) 都有默認的打開文件的方式:

  • ofstream —— ios::out | ios::trunc
  • ifstream  —— ios::in
  • fstream  ——  ios::in | ios::out

 

2. 判斷文件是否打開成功

可以通過調用成員函數 is_open( ) 來檢查一個文件是否已經被順利的打開了:

bool is_open();

返回 true 代表文件已經被順利打開,返回 false 則相反。

 

3. 關閉文件

當文件讀寫操作結束以後,需要關閉文件,讓文件重新變成可訪問狀態。

close( ) 成員函數負責將緩存中的數據清除並關閉文件。

調用 close( ) 後, 原來的流對象就可以打開其他的文件, 且該文件可以重新被其他的進程所訪問。

不過析構函數將自動調用 close 函數以防止流對象被銷燬時還聯繫着打開的文件。

 

4. 一些驗證流的狀態的成員函數(返回值均爲bool型)

  • bad()

如果在讀寫過程中出錯,返回 true 。例如:當我們要對一個不是打開爲寫狀態的文件進行寫入時,或者我們要寫入的設備沒有剩餘空間的時候。

  • fail()

除了與bad() 同樣的情況下會返回 true 以外,格式錯誤時也返回true ,例如當想要讀入一個整數,而獲得了一個字母的時候。

  • eof()

如果讀文件到達文件末尾,返回true。

  • good()

文件打開成功則返回true。

重置以上成員函數所檢查的狀態標誌,可以使用成員函數clear()。

 

5. 流緩衝rdbuf()

rdbuf()用於獲取/設置流緩衝區。可以實現一個流對象指向的內容用另一個流對象來輸出。

例如:cin.rdbuf( )->in_avail( )

rdbuf( ) 獲取cin的輸入緩衝區。in_avail 獲取輸入緩衝區中存在的字符數。

整句話的意思就是獲取 cin 緩衝區中還有多少字節沒有處理的數據

 

三、文件讀取與寫入示例:

因爲類ofstream, ifstream 和fstream 是分別從ostream, istream 和iostream 中引申而來的。所以fstream 的對象可以使用其父類的成員來訪問數據。可以使用這些類與同控制檯(console)交互同樣的成員函數(cin 和 cout)來輸入輸出。

  • 讀取string類型的文件:可以使用getline( )
// Read from a text file
#include <iostream>
#include <string>
#include <fstream>

int main(){
    ifstream in_file("in_example.txt");
    ofstream out_file("out_example.txt");
    string buffer;
    if(!in_file.is_open()){    //判斷文件是否打開成功
        cout << "Failed to open file, pls check if file is exist or not.\n";
    }

    while(!in_file.eof()){    //判斷文件是否讀取到末尾
        in_file.getline(buffer, 100);
        out_file << buffer;
        out_file << endl;
    }
    in_file.close();
    out_file.close();
    return 0;
}
  • 讀取int類型的數據:

如: in_file >> n1 >> n2;

……

(以後遇到相關問題再來更新~)


以前覺得文件讀入和輸出好複雜好難,其實只要自己試幾遍,就能大致會用了,so 繼續加油鴨!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章