[C/C++] Cách đọc và ghi File trong lập trình C++ – Đào tạo lập trình C++

     Trong những bài viết trước về ngôn ngữ lập trình C/ C++, Tin học Tây Việt đã hướng dẫn các bạn thực hiện các bước đọc và ghi File trong lập trình C. Hôm nay, chúng tôi tiếp tục trình bày những kiến thức về cách đọc và ghi tập tin trong ngôn ngữ C++. Trong C++ đã định nghĩa sẵn những class để thực hiện chức năng đọc và ghi tập tin cho chúng ta. Vì vậy để thực hiện công việc ghi và đọc tập tin thì trước hết chúng ta phải tìm hiểu những phương thức trong những class đó.

     Cụ thể, trong C++ để thực hiện được những thao tác ghi và đọc tập tin trong C++ thì phải thực hiện dựa trên class ftream (file input/ output), class ifstream (file input) và class ofstream (file output), dữ liệu sẽ được ghi tuần tự từ chương trình ra file hoặc từ file vào chương trình thông qua những stream này.

     Trong quá trình thực hiện cách đọc và ghi File trong C++ các bạn đều phải khai báo thư viện fstream, và vì  ifstream và ofstream đều được định nghĩa trong fstream nên sau khi khai báo thư viện fstream các bạn đều có thể sử dụng dễ dàng.

#include <fstream>

     Để thực hiện cách đọc và ghi file thì chúng ta đều thực hiện các bước sau:

         Bước 1: Mở tập tin lên theo chức năng mong muốn (ghi hay đọc)

         Bước 2: Thực hiện các lệnh ghi hoặc đọc

         Bước 3: Đóng tập tin

Cách đọc và ghi File trong lập trình C++

1.  Cách đọc tập tin trong C++

Bước 1: Mở tập tin để đọc

cú pháp:   ifstream  <Tên đối tượng>(“Đường dẫn tập  tin”,<mode>);

          + ifstream: là tên của lớp đối tượng đọc tập tin

          + Tên đối tượng: là đối tượng được sử dụng để  đọc tập tin

          + Đường dẫn tập tin: là chuỗi ký tự chỉ cho chương trình biết vị trí và tên tập tin

          + mode: là mục đích mở tập tin, trong chế độ đọc tập tin sẽ có 2 mode cơ bản sau:

          – ios::in : Mở tập tin để đọc dữ liệu

         – ios::binary : Mở tập tin nhị phân.

ví dụ:

ifstream inFile("Data.txt",ios::in);  // Mở tập tin có tên Data.txt, tập tin này nằm trong cùng thư mục tập tin code .cpp
//hoặc
ifstream inFile("D:\Data.txt",ios::in);  //Mở tập tin có tên Data.txt trong ổ đĩa D

     Ngoài cách mở tập tin theo cú pháp trên, class ifstream còn định nghĩa sẵn phương thức open. Phương thức này cũng là một cách giúp các bạn mở tập tin theo các mode mình mong muốn.

Cú pháp:  <Tên đối tượng>.open(“Đường dẫn tập tin“,mode);

Ví dụ:

ifstream  inFile;

inFile.open("Data.txt",ios::in);

Bước 2: Thực hiện lệnh đọc nội dung tập tin

     Việc đọc nội dung tập tin được chia làm 2 cách, bạn có thể đọc từng ký tự, từng byte trong tập tin cho đến hết tập tin. Hoặc bạn có thể đọc từng hàng của tập tin cho đến hết  tập tin. Thao tác đọc tập tin được định nghĩa sẵn trong nội hàm class ifstream, các bạn chỉ cần gọi các phương thức ra thì chương trình sẽ thực hiện theo đúng yêu cầu.

     Các lệnh đọc tập tin

          + Sử dụng phương thức >>.

          Phương thức này chính là hàm operator >> đã được định nghĩa sẵn trong ifstream, với phương thức này các bạn có thể đọc được tất cả những nội dung có trong tập tin nhưng việc đọc sẽ dừng lại khi gặp các ký tự trắng, ký tự xuống dòng. Chính vì vậy, phương thức này thường không được sử dụng để đọc cho những tập tin văn bản.

Ví dụ:

ifstream inFile("Data.txt",ios::in);

char data[100];
inFile >> data;  //Đọc dữ liệu từ tập tin đưa vào chuỗi data

