總結一下最近用C++寫系統時用到的關於文件流輸入輸出的相關內容。
(最近真的是在懷疑人生了……大一學C++我到底都學了些啥???少壯不努力老大徒傷悲……書到用時方恨少,是非經過不知難……以前欠下的現在都會還回來的……)
一、C++中支持文件輸入輸出的幾個類
fstream提供了三個類,用來實現對文件的操作。
- fstream——打開文件以供讀寫
- ifstream——從文件中讀取內容
- 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 繼續加油鴨!