一、文件流
C++中文件流分為輸入流和輸出流,分別對應讀和寫的操作。文件流操作需要用到頭文件,其定義了三種基本類型:ifstream(輸入流)、ofstream(輸出流)和fstream(輸入輸出流)。與流相關的定義還有open()和close()成員函數,open()函數用於打開文件,而close()函數用於關閉文件。下面的示例代碼演示了如何使用文件流實現文件的打開、讀取、寫入和關閉操作:
#include using namespace std; int main() { char buffer[256]; // 打開文件 ifstream fin("input.txt"); ofstream fout("output.txt"); // 讀取文件內容 while(fin.getline(buffer, 256)) { // 輸出內容到控制台 cout << buffer << endl; // 輸出內容到文件 fout << buffer << endl; } // 關閉文件 fin.close(); fout.close(); return 0; }
在上面的示例代碼中,首先使用ifstream和ofstream定義了兩個文件流對象,然後用open()函數分別打開了一個名為input.txt和output.txt的文件。接着使用getline()函數逐行從input.txt中讀取內容,並在控制台輸出這些內容,並將其寫入到output.txt中。最後用close()函數關閉了兩個文件流對象。
二、文件讀取
在C++中可以使用ifstream或者fstream打開文件進行讀取操作。當使用ifstream打開文件時,只能進行讀取操作,而無法進行寫入操作。以下示例代碼演示了如何使用ifstream進行文件讀取:
#include using namespace std; int main() { char buffer[256]; ifstream fin("input.txt"); // 判斷文件是否打開成功 if(!fin.is_open()) { cout << "文件打開失敗!" << endl; return 1; } // 讀取文件內容 while(fin.getline(buffer, 256)) { // 輸出內容到控制台 cout << buffer << endl; } fin.close(); return 0; }
在上述示例代碼中,首先使用ifstream定義了一個輸入文件流對象fin,並用open()函數打開一個名為input.txt的文件。然後使用getline()函數逐行讀取文件內容,並輸出到控制台。最後使用close()函數關閉了文件流對象。
三、文件寫入
在C++中,可以使用ofstream或者fstream打開文件進行寫入操作。當使用ofstream打開文件時,只能進行寫入操作,而無法進行讀取操作。以下示例代碼演示了如何使用ofstream進行文件寫入:
#include using namespace std; int main() { char buffer[] = "歡迎來到知乎"; ofstream fout("output.txt"); // 判斷文件是否打開成功 if(!fout.is_open()) { cout << "文件打開失敗!" << endl; return 1; } // 寫入文件內容 fout << buffer << endl; fout.close(); return 0; }
在上述示例代碼中,首先使用ofstream定義了一個輸出文件流對象fout,並用open()函數打開一個名為output.txt的文件。然後使用<<運算符將內容寫入文件中。而在輸入輸出流fstream中,同樣可以用<<運算符進行文件內容的讀取與寫入。
四、二進制文件讀寫
除了常規的文本文件讀寫,C++還支持二進制文件的讀寫。在進行二進制文件讀寫時,需要使用以下函數之一: read()和write()函數。read()函數從文件中讀取指定的位元組數,並將其存儲在指定的緩衝區中。而write()函數將指定的位元組數從緩衝區寫入到文件中。以下示例代碼演示了如何進行二進制文件的讀寫:
#include #include using namespace std; int main () { char data[100]; // 打開文件 ofstream fout("file.bin", ios::out | ios::binary); fout.write("Welcome to Zhihu", 17); // 關閉文件 fout.close(); // 以二進制格式打開文件 ifstream fin("file.bin", ios::in | ios::binary); // 讀取文件內容 fin.read(data, 17); // 輸出內容到控制台 cout << data << endl; // 關閉文件 fin.close(); return 0; }
在上述示例代碼中,首先使用ofstream定義了一個輸出文件流對象fout,並用open()函數打開一個名為file.bin的文件,打開方式為ios::out | ios::binary,其中ios::out表示以輸出方式打開文件,ios::binary表示以二進制方式打開文件。然後使用write()函數寫入17個字符到文件中。
接着,用ifstream定義了一個輸入文件流對象fin,並用open()函數打開名為file.bin的文件,打開方式為ios::in | ios::binary,其中ios::in表示以輸入方式打開文件,ios::binary表示以二進制方式打開文件。然後使用read()函數從文件中讀取17個位元組的內容,並存儲在data緩衝區中。
五、文件位置指針及文件截取
C++中可以使用seekg()函數和seekp()函數控制文件位置指針的位置。get指針指向被讀取的下一個位元組,而put指針指向將要被寫入的下一個位元組。另外,還可以用標準庫函數函數tellg()和tellp()來實現獲取文件位置指針的位置。以下示例代碼演示了如何使用seekp()函數截取文件:
#include #include using namespace std; int main () { // 打開文件 ofstream fout("file.txt"); // 寫入文件內容 fout << "Welcome to Zhihu" << endl; // 獲取當前文件指針位置 streampos pos = fout.tellp(); // 移動文件指針到第14個位元組處 fout.seekp(pos-14); // 截取文件 fout.truncate(pos - 14); // 關閉文件 fout.close(); return 0; }
在上述示例代碼中,首先使用ofstream定義了一個輸出文件流對象fout,並用open()函數打開一個名為file.txt的文件。然後使用<<運算符將內容寫入文件中。接着,調用tellp()函數獲取當前寫指針位置,將其存儲於pos變量中。然後使用seekp()函數將寫指針位置移動到第14個位元組前(即最後一個字母「u」處),最後使用truncate()函數截取文件,將文件大小截取至pos – 14個位元組。在文件操作結束後,使用close()函數關閉文件流對象。
六、結論
通過本文的講解,我們可以了解到C++中文件操作的基本原理及常見的文件讀寫操作。無論是文本文件還是二進制文件,都可以使用不同的文件流進行讀寫操作。除了常規的讀寫操作之外,C++還提供了文件位置指針及文件截取的操作,使得文件操作更加靈活方便。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/257169.html