Hướng dẫn làm việc với tập tin trong C++

Hướng dẫn làm việc với tập tin trong C++

1. Khái niệm

Trong các chương trình trước thì các dữ liệu đưa vào chương trình chỉ được tồn tại trong RAM, khi thoát chương trình thì tất cả dữ liệu đều bị mất. Để khắc phục tình trạng này Borland C cung cấp cho ta các hàm để lưu trữ và truy xuất tập tin, đó là kiểu FILE . Và ở đây ta chỉ đề cập đến 2 loại tập tin :

•  Tập tin văn bản: là tập tin dùng để ghi các ký tự lên đĩa theo các dòng.

•  Tập tin nhị phân: là tập tin dùng để ghi các cấu trúc dạng nhị phân (được mã hoá).

2.  Thao tác với tập tin

Quá trình thao tác trên tập tin thông qua 4 bước:

Bước 1: Khai báo con trỏ trỏ đến tập tin.

Bước 2: Mở tập tin.

Bước 3: Các xử lý trên tập tin.

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

a. Khai báo

FILE *< tên biến >;

Ví dụ :   FILE *f;  //  Khai bao bien con tro file f

b. Mở tập tin

fopen (< đường dẫn tên tập tin> , < kiểu truy nhập >);

Ví dụ :  FILE *f;  //  Khai bao bien con tro f

  f = fopen ( “C:\\VD1.txt” , “rt” ) ; 

Các kiểu truy nhập tập tin thông dụng:

   t   là kiểu truy nhập tập tin đối với dạng tập tin văn bản (text).

   b   là kiểu truy nhập tập tin đối với dạng tập tin nhị phân (binary).

   r   mở ra để đọc ( ready only).

   w   mở ra để ghi (create / write).

   a   mở ra để them vào (append).

   r+   mở ra để đọc và ghi (modify).

c.  Các hàm đọc ghi nội dung tập tin

Tập tin văn bản

      + Đọc tập tin

STT

TÊN HÀM

Ý NGHĨA SỬ DỤNG

VÍ DỤ

1

fscanf(<FILE *>, <định dạng>, <các tham biến>);

Dữ liệu từ một tập tin theo định dạng.

fscanf(f, “%d”, &x); 

2

fgets(<vùng nhớ>, <kích

thước tối đa>, <FILE *>);

Đọc một chuỗi ký tự từ một tập tin với kích thước tối đa cho phép, hoặc gặp ký tự xuống dòng.

char s[80];

fgets(s, 80, f);

 

getc(< FILE * >);

Đọc một ký tự từ tập tin đang mở.

char c=getc(f); 

     + Ghi tập tin

STT

TÊN HÀM

Ý NGHĨA SỬ DỤNG

VÍ DỤ

1

fprintf(<FILE *>, <định

dạng>[, <các tham biến>]);

Ghi dữ liệu theo một định dạng nào đó vào tập tin.

fprintf(f,“%d”,x);

2

fputs(<chuỗi ký tự>, <FILE

*>);

Ghi một chuỗi ký tự vào tập

tin đang mở.

fputs(“Giao trinh BT”, f);

Tập tin nhị phân

    + Đọc tập tin

STT

TÊN HÀM

Ý NGHĨA SỬ DỤNG

VÍ DỤ

1

fread(<&ptr>, <size>, <len>, <FILE *>);

• ptr:   vùng nhớ để lưu dữ liệu đọc.

• size:  kích thước mỗi ô nhớ (tính bằng byte).

• len:  độ dài dữ liệu cần đọc.

FILE: đọc từ tập tin nhị

int a[30], b, n;

fread(a,sizeof(int), n , f);

Fread(&b, sizeof(int), 1 , f);

  + Ghi tập tin

STT

TÊN HÀM

Ý NGHĨA SỬ DỤNG

VÍ DỤ

1

fwrite(<&prt>, <size>, <len>,<FILE *> );

Tham số tương tự như hàm fread.

fwrite(a, sizeof(int), n , f);

d.  Đóng tập tin

Sau khi không còn làm việc với tập tin, để đảm bảo an toàn cho dữ liệu thì nhất thiết ta phải đóng tập tin lại.

fclose ( < biến con trỏ tập tin > ) ;

hoặc fcloseall () ;

Ví dụ : fclose  (f)  ;

e.  Các thao tác khác trên tập tin

* Xoá tập tin :

remove ( < đường dẫn tập tin> );

* Đổi tên tập tin :

rename ( < tên tập tin cũ >, < tên tập tin mới > );

* Di chuyển con trỏ tập tin :

