chim bay

Tuesday, October 13, 2015

Thao tác file với thư viện fstream c/c++

Môi trường và thư viện fstream

Codes dùng để ví dụ cho bài viết này được viết và thực thi tốt với Visual Studio 2013 Community, các thư viện C++ bao gồm fstreamiostream và string.
Để thao tác với file trong C++, ta có thể dùng ifstream cho việc đọc file, ofstream cho việc ghi file hoặc fstream cho cả 2 mục đích, trong trường hợp này tôi dùng fstream vì tính tiện lợi.

Đọc dữ liệu từ file

Giả sử ta có file input.txt với nội dung như sau
  1. C++ la chuong trinh co ban. Cac tac gia da rat no luc de tao ra chuong trinh nay. Cam on cac ban da doc cac bai viet cua chung toi. Hay theo doi chung toi neu ban that su yeu thich.
Chương trình sau sẽ đọc dữ liệu trong file input.txt và thể hiện ra màn hình
  1. #include <iostream>
  2. #include <string>
  3.  
  4. // 1. Thêm thư viện fstream xử lý file vào
  5. #include <fstream>
  6.  
  7. using namespace std;
  8.  
  9. int main()
  10. {
  11. // 2. Mở file
  12. fstream f;
  13. f.open("input.txt", ios::in);
  14.  
  15. // 3. Đọc dữ liệu từ file vào string data
  16. string data;
  17. getline(f, data);
  18.  
  19. // 4. Đóng file
  20. f.close();
  21.  
  22. // Thể hiện data ra màn hình
  23. cout << data;
  24. }
Như codes trên ta cần thực hiện bước 1. 2. và 4. như một thủ tục, giai đoạn 3. là giai đoạn chính ta sẽ đọc dữ liệu từ file. Việc đọc dữ liệu từ file sẽ còn gặp rất nhiều vấn đề, trong trường hợp codes trên là trường hợp lý tưởng, việc xử lý nhập dữ liệu từ file chúng ta sẽ khảo sát kỹ sau.

Tóm tắt các bước thực hiện

  1. Chèn thư viện cần thiết để xử lý file vào codes (dòng 5).
  2. Mở file (dòng 12 và 13), lưu ý rằng có mở file thì phải có đóng file. input.txt là tên file ta sẽ lấy dữ liệu, ios::in là diễn đạt mục đích ta mở file là đọc file.
  3. Sau khi mở file ta sẽ đọc dữ liệu từ file vào string data (dòng 17). Lưu ý rằng, sẽ có nhiều vấn đề nảy sinh ở giai đoạn này, getline chỉ lấy 1 dòng trên file, nếu file có nhiều dòng ta cần nâng cấp mã nguồn.
  4. Đóng file, điều này cần lưu ý vì sẽ rất nhiều bạn chưa có kinh nghiệm sẽ dễ quên (dòng 20).

Đọc file nếu input.txt có nhiều dòng

  1. #include <iostream>
  2. #include <string>
  3.  
  4. // 1. Thêm thư viện fstream xử lý file vào
  5. #include <fstream>
  6.  
  7. using namespace std;
  8.  
  9. int main()
  10. {
  11. // 2. Mở file
  12. fstream f;
  13. f.open("input.txt", ios::in);
  14.  
  15. // 3. Đọc dữ liệu từ file vào string data
  16. string data;
  17.  
  18. // *** Đọc từng dòng và nối vào data
  19. string line;
  20. while (!f.eof())
  21. {
  22. getline(f, line);
  23. data += line;
  24. }
  25.  
  26. // 4. Đóng file
  27. f.close();
  28.  
  29. // Thể hiện data ra màn hình
  30. cout << data;
  31. }
f.eof() sẽ kiểm tra xem đã kết thúc file chưa? Nếu chưa, ta tiếp tục lấy dữ liệu từ file vào line.

Ghi dữ liệu vào file

  1. #include <iostream>
  2. #include <string>
  3.  
  4. // 1. Thêm thư viện fstream xử lý file vào
  5. #include <fstream>
  6.  
  7. using namespace std;
  8.  
  9. int main()
  10. {
  11. // 2. Mở file
  12. fstream f;
  13. f.open("output.txt", ios::out);
  14.  
  15. // 3. Ghi dữ liệu vào file, trường hợp này ta có data là dữ liệu
  16. string data = "Site: www.stdio.vn\nHo Ten: Kevin La\nCong Viec: Dao Tao Lap Trinh Game";
  17. f << data;
  18.  
  19. // 4. Đóng file
  20. f.close();
  21. }
Như codes trên ta cần thực hiện bước 1. 2. và 4. như một thủ tục, giai đoạn 3. là giai đoạn chính ta sẽ lưu dữ liệu mà ta có vào file.

Tóm tắt các bước thực hiện

  1. Chèn thư viện cần thiết để xử lý file vào codes (dòng 5).
  2. Mở file (dòng 12 và 13), lưu ý rằng có mở file thì phải có đóng file. output.txt là tên file ta sẽ lưu dữ liệu vào ios::out là diễn đạt mục đích ta mở file là muốn ghi file.
  3. Sau khi mở file ta sẽ ghi dữ liệu vào file một cách đơn giản (dòng 17). Lưu ý hướng của << nó mang ý nghĩa rằng, luồng dữ liệu sẽ đi từ string data vào file f.
  4. Đóng file, điều này cần lưu ý vì sẽ rất nhiều bạn chưa có kinh nghiệm sẽ dễ quên (dòng 20).

Một số vấn đề cần lưu ý

File được lưu ở đâu?

Với đường dẫn tuyệt đối, thì bạn có thể đặt file hoặc tìm file tại đường dẫn tuyệt đối đó.
Với đường dẫn tương đối (trường hợp này chúng ta sử dụng nhiều)
  • Nếu bạn thực thi chương trình thông qua Visual Studio file sẽ tại đường dẫn tương đối tính từ thư mục chứa project (*.vcxproj), hoặc Working Directory do bạn tùy chỉnh. Trong trường hợp bài viết này dành cho người mới học lập trình, tôi khuyên bạn không nên tìm hiểu sâu vấn đề này lúc này.
  • Nếu bạn thực thi chương trình thông qua việc tự gọi thực thi chương trình .exe của bạn thông qua click chuột hoặc enter thì sẽ là đường dẫn tương đối tính từ thư mục chứa file .exe.

Có thể dùng kiểu char, short, int, float, double thay vì string?

Có thể được, bạn có thể thay thế các kiểu dữ liệu cần thiết để đọc ghi thay vì chỉ dùng string. Ví dụ trong trường hợp ghi vào file 1 giá trị kiểu int.
  1. int data = 6; // Thay vì string data = "chuoi du lieu"
  2. f << data;
Xử lý file sẽ còn nhiều vấn đề phức tạp, bạn hãy làm quen với điều này trước.

0 comments:

Post a Comment