Làm Việc Với File - Trần Lê Hùng Phi

Giới thiệu

Trong khi lập trình, giá trị các biến nhập vào được lưu trữ tạm thời trong Ram, và tức nhiên tất cả sẽ mất hết khi ta thoát chương trình chứ chưa nói đến việc tắt máy đi mở lại. Vấn đề này có lẻ bình thường đối với các chương trình nhỏ, cần ít dữ liệu, nhưng khi cần làm việc với các chương trình có lượng dữ liệu lớn, ta cần phải lưu lại để làm việc cho nhiều lần sau, thì vấn đề bắt đầu phức tạp.

Tất cả các ngôn ngữ lập trình đều cho phép ta xử lý vấn đề này một cách dễ dàng với các thư viện xử lý tập tin, hôm nay thầy giới thiệu đến các bạn thư viện fstream trong c++

Đọc và ghi file trong c++ với fstream

Khai báo

Tức nhiên trong phần khai báo phải có: #include <fstream>

Trong thân chương trình, các bạn khai báo bình thường như các biến khác với kiểu fstream.

ví dụ:

fstream f1; // khai báo một biến file tên f

Mở file

Để mở file được khai báo bằng fstream, các bạn dùng lệnh

f.open("tên tập tin",chế độ mở);

Trong đó:

- Tên tập tin là tên được lưu thực tế trên bộ nhớ ngoài, nếu tập tin nằm cùng thư mục với file souce chương trình thì viết bình thường (nhớ có phần đuôi file), còn nếu nằm khác thư mục thì viết đầy đủ đường dẫn tuyệt đối của tập tin.

- Chế độ mở: cho trình dịch biết là bạn muốn mở file ra để làm gì, chúng ta có các chế độ cơ bản sau:

ios::in mở để đọc, lấy dữ liệu từ file đưa vào chương trình

ios::out mở để ghi, ghi dữ liệu từ chương trình xuống file

ios::app Chế độ gắn vào. Nếu file đã được tạo thì nội dung của nó sẽ được gắn vào tận cùng của file. Theo mặc định thì đối với chế độ này thì nếu file chưa được tạo nó sẽ tạo ra 1 file mới.

ios::ateNếu file đã được tạo, thì chương trình sẽ chạy tới trực tiếp chỗ cuối cùng của file. Xuất ra có thể là được ghi ra bất kì chỗ nào trong file.

ios::binaryChế độ nhị phân. Khi mà file được mở ra ở chế độ này thì dữ liệu sẽ được đọc hay ghi từ 1 định dạng nguyên thủy nhị phân.

ios::truncNếu file đã được tạo thì nội dung của nó sẽ bị xóa đi.

Chúng ta còn có thể sử dụng những chế độ trên chung với nhau và chúng sẽ được kết nối với nhau bằng toán tử |. Ví dụ

f.open ("output.txt", ios:: out); // mở để ghi, ghi dữ liệu vào file output.txt

f.open ("input.txt", ios:: in); // mở để đọc, đọc dữ liệu từ file input.txt vào chương trình

Đọc dữ liệu từ file

Các em quan sát chương trình sau đây, với yêu cầu là có một file dữ liệu lưu trên bộ nhớ ngoài tên là input.txt, file này có hai dòng, dòng thứ nhất chứa 2 số nguyên 4, 5, dòng thứ 2 chứa một dòng chữ "Thanks you!". Nhiệm vụ của chúng ta là đọc dữ liệu trong file này rồi xuất lên màn hình

ví dụ - đọc file

  1. #include <iostream>

  2. #include <fstream>

  3. using namespace std;

  4. int main(){

  5. fstream f;

  6. f.open("input.txt",ios::in);

  7. int a,b;

  8. string s;

  9. f>>a>>b;

  10. cout<<a<<" "<<b<<"\n";

  11. fflush(stdin);

  12. getline(f,s,'\0');

  13. cout<<s;

  14. f.close();

  15. return 0;

  16. system("pause");

  17. }

Ghi dữ liệu vào file

Các em quan sát chương trình sau, với yêu cầu là nhập vào hai biến số nguyên từ bàn phìm rồi ghi giá trị đó vào file output.txt

ví dụ - ghi file

  1. #include <iostream>

  2. #include <fstream>

  3. using namespace std;

  4. int main(){

  5. fstream f;

  6. f.open("output.txt", ios::out);

  7. int a, b;

  8. cout<<"nhap a:";

  9. cin>>a;

  10. cout<<"nhap b:";

  11. cin>>b;

  12. f<<a<<" "<<b;

  13. f.close();

  14. return 0;

  15. system("pause");

  16. }

Đọc và ghi dữ liệu nhiều dòng

Ghi dữ liệu nhiều dòng thì các em dùng vòng lặp bình thường, muốn xuống dòng thì cũng dùng "\n" như thường.

Nhưng đọc dữ liệu nhiều dòng thì hơi khác một chút, nếu muốn đọc một số lượng hàng nhất định thì dùng for bình thường. Tuy nhiên, không phải lúc nào chúng ta cũng biết trong file đang có bao nhiêu dòng, như vậy, buộc lòng chúng ta phải kiểm soát được mình đọc hết file hay chưa.

Thư viên fstream cung cấp cho chúng ta một hàm là eof() đến kiểm soát việc này, hàm này có kiểu trả về logic, nếu nó trả về 1 thì đã hết file, tức là con trỏ đã nhảy đến cuối file, còn trả về 0 thì vẫn còn đọc được.

Ví dụ sau đây đọc toàn bộ các dòng dữ liệu trong file rồi xuất ra màn hình

  1. while ( !f.eof()){

  2. f>>a>>b;

  3. cout<<a<<b;

  4. }

Kết luận

File trong C++ nói riêng và trong lập trình nói chung còn nhiều vấn đề phức tạp, trong giới hạn khóa học này, thầy chỉ cho các bạn làm quen với cách làm việc với file text ở mức độ căn bản nhất. Các vấn đề phức tạp khác sẽ được nói đến trong khóa học lập trình nâng cao.

Từ khóa » Thư Viện Fstream Trong C++