fseek ( < FILE * >, < độ dời >, < mốc > );

Các mốc :

   SEEK_SET dời dến đầu tập tin  (giá trị 0).

   SEEK_END dời đến cuới tập tin  (giá trị 2).

   SEEK_CUR dời vị trí hiện hành  (giá trị 1).

Ví dụ : 

      feek ( f , +5 , SEEK_CUR ); // dời vị trí hiện hành về cuối 5 bytes

      feek ( f, -4 , SEEK_CUR ); // dời vị trí hiện hành về trước 4 bytes

* Cho biết vị trí con trỏ file:

ftell ( < FILE *  > );

Ví dụ : 

int size = ftell ( f );  

/*size: khoảng cách từ đầu tập tin đến vị trí hiện hành (tính bằng byte)*/

f. Ví dụ minh hoạ

void KiemTra (FILE *f , char duongdan [ ] )

 {

    f = open ( duongdan , “rt”);

    if ( f == NULL )

   {

      printf (“Khong mo duoc tap tin %s”, duongdan);

   perror (“\nLy do”);

getch ();

   return ;

   }

    printf (“Tap tin %s da duoc mo”, duongdan);

   fclose (f);

 }  

3 Các ví dụ minh hoạ

a. Tập tin văn bản

Ví dụ 1: Viết chương trình tạo tập tin văn bản SO.OUT gồm n số nguyên, các số của dãy được tạo ngẫu nhiên có giá trị tuyệt đối không vượt quá M ( n, M đọc từ tập tin SO.INP). Kết quả chương trình là 1 tập tin văn bản có dòng thứ nhất ghi số n; n dòng tiếp theo ghi các số tạo được, mỗi số trên một dòng.

                                 

# include < conio.h >

# include < stdio.h >

# define in “SO.INP”

# define out “SO.OUT”

int n, M ;

void Nhap ()

{

 FILE *fi;

  fi = fopen ( in , “rt” );

  fscanf ( fi, “ %d %d ”, &n, &M );

  fclose ( fi );

}

void Xuat ()

{

 FILE *fo;

  fo = fopen ( out , “ wt ” );

  fprintf ( fo , “ %d\n”, n );

  randomize ( );

  for ( ; n > 0 ; n -- )

    fprintf ( fo , “%d\n” , random ( ( 2 * M + 1 ) - M ) );

  fclose ( fo );

}

void main ()

{

  clrscr ( );

  Nhap ( );

  Xuat ( );

}

Ví dụ 2: Viết chương trình phát sinh ngẫu nhiên ma trận a kích thước 5x6, lưu ma trận này vào file test.inp. Đọc lại file test.inp đưa dữ liệu vào ma trận b và xuất ra màn hình xem kết quả lưu đúng không? Cấu trúc của file test.inp như sau:

-  Dòng đầu lưu 2 số nguyên: m, n thể hiện số dòng và số cột của ma

trận.

-  m dòng tiếp theo, mỗi dòng gồm n phần tử là giá trị các phần tử

trên một dòng của ma trận.

#include<conio.h>

#include<stdlib.h>

#define MAX 100

#define dl "test.inp"

void LuuFile(int a[MAX][MAX], int m, int n)

{

 FILE *f;

 f=fopen(dl, "wt");

 if(f==NULL)

 {

  printf("\nKhong tao duoc file.");

  getch();

  exit(0);

 }

  fprintf(f, "%d %d\n", m, n);

  for(int i=0; i<m; i++)

 {

    for(int j=0; j<n; j++)

   fprintf(f, "%d\t", a[i][j]);

  fprintf(f, "\n");

 }

 fclose(f);

}

void DocFile(int a[MAX][MAX], int &m, int &n)

{

FILE *f;

 f=fopen(dl, "rt");

 if(f==NULL)

 {

  printf("\nKhong doc duoc file.");

  getch();

  exit(0);

 }

  fscanf(f, "%d%d", &m, &n);

  for(int i=0; i<m; i++)

 {

    for(int j=0; j<n; j++)

   fscanf(f, "%d", &a[i][j]);

 }

 fclose(f);

}

void main()

{

  int a[MAX][MAX], m=5, n=6, i, j;

  int b[MAX][MAX], x, y;

 randomize();

  for(i=0; i<m; i++)

  for(j=0; j<n; j++)

   a[i][j]=random(1000);

 LuuFile(a, m, n);

  DocFile(b, x, y);

  for(i=0; i<x; i++)

 {

  for(j=0; j<y; j++)

   printf("%d\t", b[i][j]);

  printf("\n");

 }

}

Kết quả ví dụ sau khi chạy chương trình, file test.inp có dạng sau:

          

b. Tập tin nhị phân

Viết hàm  đọc/ ghi một danh sách sinh viên của một lớp vào tập tin SV.DAT

SINHVIEN ds[100];

int siso;

void nhap ( )

{

 FILE *fi;

  fi = fopen ( “SV.DAT” , “ rb” );

  fseek ( fi , 0 , SEEK_END );

  siso = ( ftell ( fi ) + 1 ) / sizeof ( SINHVIEN );

  fseek ( fi , 0 , SEEK_SET );

  fread ( ds , sizeof ( SINHVIEN ) , siso , fi );

  fclose ( fi );

}

void xuat ( )

{

 FILE *fo;

  fo = fopen ( “SV.DAT”, “ wb” );

  fwrite ( ds , sizeof ( SINHVIEN ) , siso , fo );

  fclose ( fo );

}

4. Bài tập

1) Viết chương trình tạo tập tin văn bản chứa 1 dãy số nguyên bất kỳ.

2) Viết chương trình tạo tập tin nhị phân chứa 10000 số nguyên bất kỳ ghi vào file SONGUYEN.INP. Mỗi dòng 10 số, sau đó viết chương trình đọc file SONGUYEN.INP, sắp xếp theo thứ tự tăng dần và lưu kết quả vào file SONGUYEN.OUT.

Tags: 
Bạn thấy bài viết này như thế nào?: 
Average: 3 (3 votes)
Ảnh của Tommy Tran

Tommy Tran owner Express Magazine

Drupal Developer having 9+ year experience, implementation and having strong knowledge of technical specifications, workflow development. Ability to perform effectively and efficiently in team and individually. Always enthusiastic and interseted to study new technologies

  • Skype ID: tthanhthuy
  • Phone/Zalo: (+84) 944 225 212
  • WhatsApp: (+84) 944 225 212
  • Line Messenger: (+84) 944 225 212
  • Email: asaleotestf@gmail.com
  • Telegram Messenger: https:/t.me/tommytran0401

Bình luận (0)

 

Add Comment

Plain text

  • No HTML tags allowed.
  • Các địa chỉ web và email sẽ tự động được chuyển sang dạng liên kết.
  • Tự động ngắt dòng và đoạn văn.
CAPTCHA
This question is for testing whether or not you are a human visitor and to prevent automated spam submissions.
2 + 7 =
Solve this simple math problem and enter the result. E.g. for 1+3, enter 4.

Quảng cáo việc làm

 

Thích hợp các bạn nữ mảng thợ may làm việc tại nước NGA

Đơn hàng Tuyển dụng 100 Thợ may đi Nga(đợt 1 tháng 3.2021, đợt 2 tháng 5.2021). Lương thực lãnh 800 USD, bao ăn ở, vé máy bay và visa, phí xuất cảnh(1800 USD)trả khi đi làm có lương. Bạn có thể liên hệ CÔNG TY qua Phone/Zalo: (+84) 944 225 212. Công ty sẽ tư vấn cho bạn.

Xem chi tiết: >>> https://bit.ly/3o9NOfR

Advertisement

 

jobsora

Dich vu khu trung tphcm

Dich vu diet chuot tphcm

Dich vu diet con trung

Quảng Cáo Bài Viết

 
Open AI View cho AI Camera tại Diễn đàn Công nghệ VnExpress 2021

Open AI View cho AI Camera tại Diễn đàn Công nghệ VnExpress 2021

Theo ông Vũ Thanh Thắng, chúng ta đang xây dựng một thành phố thông minh và để các hệ thống thông minh hoạt động được, cần có số lượng camera lớn.

Hot girl bánh tráng trộn chào xuân trong bộ ảnh mới

Hot girl bánh tráng trộn chào xuân trong bộ ảnh mới

Những hình ảnh mới nhất của hot girl bánh tráng trộn trước thềm năm mới khiến người xem thích thú.

Drupal developer - PHPUnit là gì?

Drupal developer - PHPUnit là gì?

Tham gia trong lĩnh vực phát triển phầm mềm mà riêng tôi đề cập ở đây là phát triển web, dù bạn ở khâu nào, developer hay tester bạn đều thấy rằng khi một fix một bug này lại nảy sinh một bug khác, thêm feature này lại ảnh hưởng hoặc gây bug cho feature khác, ngay cả khi muốn optimize và refactor code cũng làm bạn ngại vì sợ sẽ gây ra bug đến với những function trước đó