格式化檔案 I/O


使用open()來開啟串流,使用get()或put()來進行輸出入,這比較像是 C語言 的作法,在C++中,可以直接操作串流來進行檔案的輸出入。

不必使用open()來開啟串流,ifstream、ofstream和fstream都有建構函式,可以直接指定檔案並開啟串流,例如: :
ofstream fout("file.txt");


這個程式片段會自動開啟串流,之後就可以利用這個串流直接進行輸出,就像是使用cout一樣,例如:
fout << "Justin" << 28 << endl;

下面這個程式使用串流進行格式化檔案I/O,寫入姓名與成績資料至檔案中,然後再將它讀出:
#include <iostream> 
#include <fstream>
using namespace std;

int main(int argc, char* argv[]) {
char ch;

ofstream fout("temp");
if(!fout) {
cout << "無法寫入檔案\n";
return 1;
}

fout << "Justin" << "\t" << 90 << endl;
fout << "momor" << "\t" << 80 << endl;
fout << "Bush" << "\t" << 75;

fout.close();

ifstream fin("temp");
if(!fin) {
cout << "無法讀入檔案\n";
return 1;
}

char name[80];
int score;

cout << "Name\tScore\n";
while(!fin.eof()) {
fin >> name >> score;
cout << name << "\t" << score << endl;
}

fin.close();

return 0;
}

執行結果:
Name    Score
Justin  90
momor   80
Bush    75

下面這個程式使用串流讀入使用者的輸入,然後將之寫入指定的檔案中:
#include <iostream> 
#include <fstream>
using namespace std;

int main(int argc, char* argv[]) {
char str[80];

if(argc != 2) {
cout << "指令: write <filename>" <<endl ;
return 1;
}

ofstream fout(argv[1]);
if(!fout) {
cout << "無法寫入檔案" <<endl ;
 return 1;
}

do {
cout << "\$ ";
cin >> str;
fout << str << endl;
} while(*str != 'q');

fout.close();

return 0;
}

執行結果:
write temp
\$ 這是一段測試文字
\$ 測試
\$ q

開啟temp來看,您就可以看到剛才寫入的結果;下面這個程式可以進行文字檔案的複製,並在複製的過程中,將所有的字母轉為大寫:
#include <iostream> 
#include <fstream>
using namespace std;

int main(int argc, char* argv[]) {
if(argc != 3) {
cout << "指令: copy <input> <output>" << endl;
return 1;
}

ifstream fin(argv[1]);
ofstream fout(argv[2]);

if(!fin) {
cout << "無法讀入來源檔案" << endl;
return 1;
}

if(!fout) {
cout << "無法輸出目的檔案" << endl;
fin.close();
return 1;
}

char ch;

fin.unsetf(ios::skipws); // 不忽略空白
while(!fin.eof()) {
fin >> ch;
if(ch >= 97 && ch <= 122)
ch -= 32;
if(!fin.eof())
fout << ch;
}

fin.close();
fout.close();

return 0;
}

執行時指定來源檔案與目的檔案,您可以發現目的檔案的字母全部被轉為大寫了。