Các thao tác với tệp như thế nào

Các chương trình chúng ta viết từ trước đến giờ vẫn còn khá cơ bản. Đấy là bình thường, các bạn vừa mới bắt đầu học C++ thôi mà. Chỉ cần thêm 1 chút cố gắng với rèn luyện thì sớm sẽ viết được các ứng dụng thật sự thôi.

Những kiến thức cơ bản cũng gần đầy đủ rồi. Trong bài học này, chúng ta sẽ tìm hiểu thêm 1 tác vụ cũng khá quan trọng trong C++ : thao tác với các tệp.

Những chương trình mà chúng ta thảo luận trong các bài học mới trước chỉ có thể hiển thị thông điệp ra màn hình cũng như là nhận dữ liệu từ người dùng. Thế nhưng như vậy vẫn chưa đủ. Chúng ta đều biết những phần mềm như Notepad, MS Word hay MS Excel còn có khả năng đọc cũng như là thay đổi nội dung của các tệp. Kể cả trong thế giới trò chơi cũng vậy : chắc hẳn tồn tại các tệp có nhiệm vụ lưu trữ thông tin về mức độ hoàn thành trò chơi của người chơi [mà bạn sử dụng khi có các điểm nhớ] cũng như là các tệp hình ảnh, âm thanh được sử dụng. Tóm lại, nếu một chương trình mà không thể giao tiếp với các tệp thì sẽ rất dễ dẫn đến nhiều tính năng bị hạn chế.

Trong bài học này, chúng ta sẽ xem làm sao để làm được điều đó. Nếu bạn đã làm chủ được các lệnh cin và cout thì các bạn đã biết gần hết rồi đấy !

Viết dữ liệu vào trong tệp

Điều đầu tiên cần biết khi muốn thao tác với các tệp là để mở tệp đấy ra. Trong C++ cũng vậy !

Một khi tệp đã được mở ra, mọi chuyện sẽ diễn ra giống như  khi chúng ta dùng cin và cout. Ví dụ dễ thấy nhất là chúng ta cũng sẽ sử dụng >. Tin tôi đi, rất nhanh thôi các bạn sẽ quen với việc này.

Chúng ta sử dụng khái niệm luồng [flux] dữ liệu khi nói về việc giao tiếp giữa chương trình máy tính với bên ngoài. Bài học này tập trung vào luồng dữ liệu tới các tệp nhưng mà nói « thao tác với các tệp » thì hình như là dễ hiểu hơn nhiều đúng không.

Như thường lệ, khi chúng ta muốn sử dụng 1 tính năng trong C++, cần phải bắt đầu bằng việc bao gồm đúng tệp tiêu đề. Trong trường hợp này, bạn sẽ phải thêm #include vào đầu mã nguồn chương trình của bạn.

! Các bạn đều đã biết về gói iostream cung cấp những công cụ để nhập/xuất dữ liệu với console. iostream thật ra là input/output stream nghĩa là luồng nhập/xuất. Tương ứng của chúng ta là fstream cho file stream nghĩa là luồng dữ liệu tới tệp.

Khác biệt là bạn cần luồng riêng cho mỗi tệp. Sau đây hãy cùng xem cách để mở ra 1 luồng xuất cho phép chúng ta ghi dữ liệu vào tệp.

Các luồng thực chất là các đối tượng [object] bởi vì như chúng ta đã từng nhắc đến, C++ là ngôn ngữ lập trình hướng đối tượng [object oriented].

Đừng lo lắng, chúng ta sẽ dành cả 1 chương sau để nói về khái niệm này. Trước mắt, hãy coi nó như 1 biến cải tiển phức hợp. Các đối tượng mà chúng ta nhắc đến lưu khá nhiều thông tin về tệp đang được mở cũng như cung cấp nhiều tình năng cho phép chúng ta đóng tệp hay đưa con trỏ về đầu tệp, vv…

Quan trọng là chúng ta có thể khai báo 1 luồng giống như cách chúng ta đã làm để khai báo 1 biến. Biến đặc biệt này sẽ có « kiểu dữ liệu » là ofstream và giá trị là đường dẫn tới vị trí tệp cần thao tác.

Giống như khi đặt tên biến, có 1 vài quy tắc cần nhớ khi đặt tên luồng :

  • Tên chỉ gồm chữ, số và dấu _
  • Ký tự đầu tiên phải là chữ [viết hoa hoặc thường]
  • Các chữ không được có chứa các dấu
  • Không có dấu cách

Hẳn là các bạn đã nhận ra là những quy tắc này không khác gì những quy tắ để đặt tên biến. Ngoài ra là những quy ước về đặt tên mà rất nhiều lập trình viên sử dụng và chúng ta đã nhất trí dùng trong giáo trình này. Trong phần tiếp theo, tôi sẽ chon dùng luong làm tên luồng mà chúng ta sẽ thao tác trong các ví dụ.

#include #include using namespace std; int main[]{    ofstream luong["C:/Applis/lttb/files/scores.txt"];    //Khai bao 1 luong cho phep ghi vao tep C:/Applis/lttb/files/scores.txt    return 0; }

Trong dấu ngoặc kép  là đường dẫn tới vị trí tệp. Bạn có thể dùng 1 trong 2 dạng sau đây :

  • Đường dẫn tuyệt đối : chỉ ra vị trí của tệp so với ổ đĩa của máy tính. Ví dụ : C:/Applis/lttb/files/scores.txt
  • Đường dẫn tương đối : vị trí của tệp so với thư mịc chứa tệp chạy của chương trình. Ví dụ : files/scores.txt nếu tệp chạy nằm trong C:/Applis/lttb

Sau đó, chúng ta có thể bắt đầu sử dụng luồng để ghi dữ liệu vào tệp.

! Nếu tệp tin đích không tồn tại, chương trình sẽ tạo ra nó ! Thế nhưng những thư mục trong đường dẫn phải tồn tại. Như trong ví dụ bên trên C:/Applis/lttb/files phải tồn tại, nếu không tệp tin scores.txt sẽ không được tạo ra.

Thường thường thì đường dẫn sẽ được chứa trong 1 chuỗi ký tự string. Trong trường hợp đó thì cần dung thêm hàm c_str[] để mở tệp.

string const tenTep["C:/Applis/lttb/files/scores.txt"]; ofstream luong[tenTep.c_str[]]; //Khai bao luong de ghi du lieu vao tep

1 số vấn đề có thể xảy ra khi ta cố mở 1 tệp như là tệp không thuộc sở hữu của bạn hay là ổ cứng đã đầy. Vì thế phải luôn luôn kiểm tra để chắc chắn là mọi thứ diễn ra suôn sẻ. Chúng ta dùng cú pháp if[luong] để thử. Nếu phép thử thất bại nghĩa là đã có vấn đề trong quá trình mở tệp nên ta không thể thao tác với tệp được

ofstream luong["C:/Applis/lttb/files/scores.txt"]; if[monFlux]{   //Kiem tra xem moi thu dien ra suon se     //Tat ca OK, thao tac voi tep } else {     cout

Chủ Đề