C++的文件操作


一、C++文件的基礎知識

  • C++程序要處理文件,首先要包含fstream頭文件
  • fstream.h提供三種流對象類型:ofstream、ifstream、fstream
  • C++程序處理文件之前,必須定義流對象,通過流對象操作文件
    • ofstream f1; 只輸出文件流類型
    • ifstream f1; 只輸入文件流類型
    • fstream f1; 輸入輸出文件流

二、打開和關閉文件

2.1 打開文件

  • 打開文件可以通過流對象的函數成員open進行
    • ofstream f1;  f1.open("data.txt");
    • ifstream f1;  f1.open("data.txt");
    • fstream f1;  f1.open("data.txt", ios::out | ios::in);
  • 當使用fstream對象時,open函數還需要有一個參數,這個參數就是文件的訪問標志,也稱為文件的打開模式,常用的如下
    • ios::app        以追加的方式打開文件
    • ios::binary    以二進制方式打開文件,缺省的方式是文本方式
    • ios::in           輸入模式,從文件中讀取數據,如果文件不存在,open函數將失敗
    • ios::out        輸出模式,向文件寫數據。默認情況下,如果文件已存在,文件的內容將被刷新
  • 打開模式可以通過 | 符號連接使用
    • 比如只能向文件的尾部寫數據,ios::out | ios::app
  • 除了可以采用open函數打開文件以外,還可以在定義流對象時打開文件
    • 例如,fstream f1("data.txt", ios::in | ios::out)(以讀寫模式打開文件)
  • 測試文件打開是否失敗的方法是采用fail函數
    • 當打開文件失敗時,fail函數成員將返回true
    • 例如,if(f1.fail()) {cout<<"file open failed!\n";  exit(0);}

2.2 關閉文件

  • 打開的文件使用完成后一定要關閉
  • fstream提供了成員函數close()來完成此操作,如:f1.close();就把f1相連的文件關閉

三、讀寫文件

3.1 采用流操作符>>和<<讀寫文件

  • 將數據寫到與流對象關聯的文件中,類似於采用cout寫到屏幕上
  • cout格式化輸出數據的方法也適用於寫文件操作
  • 通過操作符>>從文件中讀取數據時,是通過空白字符(空格、跳格、換行)進行區分數據的
  • 可以通過函數成員eof()檢測“讀指針”是否已經到達文件的尾部(文件最后一個數據的后面),若是,則eof函數返回true
    • 例如,while(! f1.eof())  f1>>var;

3.2 采用函數成員讀寫文件

  • 流對象的函數成員getline,一次讀取文件中的一行字符,包含空白字符,例如:f1.getline(str, 81, '\n')
    • str是一個字符數組名,從文件中讀取的數據將存儲在str中
    • 81表示從文件中最多能讀取80個字符
    • '\n'是界符,如果在讀滿最大字符個數之前遇到了界符,那么將停止讀取,這個參數可選,如省略則默認為'\n'
    • 上述例子,如果讀滿了80個字符或是遇到了'\n'符號,都將停止讀取,最后將讀取到的字符串存到str中
  • 流對象的函數成員get,從文件中一次讀取一個字符,例如:f1.get(ch)
    • ch是一個字符變量,從文件中讀取的字符存儲在ch中
    • get函數能讀取任何一個字符,包括空白字符
  • 流對象的函數成員put,向文件寫字符,例如:f1.put(ch)
    • ch是一個字符變量,將ch的內容寫到f1關聯的文件中
    • put函數能寫任何一個字符,包括空白字符

3.3 二進制文件的操作(上述全是文本文件)

  • 創建二進制文件首先要以二進制方式打開文件,默認情況下,文件是以文本模式打開
  • 創建二進制文件的第二步是采用write函數成員寫數據
    • write函數特別適合一次寫一個數據塊(如數組、結構體或對象)
    • 例如:f1.write((char *)buffer, sizeof(buffer));
    • write第一個參數是內存區的開始地址,要求是char*指針,所以大多數時候需要類型轉換
    • write第二個參數是以字節為單位的數據項大小
  • read函數可以從文件中按二進制方式讀取數據
    • 例如:f1.read((char *)buffer, sizeof(buffer));
    • read函數和write函數的參數含義相同


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM