
AllaboutFileI/OinC++
( Bài này mình lấy của anh CUONGUYEN ở trên ddth.com, bài này được viết t ừ năm 2002.
M ình thấy khá hay nên tổng hợp lại cho các bạn dễ tham khảo. M ình trích nguyên văn, chỉ
thêm style thôi.
Bài viết có 5 phần:
1/ Writ e to file 2/ Đọc từ file 3/ Quản lý luồng I/ O
4/ Kiểm tra cờ trạng thái 5/ Xử lí file nhị phân 6/ M ột số hàm hữu dụng
)
Tôi post bài này lên không dám qua mặt các “ cao thủ” , mà chỉ để nói rằng trong diễn đ àn rất cần các
bài post này để mọi ngư ời cùng học, và t ôi hi vọng là các cao thủ sẽ post các bài của mình lên để
cho tôi học hỏi.
Bài này sẽ giới thiệu 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 tạo một file “ first.txt” (ở nơi cùng thư mục với file chương trình của bạn), rồi ghi
dòng “ Hello World!” vào file.
Hãy đi từng dòng nhé:
#include <fstream.h> - Thư viện để sử dụng các hàm File I/ O.
ofstream Writ eToFile(“ first.t xt ” ):
ofstream là một lớp. Dòng này t ạo một đối tượng thể hiện lớp ofstream là WriteToFile (hoặc một t ên
bất kỳ), dùng hàm cont ructor với tham số “ first.t xt ” . Hàm này sẽ tạo ra một file với tên là “ first.txt” .

Writ eToFile << “ Hello World! ” : ghi chuỗi “Hello World!” vào file.
Writ eToFile.close(): đóng file lại. M ỗi khi bạn mở một file, sau đó bạn phải đóng nó 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 từng ký tự (còn có cách khác là đọc từng từ (word) và đọc từng
dòng (line) - sẽ tham khảo sau).
ifstream OpenFile(“ first.txt ” ) – Tạo một đối tượng thể hiện lớp ifstream tên là OpenFile (có thể dùng
tên khác tuỳ ý). Hàm contructor với t ham số “first.txt”, đây là file mà chúng ta đã tạo ở mục trên.
Hàm này sẽ mở file “first.txt” để đọc.
char ch: dòng này tôi biết rằng các bạn đã quá quen thuộc.
while(!OpenFile.eof()) - hàm eof() của lớp ifst ream. Hàm eof() trả về giá trị 0 khi chưa kết thúc file,
ngược lại là 1.
OpenFile.get (ch); - get(char & ch) là một hàm của lớp ifstream, hàm này sẽ đọc từng ký tự của file và
gán cho biến ch. Sau đó sẽ chỉ đến ký tự tiếp theo (do inside-pointer)
Vòng lặp w hile... sẽ lặp cho tới khi kết thúc file, mỗi lần lặp sẽ đọc một ký tự và gán cho biến ch. Sau
đó đưa ra màn h ình ký t ự đó:
cout <<ch;
Vòng lặp t iếp theo sẽ đọc ký tự tiếp theo sau ký tự trước (do inside-pointer: điều này sẽ được giải

thích ở phần sau). Do đó khi chạy chương trình, sẽ xuất hiện trên màn hình dòng chữ:
“ Hello World!”
3. Quản lý Iuồng I/ O.
Trong phần này chúng ta sẽ học về một số hàm hữu dụng.
Phần trước chúng ta đã tạo một file bằng lệnh:
ofstream File(“ filename.txt ” );
Chúng ta có một cách khác đó là sử dụng hàm open():
ofstream File;
File.open(“ finename.txt” );
Hàm open() nguyên dạng:
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 cuối file. Nó gọi ios::out (?).
+ ios::ate -> mở file để ghi vào cuối. Nó không gọi ios::out (?).
+ ios::trunc -> xoá tất cả nội dung đã có.
+ ios::nocreat e -> nếu file chưa tồn tại, sẽ không mở được.
+ ios::noreplace -> nếu file đã tồn tại, cố gắng mở sẽ gây lỗi.
+ 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ó nội dung là:
Hello World!
I love you
Nếu không có tham số ios::ate thì nội dung của file lúc trước sẽ bị xóa.
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 của bạn. Nếu không có tham số
ios::nocreat e thì vẫn vô tư, nghĩa là không có dòng thông báo lỗi và vẫn tạo 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” đã tồn tại. Tham số ios::noreplace không cho phép mở file đã tồn
tại.
Nếu bạn muốn có nhiều phương thức mở bạn dùng toán tử OR (| ):

ios::ate | ios::binary
Sử dụng open_mode, chúng ta có thể vừa 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ì mới mẻ ở đây ấy nhỉ. Okay, chúng ta sẽ hiểu ngay thôi.
fstream File(“ test.txt ” , ios::in | ios::out); - vì mở file vừa để đọc và ghi nên chúng ta tạo một đối
tượng thuộc lớp fstream (chứ không phải 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ỉ (tất nhiên là với người bắt đầu học).
Để xem tại sao lại phải sử dụng “ nó” chúng ta hãy xem khối lệnh:
while(!OpenFile.eof())
{
OpenFile.get (ch);
cout << ch;
}
Khối lệnh này chắc hẳn bạn đã biết. Hàm get(ch) sẽ đọc một kí tự của file và gán cho biến ch. Vòng
lặp sẽ kết thúc khi đến cuối file. Để vòng lặp “ biết” được khi nào thì kết thúc file thì, khi đọc file có
một “ con trỏ trong” (inside-pointer). Sau khi get(ch) thực hiện việc gán cho ch kí tự hiện hành thì
“ inside-pointer” sẽ chỉ đến kí tự tiếp theo. Cứ thế, đến lần lặp sau ch sẽ nhận được giá trị tiếp theo
cho đến khi kết thúc file.
Quay trở lại hàm seekg(). Lý do phải sử dụng hàm này vì sau câu lệnh:
File<<” Hi! I’m there” ;
thì “ inside-pointer” sẽ trỏ đến cuối file. Vì vậy phải dùng câu lệnh:

