AllaboutFileI/OinC++
( Bài này mình ly ca anh CUONGUYEN trên ddth.com, bài này đưc viết t năm 2002.
M ình thy khá hay nên tng hp li cho các bn d tham kho. M ình trích nguyên văn, chỉ
thêm style thôi.
Bài viết có 5 phn:
1/ Writ e to file 2/ Đọc t file 3/ Qun lý lung I/ O
4/ Kim tra c trng thái 5/ X lí file nh phân 6/ M t s hàm hu dng
)
Tôi post bài này lên không dám qua mt các cao th , mà ch để nói rng trong diễn đ àn rất cn các
bài post này để mọi ni cùng hc, và t ôi hi vng là các cao th s post c bài ca mình lên để
cho tôi hc hi.
Bài này s gii thiu v File I/ O.
1. Wr ite To File.
Chúng ta cùng xem chương trình đầu tiên nhé:
#include <fstream.h>
void main()
{
ofstream WriteToFile( first.txt );
Writ eToFile << Hello World! ;
Writ eToFile.close();
}
Chương trình này to mt file first.txt ( i cùng thư mục với file chương trình ca bn), ri ghi
dòng “ Hello World! vào file.
Hãy đi từng dòng nhé:
#include <fstream.h> - Thư viện để s dng các hàm File I/ O.
ofstream Writ eToFile(“ first.t xt ):
ofstream là mt lp. Dòng này t o một đối ng th hin lp ofstream là WriteToFile (hoc mt t ên
bt k), dùng hàm cont ructor vi tham s first.t xt . Hàm này s to ra mt file vi tên là “ first.txt .
Writ eToFile << “ Hello World! : ghi chuiHello World! vào file.
Writ eToFile.close(): đóng file li. M i khi bn m một file, sau đó bạn phải đóng lại.
2. Đọc t File.
Chương trình.
#include <fstream.h>
void main(){
ifstream OpenFile("first.txt");
char ch;
while(!OpenFile.eof())
{
OpenFile.get (ch);
cout << ch;
}
OpenFile.close();
}
Chương trình này dùng cách đọc tng t (cònch khác là đọc tng t (word) và đọc tng
dòng (line) - s tham kho sau).
ifstream OpenFile(“ first.txt ) – To một đi tượng th hin lp ifstream tên là OpenFile ( thng
tên khác tu ý). Hàm contructor vi t ham s “first.txt”, đâyfile mà chúng ta đã to mc trên.
Hàm này s m file “first.txt” để đọc.
char ch: dòng này tôi biết rng các bạn đã quá quen thuc.
while(!OpenFile.eof()) - hàm eof() ca lp ifst ream. Hàm eof() tr v giá tr 0 khi chưa kết thúc file,
ngược li là 1.
OpenFile.get (ch); - get(char & ch) là mt hàm ca lp ifstream, hàm này s đọc tng ký t ca file và
n cho biến ch. Sau đó sẽ ch đến t tiếp theo (do inside-pointer)
ng lp w hile... s lp cho ti khi kết thúc file, mi ln lp s đọc mt ký t và gán cho biến ch. Sau
đó đưa ra màn h ình ký t đó:
cout <<ch;
ng lp t iếp theo s đọc ký t tiếp theo sau ký t trước (do inside-pointer: điu này s được gii
thích phần sau). Do đó khi chạy chương trình, s xut hin trên màn hình dòng ch:
Hello World!
3. Qun lý Iung I/ O.
Trong phn này chúng ta s hc v mt s hàm hu dng.
Phần trước chúng ta đã to mt file bng lnh:
ofstream File( filename.txt );
Chúng ta có mt cách khác đó là sử dng hàm open():
ofstream File;
File.open( finename.txt );
Hàm open() nguyên dng:
void open(char * filename, [int open_mode]);
trong đó tham số open_mode ch ra phương thức m file. Nó có t h có các giá tr sau:
+ ios::in -> m file để đọc.
+ ios::out -> m file để ghi.
+ ios::app -> m file đ ghi vào cui file. gi ios::out (?).
+ ios::ate -> m file để ghi vào cui. Nó kng gi ios::out (?).
+ ios::trunc -> xoá tt c nội dung đã.
+ ios::nocreat e -> nếu file chưa tồn ti, s không m được.
+ ios::noreplace -> nếu file đã tn ti, c gng m sy li.
+ ios::binary -> m file binary.
Ví d 1:
#include <fstream.h>
void main()
{
ofstream Writ eToFile(“ first.t xt , ios::ate);
Writ eToFile<< \ nI love you ;
Writ eToFile.close();
}
Kết qu là file “ first.txt (phần trước) có ni dung là:
Hello World!
I love you
Nếu không tham s ios::ate thì ni dung của file lúc trước s ba.
Ví d 2:
Nếu chưa có file “non_exit.txt”.
#include <fstream.h>
void main()
{
ofstream File( non_exit.txt , ios::nocreate);
if(!File) {
cout<< Error openning. ;
exit(1);
}
File.close();
}
Kết qu: Error openning.” và không tạo file trong thư mục ca bn. Nếu không có tham s
ios::nocreat e thì vẫn vô tư, nghĩa là không dòng thông báo li và vn to ra file “ non_exit.t xt .
Ví d 3:
#include<fstream.h>
int main()
{
ifstream File(“ first.txt , ios::noreplace);
if(!File) {
cout<< Error! ;
exit(1);
}
File.close();
return 0;
}
Kết qu: Error! , vì file “ first.txt đã tn ti. Tham s ios::noreplace không cho phép m file đã tn
ti.
Nếu bn mun có nhiều phương thức m bn dùng toán t OR (| ):
ios::ate | ios::binary
S dng open_mode, chúng ta có th va m file đ đọc và để ghi. Ví d:
#include <fstream.h>
void main()
{
fstream File("second.txt",ios::in | ios::out);
File << "Hi! I’m there.";
char ch;
File.seekg(ios::beg);
while(!File.eof())
{
File.get(ch);
cout <<ch;
}
cout<<endl;
File.close();
}
Có cái gì mi m đây ấy nh. Okay, chúng ta s hiu ngay thôi.
fstream File(“ test.txt , ios::in | ios::out); - m file vừa đ đọc và ghi nên chúng ta to một đi
tượng thuc lp fstream (ch không phi ofstream-để ghi hay ifstream đ đọc).
File.seekg (ios::beg); - A đây rồi, cái này có v hơi mới m nh (tt nhiên là với ngưi bắt đầu hc).
Để xem ti sao li phi s dng nó chúng ta hãy xem khi lnh:
while(!OpenFile.eof())
{
OpenFile.get (ch);
cout << ch;
}
Khi lnh này chc hn bạn đã biết. Hàm get(ch) s đọc mt kí t ca file và gán cho biến ch. Vòng
lp s kết thúc khi đến cuối file. Để ng lp biết” được khi nào thì kết thúc file thì, khi đc file có
mt con tr trong” (inside-pointer). Sau khi get(ch) thc hin vic gán cho ch kí t hin hành thì
inside-pointer s ch đến kí t tiếp theo. C thế, đến ln lp sau ch s nhận được giá tr tiếp theo
cho đến khi kết thúc file.
Quay tr li hàm seekg(). Lý do phi s dng hàm này vì sau câu lnh:
File<< Hi! I’m there” ;
thì “ inside-pointer s tr đến cui file. Vì vy phi dùng câu lnh: