C++文字檔案的讀取和寫入

2020-07-16 10:04:24
使用檔案流物件開啟檔案後,檔案就成為一個輸入流或輸出流。對於文字檔案,可以使用 cin、cout 讀寫。

在《C++檔案類(檔案流類)》一節中提到,流的成員函數和流操縱運算元同樣適用於檔案流,因為 ifstream 是 istream 的派生類,ofstream 是 ostream 的派生類,fstream 是 iostream 的派生類,而 iostream 又是從 istream 和 ostream 共同派生而來的。

例題:編寫一個程式,將檔案 in.txt 中的整數排序後輸出到 out.txt。例如,若 in.txt 的內容為:
1 234 9 45
6 879

則執行本程式後,生成的 out.txt 的內容為:
1 6 9 45 234 879

假設 in.txt 中的整數不超過 1000 個。

範例程式如下:
#include <iostream>
#include <fstream>
#include <cstdlib> //qsort在此標頭檔案中宣告
using namespace std;
const int MAX_NUM = 1000;
int a[MAX_NUM]; //存放檔案中讀入的整數
int MyCompare(const void * e1, const void * e2)
{ //用於qsort的比較函數
     return *((int *)e1) - *((int *)e2);
}
int main()
{
    int total = 0;//讀入的整數個數
    ifstream srcFile("in.txt",ios::in); //以文字模式開啟in.txt備讀
    if(!srcFile) { //開啟失敗
        cout << "error opening source file." << endl;
        return 0;
    }
    ofstream destFile("out.txt",ios::out); //以文字模式開啟out.txt備寫
    if(!destFile) {
        srcFile.close(); //程式結束前不能忘記關閉以前開啟過的檔案
        cout << "error opening destination file." << endl;
        return 0;
    }
    int x;   
    while(srcFile >> x) //可以像用cin那樣用ifstream物件
        a[total++] = x;
    qsort(a,total,sizeof(int),MyCompare); //排序
    for(int i = 0;i < total; ++i)
        destFile << a[i] << " "; //可以像用cout那樣用ofstream物件
    destFile.close();
    srcFile.close();
    return 0;
}
程式中如果用二進位制方式開啟檔案,結果毫無區別。

第 21 行是初學者容易忽略的。程式結束前不要忘記關閉以前開啟過的檔案。