cout << data << endl;  //In dữ liệu đọc được lên màn hình

          + Sử dụng phương thức get(char KT)

          Phương thức này sử dụng hàm void get(char KT) để đọc dữ liệu từng byte hoặc từng ký tự trong tập tin. Chương trình sẽ lần lượt đọc từng byte (ký tự) dữ liệu và lưu vào biến KT. Lưu ý rằng với phương thức này chúng ta chỉ đọc được từng ký tự một, do vậy muốn đọc hết toàn bộ tập tin thì cần phải sử dụng vòng lặp mới có thể đọc đến ký tự cuối cùng của tập tin.

Ví dụ:

ifstream inFile("Data.txt",ios::in);

char kt;
MyFile.get(kt);  // Đọc ký tự từ tập tin và lưu vào biến kt 

cout<<kt;    // In dữ liệu đọc được lên màn hình

          + Sử dụng phương thức getline(char CH[], int N)

          Với phương thức đọc tập tin sử dụng void getline(char CH[], int N) để đọc dữ liệu trên từng hàng của  tập tin với điều kiện là tổng số ký tự trên hàng đó tối đa là N. Đây là cách đọc dữ liệu của tập tin theo từng hàng, việc đọc dữ liệu sẽ bắt đầu từ ký tự đầu tiên đến gặp ký tự  xuống dòng thì dừng lại, do vậy nếu muốn đọc hết tập tin các bạn cũng cần có vòng lặp mới có thể đọc hết dữ liệu.

Ví dụ:

ifstream inFile("Data.txt",ios::in);

char CHUOI[100];
MyFile.getline(CHUOI,100);  //Đọc dữ liệu từ tập tin vào chuỗi với độ dài chuỗi là 100 ký tự

cout<<CHUOI<<endl; //In dữ liệu đọc được lên màn hình

Bước 3: Đóng tập tin

          Sau khi hoàn thành thao tác đọc hoặc ghi cho tập tin, chúng ta nên đóng tập tin lại nhằm tránh trường hợp ảnh hưởng đến nội dung của tập tin. Tuy nhiên, trong ngôn ngữ C++ chúng ta đều thực hiện thông qua class ifstream, và trong class này mặc nhiên đã có hàm Destructor (Hàm hủy) nên cho dù bạn có xóa hay không thì chương trình cũng tự động đóng sau khi kết thúc quá trình thao tác.

          Để thực hiện thao tác đóng tập tin, các bạn sử dụng cú pháp:

                        <Tên đối tượng>.close();

Ví dụ:

inFile.close();

2.  Cách ghi tập tin trong C++

          Quá trình ghi nội dung vào tập tin cũng được thực hiện thông qua 03 bước giống như đọc tập tin

Bước 1: Mở tập tin theo mục đích để ghi nội dung

          Cú pháp mở tập tin với mục đích ghi

           ofstream   <Tên đối tượng>(“Đường dẫn tập  tin”,<mode>);

     + ofstream: là tên của lớp đối tượng ghi tập tin

     + Tên đối tượng: là đối tượng được sử dụng để ghi tập tin

     + Đường dẫn tập tin: là chuỗi ký tự chỉ cho chương trình biết vị trí và tên tập tin

     + mode: là mục đích mở tập tin, trong chế độ ghi nội dung cho tập tin sẽ có các mode sau

         –  ios::out : mở tập tin để ghi nội dung vào, nếu tập tin đã tồn tại thì dữ liệu sẽ bị xóa

         –  ios::app : mở tập tin để ghi nội dung vào, nội dung ghi vào sẽ ghi vào cuối của tập tin

         –  ios::ate : mở tập tin để ghi nội dung đồng thời di chuyển con trỏ đến vị trí cuối tập tin

      – ios::binary : mở tập tin để ghi dữ liệu nhị phân

ví dụ:

ofstream outFile("Data.txt", ios::out);  //Mở tập tin để ghi nội dung vào

Bước 2: Thực hiện lệnh ghi nội dung tập tin

        Trong class ofstream được định nghĩa sẵn 2 cách để bạn có thể thực hiện ghi dữ liệu vào tập tin.

     + Sử dụng phương thức operator <<.

         Trong class ofstream đã định nghĩa operator <<, đây là phương thức ghi dữ liệu cho tập tin.

          Cú pháp:   <Tên đối tượng>  <<   <tên biến chứa dữ liệu cần ghi>;

Ví dụ:

ofstream outFile("Data.txt",ios::out);

char KT[]="Trung tam tin hoc Tay Viet";


outFile << KT;  //Ghi toàn bộ nội dung trong chuỗi KT vào tập tin

      + Sử dụng phương thức put(char KT)

          Trong class ofstream đã định nghĩa sẵn phương thức put(char KT) để  ghi dữ liệu vào tập tin. Việc ghi dữ liệu vào tập tin sẽ được tiến hành chính xác từng byte cho những dữ liệu có trong chương trình. Dữ liệu này được đưa vào tập tin từng byte 1, do đó khi muốn ghi toàn bộ nội dung từ chương trình vào tập tin, chúng ta cần phải thực hiện vòng lặp

            Cú pháp:   <Tên đối tượng>.put(char KT);

Ví dụ:

ofstream outFile("Data.txt",ios::out);

char kt;
get(kt); //Nhập ký tự cần ghi vào tập tin

outFile.put(kt);

Bước 3: Đóng tập tin

        Cũng giống như chương trình đọc tập tin, sau khi không thao tác đến tập tin nữa thì chúng ta nên đóng tập tin lại bằng phương thức close đã được định nghĩa sẵn trong ofstream.

         Cú pháp:  <Tên đối tượng>.close();

Ví dụ:

outFile.close();

3. Những lớp hỗ trợ cho việc đọc và ghi tập tin

    Các bạn vừa thao tác đến 2 class ifstream và class ofstream, đây là 2 class trực tiếp thực hiện cách đọc và ghi File. Nguồn gốc của 2 class này là kế thừa từ class ftream. Trong nội hàm class fstream đã định nghĩa sẵn các hàm hỗ trợ cho quá trình ghi và đọc tập tin. Những hàm này là công cụ hỗ trợ quan trọng cho quá trình ghi và đọc tập tin.

     a. Hàm eof()

      Cấu trúc hàm:  bool eof() const;

      Hàm eof() là hàm kiểm tra đã hết tập tin chưa. Nếu đã hết tập tin thì hàm trả về true ( tương đương với giá trị khác 0), ngược lại nếu chưa hết tập tin thì kết quả sẽ trả về false ( tương đương với giá trị là 0).

     b. Hàm fail()

      Cấu trúc hàm:  bool fail() const;

      Hàm fail() là hàm phát hiện có xảy ra lỗi không trầm trọng trong quá trình đọc tập tin. Nếu phát hiện ra lỗi trong quá trình đọc tập tin thì hàm trả về true ( tương đương với giá trị khác 0), ngược lại nếu không thì kết quả sẽ trả về false ( tương đương với giá trị là 0). Ví dụ trong chương trình, chúng ta đọc tập tin sau khi đã đóng thì sẽ xuất hiện lỗi và hàm này sẽ cho giá trị true.

     c. Hàm bad()

      Cấu trúc hàm:  bool bad()  const;

      Hàm bad() là hàm phát hiện có xảy ra lỗi trầm trọng trong quá trình ghi tập tin. Nếu phát hiện ra lỗi trong quá trình ghi tập tin thì hàm trả về true ( tương đương với giá trị khác 0), ngược lại nếu không thì kết quả sẽ trả về false ( tương đương với giá trị là 0). Ví dụ trong chương trình, chúng ta ghi nội dung vào tập tin đã đóng thì sẽ xuất hiện lỗi và hàm này sẽ cho giá trị true.

      d. Hàm good()

       Cấu trúc hàm:  bool good() const;

      Hàm good() là hàm kiểm tra hoàn thiện việc ghi và đọc tập tin. Hàm trả về true ( tương đương với giá trị khác 0) khi tất cả các hàm eof(), fail() và bad() đều trả về giá trị 0, ngược lại chỉ cần 1 trong các hàm eof(), fail() và bad() trả về 1 thì kết quả của hàm good sẽ trả về false ( tương đương với giá trị là 0).

4. Con trỏ trong tập tin

       Trong quá trình đọc và ghi File trong lập trình C++ thì chúng ta cần phải biết con trỏ tập tin hiện đang ở vị trí nào, điều này sẽ giúp ta rất nhiều trong việc tương tác với tập tin. Chẳng hạn bạn muốn thêm, thay đổi hoặc xóa một nội dung nào đó thì chúng ta cần phải biết chính xác vị trí cần thao tác để tránh việc làm sai dữ liệu.

      a. Hàm trong class ifstream

       a.1 Hàm tellg()

      Hàm này được sử dụng để tìm vị trí hiện tại của con trỏ tập tin. Vị trí hiện tại của con trỏ trong tập tin chính là tổng số byte tính từ đầu tập tin đến vị trị của con trỏ.

       a.2 Hàm seekg()

       Hàm seekg() là hàm được sử dụng để dịch chuyên con trỏ đến vị trí nào đó. Việc di chuyển con trỏ trong tập tin cần phải có vị trí làm mốc, vị trí này có thể là đầu tập tin, cuối tập tin hoặc là vị trí hiện tại của con trỏ, điều này phụ thuộc vào tham số trong hàm. Hàm seekg có 2 cú pháp như sau:

         Cú pháp 1:  seekg(<số byte cần dịch chuyển>);

       Với cú pháp 1 này thực hiện chức năng dịch chuyển con trỏ sang phải với số byte đúng bằng giá trị truyền vào. Mốc dịch chuyển là vị trí đầu của tập tin.

         Cú pháp 2: seekg(<số byte cần dịch chuyển>,<mốc dịch chuyển>);

         Mốc dịch chuyển là 1 trong các tham số sau:

           + ios::beg : Mốc là vị trí đầu tập tin

           + ios::cur : Mốc là vị trí hiện tại của con trỏ

           + ios::end : Mốc là vị trí cuối của tập tin

        b. Hàm trong class ofstream

        b.1 Hàm tellp()

      Tương tự như Hàm này được sử dụng để tìm vị trí hiện tại của con trỏ tập tin. Vị trí hiện tại của con trỏ trong tập tin chính là tổng số byte tính từ đầu tập tin đến vị trị của con trỏ.

         b.2 Hàm seekp()

       Cũng giống như hàm seekg(), hàm seekp() cũng được sử dụng để dịch chuyên con trỏ đến vị trí nào đó trong tập tin. Và trong trường hợp này cũng sử dụng 2 cú pháp như trên

        Cú pháp 1:  seekp(<số byte cần dịch chuyển>);

       Với cú pháp 1 này thực hiện chức năng dịch chuyển con trỏ sang phải với số byte đúng bằng giá trị truyền vào. Mốc dịch chuyển là vị trí đầu của tập tin.

         Cú pháp 2: seekp(<số byte cần dịch chuyển>,<mốc dịch chuyển>);

         Mốc dịch chuyển là 1 trong các tham số sau:

  • ios::beg : Mốc là vị trí đầu tập tin
  • ios::cur : Mốc là vị trí hiện tại của con trỏ
  • ios::end : Mốc là vị trí cuối của tập tin

5. Ví dụ hoàn chỉnh

          Viết chương trình ghi nội dung vào tập tin có tên là Data.txt. Nội dung ghi vào có Họ tên và tuổi của bạn. Sau đó tiến hành đọc tập tin đó ra và in lên màn hình

#include<iostream>
#include<fstream>
#include<cstring>
#include<stdio.h>
#include<conio.h>

using namespace std;

int main()
{
//Chương trình ghi vào tập tin
ofstream outFile("Data.txt",ios::out);

if(!outFile)
	cout<<"Khong mo duoc tap tin\n";
else
{
char CH[100];
int tuoi;

cout<<"Nhap vao ten cua ban: ";
gets(CH);
for(int i=0;i<strlen(CH);i++)  //Cách ghi từng ký tự hoặc từng byte dữ liệu vào tập tin
   outFile.put(CH[i]);
outFile<<"\n";  //Ghi ký tự xuống dòng để phân biệt hàng họ tên và tuổi trong tập tin

cout<<"Nhap vao tuoi ban: ";
cin>>tuoi;
outFile<<tuoi;   //Cách ghi dữ liệu bất kỳ bằng toán tử << vào tập tin

cout<<"Da ghi tap tin thanh cong\n";
outFile.close();
}

//Chương trình đọc tập tin
ifstream inFile("Data.txt",ios::in); 
if(!inFile)
   cout<<"Khong mo duoc tap tin"<<endl;
else
{
cout<<"\nNoi dung doc duoc la:";
	
char Ten[100], age;
inFile.getline(Ten,100); //Đọc chuỗi họ tên
inFile.get(age); //Đọc tuổi

cout<<"\nTen cua ban: "<<Ten<<endl; //Xuất dữ liệu lên màn hình
cout<<"Tuoi ban: "<<age;

inFile.close();
}		

getch();
}

     Trên đây là những kiến thức cơ bản tin học Tây Việt cung cấp cho các bạn cách đọc và ghi File trong lập trình C++. Các bạn có thể xem thêm các bài viết khác trong cùng chuyên mục lập trình.

      Mọi thông tin về khóa học lập trình C, C++ các bạn vui lòng liên hệ tin học Tây Việt nhé.

      Chúc các bạn thành công!

 

 


Categories: ,

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *