Đối với các em sinh viên CNTT, thực hiện đồ án cơ sở ngành, thường lúng túng khi giáo viên yêu cầu xử lý đầu vào cho bài toán trên file với ngôn ngữ C/C++.Trong bài viết này, tôi sẽ cung cấp các em một số kiến thức cơ bản khi xử lý file với ngôn ngữ C/C++.
Trong C/C++, khi thao tác với 1 tệp dữ liệu, cần thực hiện theo thứ tự các bước sau :
1. Mở tệp tin <File>.
2. Thực hiện các thao tác đọc, ghi trên tệp tin đang mở.
3. Đóng tệp tin.
Trong C++ thì ta có 3 loại File stream cơ bản sau :
ifstream :Dùng cho file nhập vào. Loại này chỉ có thể được dùng để đọc dữ liệu vào file vào bộ nhớ mà thôi.
ofstream : Dùng cho file xuất ra. Loại này thì có thể dùng để tạo ra files và chép dữ liệu vào chúng.
fstream : Đây là kênh file.(File stream). Loại này thì có thể vừa tạo file, vừa ghi dữ liệu vào file và đọc dữ dữ liệu từ file vào luôn.
C++ cung cấp cho bạn thư viên fstream #include <fstream> chứa các lớp, hàm phục vụ các thao tác này. Do vậy trước khi viết chương trình ta cần khai báo thư viện fstream ngay từ đầu chương trình.
Ví dụ : #include <iostream>
1.Cách sử dụng fstream
1.1.Đối với file văn bản (File dạng *.txt)
Để định nghĩa 1 đối tượng file ta dùng cú pháp sau : fstream dataFile
Ở đây dataFile chỉ là tên biến do người dùng đặt ra.
Để mở 1 file ta dùng cú pháp sau :
fstream <Tên biến tệp> (<Tên tệp>, <chế độ mở tệp>);
Hoặc:
fstream <Tên biến tệp>;
<Tên biến tệp>.open(<Tên tệp>, <chế độ mở tệp>);
Ví dụ : fstream dataFile;
dataFile.open("info.txt", ios::out); // hoặc fstream fread ("E: \\data.txt", ios :: in);
Trong đó :
- đối_số_1là 1 chuỗi tên chứa tên file hoặc đường dẫn dẫn đến file
- đối_số_2 là 1 flag của file và cái này cho ta biết chế độ nào mà chúng ta dùng để mở file.
Ở ví dụ trên thì tên file là info.txt còn flag file ở đây là ios::out. Điều này, cho C++ biết chúng ta mở file ở chế độ xuất ra. Chế độ xuất ra cho phép dữ liệu có thể được ghi vào file.
Trường hợp, mở file ở chế độ nhập vào, tức là cho phép dữ liệu được đọc vào từ file.
datafile.open("info.txt", ios::in);
Các chế độ mở têp tin <FILE>
ios :: in Mở một tệp tin để đọc
ios :: out Mở một tệp tin có sẵn để ghi
ios :: app Mở một tệp tin có sẵn để thêm dữ liệu vào cuối tệp.
ios :: ate Mở tệp tin và đặt con trỏ tệp tin vào cuối tệp.
ios :: trunc Nếu tệp tin đã có sẵn thì dữ liệu của nó sẽ bị mất.
ios :: nocreate Mở một tệp tin, tệp tin này bắt buộc phải tồn tại
ios :: noreplace Chỉ mở têp tin khi tệp tin chưa tồn tại.
ios :: binary Mở một tệp tin ở chế độ nhị phân
ios :: text Mở một tệp tin ở chế độ văn bản.
Lưu ý:Bạn có thể mở tệp tin đồng thời 1 lúc ở nhiều chế độ.
Ví dụ :
fstream myFile("data.txt", ios :: in | ios :: out | ios :: binary); // Mở tệp ở chế độ nhị phân.
fstream myFile("data.txt", ios :: in | ios :: out | ios :: text); // Mở tệp ở chế độ văn bản.
Mặc định C++ đã có ios :: in | ios :: out rồi bạn có thể viết hay ko viết đều được. Do đó, bạn có thể viết lại 2 ví dụ trên như sau :
fstream myFile("data.txt", ios :: binary); // Mở tệp ở chế độ nhị phân
fstream myFile("data.txt", ios :: text); // Mở tệp ở chế độ văn bản
Lưu ý : Một số trường hợp bạn ko thể mở 2 chế độ cùng nhau được.
Ví dụ : ios :: binary và ios :: text
1.1.1.Các phép xử lý vào/ ra trên file
a.Ghi tệp văn bản bằng:"<<"
Các bước ghi dữ liệu vào tệp tin như sau:
- Mở file chỉ để đọc:
ofstream <Tên biến file> (<Tên file>, ios :: out);
Hoặc:
ofstream <Tên biến file> (<Tên file>); // Mặc định c++ sẽ tự thêm ios :: out
- Ghi dữ liễu vào file thao tác: "<<"
<Tên biến file> << <Dữ liệu cần ghi>;
- Đóng file
<Tên biến file>.close();
b. Đọc tệp văn bản bằng: ">>"
Các bước ghi dữ liệu vào file như:
- Mở file chỉ để đọc:
ofstream <Tên biến file> (<Tên file>, ios :: in);
Hoặc:
ofstream <Tên biến file> (<Tên file>); // Mặc định c++ sẽ tự thêm ios :: in
- Đọc dữ liễu vào file thao tác: "<<"
<Tên biến file> << <Dữ liệu cần đọc>;
- Đóng tệp tin
<Tên biến file>.close();
Ví dụ 1:
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
fstream dataFile;
cout << "Thuc hien mo File...\n";
dataFile.open("demofile.txt", ios::out); // Mở file để ghi vào
cout << "Du lieu duoc ghi xuong file.\n";
dataFile << "Mai Anh\n"; // Ghi dòng thứ 1
dataFile << "Thuan Binh\n"; // Ghi dòng thứ 2
dataFile << "An Dong \n"; // Ghi dòng thứ 3
dataFile.close(); // Đóng file
cout << "Xong.\n";
return 0;
}
Output File
Mai Anh
Thuan Binh
An Dong
Quá trình đó thực sự như sau :
Mai Anh\nThuan Binh\nAn Dong\n<EOF>.
Khi file lại được mở ra thì dữ liệu mới lại được gắn vào chỗ end-of-file đó.
Ví dụ 2: Định dạng file xuất ra
#include <iostream>
#include <iomanip>
#include <fstream>
using namespace std;
int main()
{
fstream dataFile;
double num = 17.816392;
dataFile.open("numfile.txt", ios::out);
dataFile << fixed; // Định dạng fixed-point
dataFile << num << endl; //Xuất ra num
dataFile << setprecision(4); // Định dạng 4 phần thập phân sau dấu .
dataFile << num << endl; //Xuất ra num
dataFile << setprecision(3); // Định dạng 3 phần thập phân sau dấu .
dataFile << num << endl; // Xuất ra num
dataFile << setprecision(2); // 2 phần
dataFile << num << endl; // xuất ra
dataFile << setprecision(1); // 1 phần
dataFile << num << endl; // xuất ra
dataFile.close(); // Đóng file
return 0;
}
Output
17.816392
17.8164
17.816
17.82
17.8
1.1.2.Kiểm tra sự tồn tại của File trước khi mở hoặc mở file không được
Đôi khi chúng ta sẽ cần quyết định xem file có tồn tại trước khi chúng ta mở nó ra hay không và sau đây là 1 ví dụ:
fstream dataFile;
dataFile.open("input.txt", ios::in);
if(dataFile.fail())
{
//Nếu file không tồn tại, thì tạo ra 1 file mới
dataFile.open("input.txt", ios::out);
//...
}
else
{
dataFile.close();
}
(còn tiếp )
» Tin mới nhất:
» Các tin khác: