首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

C++ 檔案 I/O 操作完全指南:ASCII 與二進制模式詳解

     編輯:關於VC++

前言

C++ 標準程式庫提供 <fstream> 標頭檔,封裝了功能強大的檔案輸入輸出類別。相較於 C 標準庫的 FILE* 操作,C++ 流式操作更具型別安全、擴充性強且程式碼可讀性高。本文將系統性說明 ASCII 與二進制檔案的讀寫技巧,並介紹常用的流操作函數。

一、ASCII 模式輸出

1.1 核心類別

  • ofstream:輸出檔案流(寫入)
  • ifstream:輸入檔案流(讀取)
  • fstream:雙向檔案流(同時讀寫)

現代 C++ 標準使用 <fstream>(無 .h 後綴),已包含 <iostream> 功能。

1.2 開啟檔案

// 方式 1:建構函數直接開啟
ofstream fout("output.txt");

// 方式 2:先建構再呼叫 open()
ofstream fout;
fout.open("output.txt");

若檔案不存在會自動建立;若存在預設會截斷覆寫(可用旗標控制)。

1.3 寫入資料

操作語法與 cout 完全一致,使用 << 插入運算子:

int num = 150;
char name[] = "John Doe";
fout << "Here is a number: " << num << "\n";
fout << "Now here is a string: " << name << "\n";

1.4 緩衝區控制與關閉

fout << flush;  // 強制寫入緩衝區,檔案保持開啟
fout.close();   // 關閉檔案,自動 flush 並釋放資源

二、ASCII 模式輸入

2.1 開啟檔案讀取

ifstream fin("input.txt");

2.2 格式化讀取 >> 擷取運算子

以空白字元(空格、換行、Tab)為分隔:

int number;
float real;
char letter, word[8];
fin >> number >> word >> real >> letter;

2.3 整行讀取 getline()

當需保留空白字元時使用:

char sentence[101];
fin.getline(sentence, 100); // 最多讀 100 字元或遇換行

參數:目標陣列、最大字元數(含結束符)。

三、二進制模式輸入輸出

3.1 開啟二進制檔案

ofstream fout("file.dat", ios::binary);
ifstream fin("file.dat", ios::binary);

3.2 核心函數 write() / read()

二進制模式不可使用 << / >>,必須使用:

fout.write((char*)&object, sizeof(object));
fin.read((char*)&object, sizeof(object));
  • 第一參數:轉型為 char* 的位址
  • 第二參數:物件大小(位元組數)

3.3 結構體一次寫入/讀取

struct OBJECT {
    int number;
    char letter;
} obj;

obj.number = 15;
obj.letter = 'M';
fout.write((char*)&obj, sizeof(obj)); // 整個結構體一次寫入

// 讀取
ifstream fin("file.dat", ios::binary);
fin.read((char*)&obj, sizeof(obj));

優勢:無需逐欄位處理,效率高且程式碼簡潔。

四、進階流操作函數

4.1 檔案狀態檢查

  • good():一切正常
  • bad():發生嚴重錯誤
  • fail():操作失敗(較 bad() 輕微)
  • eof():到達檔案結尾

4.2 字元級讀取

  • get():讀取單一字元
  • peek():窺視下一字元但不移動指標
  • ignore(n, delim):跳過 n 字元或遇 delim 停止
  • putback(c):將字元放回流中

4.3 字元級寫入

  • put(c):寫入單一字元

4.4 開啟模式旗標

旗標說明
ios::app附加模式,寫入位置固定在檔尾
ios::ate開啟後定位到檔尾,但可隨意移動
ios::trunc截斷現有檔案(預設)
ios::nocreate檔案不存在則開啟失敗
ios::noreplace檔案已存在則開啟失敗

組合使用:ios::binary | ios::app

4.5 實用範例:統計檔案中 'e' 出現次數

ifstream fin("file.txt");
char ch;
int counter = 0;
while (!fin.eof()) {
    ch = fin.get();
    if (ch == 'e') counter++;
}
fin.close();

結語

C++ 檔案 I/O 以 fstream 族類為核心,ASCII 模式適合文字資料與人工閱讀,二進制模式適合結構化資料高效儲存。掌握 write/read、getline、狀態檢查與開啟模式旗標,即可應對絕大多數檔案操作需求。建議優先使用 C++ 流操作,享受型別安全與 RAII 自動資源管理的優勢。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved