[Tự học lập trình C/C++] Bài 13: Xử lý tệp tin (file)

---------------------------------
* TÓM TẮT LÝ THUYẾT
---------------------------------

1. Khái niệm tệp tin (file)
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 .

Có 2 loại tập tin thường dùng:
 - 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. Quá trình thao tác trên tập tin gồm 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.

 -----------
- Cụ thể từng bước:
B1: Khai báo
FILE *< tên biến >;

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

FILE *f;

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

Ví dụ :  
//Khai bao bien con tro f
FILE *f;
// Mo tep tin VD1.txt trong C:\
  f = fopen ("C:\\VD1.txt","rt") ;  
 
 Các kiểu truy nhập tập tin thông dụng:  
 t: kiểu truy nhập tập tin đối với dạng tập tin văn bản (text).
b: 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 để thêm vào (append).
r+:   mở ra để đọc và ghi (modify).

  -------------
  B3.  Các hàm đọc ghi nội dung tập tin
   i) Tập tin văn bản
    a. Đọc tập tin
+ Đọc dữ liệu từ một tập tin theo định dạng.
fscanf(<FILE *>, <định dạng>, <các tham biến>);

Ví dụ: 
fscanf(f, "%d", &x);

+ Đọ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.
fgets(<vùng nhớ>, <kích thước tối đa>, <FILE *>);

Ví dụ:
char s[80];
fgets(s, 80, f);
 
  + Đọc một ký tự từ tập tin đang mở.
getc(< FILE * >);

Ví dụ: 
char c=getc(f);

   b. Ghi tập tin
   + Ghi dữ liệu theo một định dạng nào đó vào tập tin.
fprintf(<FILE *>, <định dạng>[, <các tham biến>]);

Ví dụ: 
fprintf(f,“%d”,x);

   + Ghi một chuỗi ký tự vào tập tin đang mở.
fputs(<chuỗi ký tự>, <FILE*>);

Ví dụ:
fputs("Giao trinh BT", f);

  ii)Tập tin nhị phân
    a. Đọc tập tin
fread(<&ptr>, <size>, <len>, <FILE *>);

Trong đó:
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ị

 Ví dụ: 
int a[30], b, n;
fread(a,sizeof(int), n , f);
fread(&b, sizeof(int), 1 , f);

  b. Ghi tập tin
fwrite(<&prt>, <size>, <len>,<FILE *> );

Trong đó:
ptr: vùng nhớ để lưu dữ liệu ghi.
size: kích thước mỗi ô nhớ (tính bằng byte).
len: độ dài dữ liệu cần ghi.
FILE: ghi vào tập tin nhị

  Ví dụ:
 fwrite(a, sizeof(int), n , f);

  ---------------
  B4.  Đó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)  ;

3.  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ụ : 
// dời vị trí hiện hành về cuối 5 bytes  
      feek ( f , +5 , SEEK_CUR );

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


* 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)*/


---------------------------------
** VÍ DỤ
---------------------------------

Ví dụ 1:

+ Yêu cầu: Viết chương trình
- Nhập vào 2 số nguyên từ bàn phím, ghi 2 số vừa nhập vào tệp tin D:\test.txt
- Đọc 2 số nguyên trong tệp tin D:\test.txt , tính tổng của chúng.

+ Code:

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

using namespace std;

int n, m;
// ghi 2 so nguyen vao file
void GhiFile()
{
FILE *f; 
// mo file
f = fopen ("D:\\test.txt" ,"wt"); 
// Nhap n,M tu ban phim
cout<<"\n n = "; cin>>n;
cout<<"\n m = "; cin>>m;
// ghi n, m vao file
fprintf (f, "%d %d",n,m); 
// dong file
fclose (f);
}

// Doc du lieu tu file test, tinh tong 2 so
void DocFile()
{
FILE *f; 
// mo file
f = fopen ("D:\\test.txt" , "rt" ); 
// doc du lieu 
fscanf(f, "%d %d", &n, &m ); 
// Tinh tong 
int s=n+m;
// In tong
cout<<"\n Tong: "<<s;
// dong file
fclose (f);
}

// ham main
int main () {
GhiFile(); 
DocFile();
return 0;
}

---------------

Ví dụ 2:

+ Yêu cầu: Viết chương trình
  - Đọc file input.txt (dữ liệu đồ thị)
   
     Ví dụ: 
        Đơn đồ thị vô hướng 3 đỉnh, có ma trân kề như sau:
   
     3
     0 1 1
     1 0 1
     1 1 0
   - Tìm số thành phần liên thông
 
  + Code:
 
#include<conio.h>
#include<stdio.h>
#include<iostream>

using namespace std;

//doc du lieu tu tap tin
void Doc_File(int **A,int &n) {
  FILE*f = fopen("input.txt","rb");
  fscanf(f,"%d",&n);
  *A = new int [n];
   cout<<"Ma Tran Lien Ket Cua Do Thi";
   for(int i =0;i<n;i++) {   
      A[i] = new int [n];  
      cout<<endl;  
      for(int j =0;j<n;j++) {      
        fscanf(f,"%d",&A[i][j]);    
        cout<<" "<<A[i][j];    
     }
   }
   fclose(f);
}

//ham tra ve so thanh phan lien thong cua do thi
int TPLien_Thong(int **A, int n) {
    char*DanhDau = new char [n];
    char ThanhCong;
    int Dem=0, i,j, MLT=0;
    //khoi tao cac dinh chua danh dau
    for( i = 0; i<n; i++)
            DanhDau[i] = 0;    
        do {
            j = 0;      
           //tim 1 dinh chua duoc danh dau      
           while(DanhDau[j]==1)
              j++;      
  //danh dau dinh tim duoc  
           DanhDau[j] = 1;      
           //tang so dinh danh dau len 1      
           Dem++;      
           //tang so thanh phan lien thong len 1      
           MLT++;      
          do {      
     ThanhCong =0;      
     for(i = 0; i<n; i++)      
        if(DanhDau[i]==1)      
           for(j = 0; j<n; j++)      
                 if (DanhDau[j] == 0 && A[i][j] > 0) {      
                      DanhDau[j] = 1;      
                      ThanhCong =1;      
                      Dem++;      
                      if(Dem == n) return MLT;      
                  }      
    }while (ThanhCong == 1);  
   //lap lai khi con dinh chua duoc danh dau    
}  while(Dem<n);
return MLT;
}

//ham main
int main() {
   int **A,n;
   Doc_File(A,n);
   cout<<"\nTHANH PHAN LIEN THONG: "<<TPLien_Thong(A,n);
   delete *A;
   return 0;
}

-----------------

Ví dụ 3:

+ Yêu cầu:
Viết một chương trình để quản lý các sản phẩm máy tính xách tay bao gồm các chức năng sau :
Chức năng 1 : sản phẩm nhập khẩu
Chức năng 2 : Sắp xếp sản phẩm
Chức năng 3 : Tìm kiếm sản phẩm

Trong đó:

+ Chức năng 1 :
  – Yêu cầu người sử dụng bao nhiêu sản phẩm cần nhập khẩu , sau đó cho phép người dùng nhập thông tin cho các sản phẩm bao gồm:

  Mã sản phẩm
  Tên sản phẩm
  số lượng sản phẩm
giá sản phẩm

  - Chúng được lưu trong một file văn bản có tên là ” Products.txt ” .

  Ví dụ: "Products.txt" tập tin
   Mã Tên Số lượng Giá ( triệu )
   01 Asus Vivo 3 12
   02 Vaio E 2 10
   03 Acer X 4 11.5

+ Chức năng 2 :
  Cho phép người dùng đọc tập tin ” Products.txt ” ; sắp xếp sản phẩm theo giá sản phẩm, và sau đó lưu các tập tin.

+ Chức năng 3 :
  Người dùng có thể tìm kiếm sản phẩm từ tập tin ” Products.txt” theo mã sản phẩm hoặc tên sản phẩm và thông tin sản phẩm phù hợp .

+ Code:

#include<conio.h>
#include<stdio.h>
#include<iostream>
#include <stdlib.h>
#include <string.h>

#define fio "Products.txt"
#define fbin "Products.dat"
using namespace std;

 typedef struct products{
    char Id[50], name[50];
    int quantity; // so luong
    double cost; // gia
   } product;


void input(product prd[], int *n);

void writeBin(product prd[], int n);

void write(product prd[], int n);

void sort_cost(product prd[], int n);

void readBin(product prd[], int *n);

void output(product prd[], int n);

void search_id(product prd[], int n, char id[]);

void search_name(product prd[], int n, char name[]);

void search(product prd[], int n);

// ham main
int main() {
    product prd[50];
    int n, i;
    FILE *f = fopen(fio, "r");
    int select;
    do {
        printf("Products:\n-----------------\n");
        printf("1: input\n2: read and sort by cost\n3: Search\n4: exit\n");
        printf("Enter the number to work: ");
        scanf("%d", &select);
        switch(select){
            case 1: {
                printf("1: INPUT\n");
                input(prd, &n);
                write(prd, n);
                break;
            }
            case 2: {
                printf("2: READ AND SORT BY COST\n");
                printf("Befor sort:\n--------------\n");
                readBin(prd, &n);
                output(prd, n);
                sort_cost(prd, n);
                write(prd, n);
                printf("After sort:\n--------------\n");
                readBin(prd, &n);
                output(prd, n);
                break;
            }
            case 3: {
                printf("SEARCH\n");
                search(prd, n);
                break;
            }
            case 4: return 0;
            default : printf("Error select !"); break;
        }
    }
    while (select != 4);
    return 0;
}

// ham input
void input(product prd[], int *n){
    int i;
    char s[50];
    printf("Enter the number of products: ");
    scanf("%d", n);
    gets(s);
    printf("\n");
    for (i = 0; i < (*n); i++){
        printf("Enter the Id of products %d : ", i+1);
        gets(prd[i].Id);
        printf("\tEnter the nam of products %d : ", i+1);
        gets(prd[i].name);
        printf("\tEnter the quantity of products %d : ", i+1);
        scanf("%d", &prd[i].quantity);
        printf("\tEnter the cost of products %d : ", i+1);
        scanf("%lf", &prd[i].cost);
        gets(s);
    }
}

// ghi
void writeBin(product prd[], int n){
    FILE *f = fopen(fbin,"wb");;
    int i;
    if(f==NULL) printf("Error load file");
    else fwrite(prd,sizeof(product),n,f);
    fclose(f);
}

void write(product prd[], int n){
    int i;
    FILE *f = fopen(fio, "w");
    if(f==NULL) printf("Error load file");
    fprintf(f, "%-10s %-15s %-10s %-10s\n", "Id", "Name", "Quantity", "Cost");
    for (i = 0; i < n; i++)
        fprintf(f, "%-10s %-15s %-10d %-10.2lf\n", prd[i].Id, prd[i].name, prd[i].quantity, prd[i].cost);
    fclose(f);
    writeBin(prd, n);
    printf("input and write success to file!\n");
}

void sort_cost(product prd[], int n){
    int i, j;
    for (i = 0; i < n - 1; i++){
        for (j = i + 1; j < n; j++){
            if (prd[i].cost > prd[j].cost){
                product temp = prd[i];
                prd[i] = prd[j];
                prd[j] = temp;
            }
        }
    }
}

void output(product prd[], int n){
    int i;
    printf("%-10s %-10s %-15s %-10s %-10s\n", "Order", "Id", "Name", "Quantity", "Cost");
    for (i = 0; i < n; i++)
        printf("%-10d %-10s %-15s %-10d %-10.2lf\n", i + 1, prd[i].Id, prd[i].name, prd[i].quantity, prd[i].cost);
}

 void readBin(product prd[], int *n){
    FILE *f = fopen(fbin,"rb");
    fseek(f,0,SEEK_END); //Nhay ve cuoi file, di chuyen di 0 vi tri
    (*n) = (ftell(f)+1)/sizeof(product); //ftell(); tra ve vi tri hien tai cua con tro
    // SEEK_CUR: di chuyen bat dau tu vi tri hien tai cua con tro, chi dung trong fseek()
    fseek(f,0,SEEK_SET); //Nhay ve dau file, di chuyen di 0 vi tri
    fread(prd,sizeof(product),(*n),f);
    fclose(f);
}

void search_id(product prd[], int n, char id[]){
    int i, check = 0;
    for (i = 0; i < n; i++){
        if (strcmp(id, prd[i].Id) == 0){
            check = 1;
            printf("%-10s %-10s %-15s %-10s %-10s\n", "Order", "Id", "Name", "Quantity", "Cost");
            printf("%-10d %-10s %-15s %-10d %-10.2lf\n", i + 1, prd[i].Id, prd[i].name, prd[i].quantity, prd[i].cost);
            break;
        }
        if (check == 0 && i == n - 1)
            printf("Not found product have Id is %s !\n", id);
    }
}

void search_name(product prd[], int n, char name[]){
    int i, check = 0;
    for (i = 0; i < n; i++){
        if (strcmp(name, prd[i].name) == 0){
            check = 1;
            printf("%-10s %-10s %-15s %-10s %-10s\n", "Order", "Id", "Name", "Quantity", "Cost");
            printf("%-10d %-10s %-15s %-10d %-10.2lf\n", i + 1, prd[i].Id, prd[i].name, prd[i].quantity, prd[i].cost);
            break;
        }
        if (check == 0 && i == n - 1)
            printf("Not found product have name is %s !\n", name);
    }
}

 void search(product prd[], int n){
    int select;
    char s[50];
    do{
        printf("\t1: Id\n\t2: Name\n\t3: exit search\nEnter the type you want search: ");
        scanf("%d", &select);
        gets(s);
        switch(select){
            case 1: {
                printf("Enter Id want search: ");
                char id[50];
                gets(id);
                search_id(prd, n, id);
                break;
            }

            case 2: {
                printf("Enter name want search: ");
                char name[50];
                gets(name);
                search_name(prd, n, name); break;
            }
            case 3: return;
            default : printf("Error select !"); break;
        }
    }while (select != 3);
}


Khoa hoc lap trinh C/C++

------------------------
Xem bài khác:

Quảng cáo

Загрузка...

Categories

8051 (1) AI (1) AI programming (1) amazon (1) Android (27) ASP (1) Assembly (17) Bài giảng (2) Bài giảng lập trình C và Cpp (16) bài giảng quản lý dự án CNTT (1) bài tập java (1) bài tập lập trình (1) Bài viết hay (62) Bản đồ tư duy (1) Bidvertiser (1) Biểu diễn thuật toán (1) bitcoin (1) blockchain (1) Blockchain là gì (1) Bubble-Sort (1) C (77) C Plus Plus (103) C sharp (11) C++ (3) cấu trúc dữ liệu giải thuật (1) Cây (tree) (2) Cây quyết định (3) CDSL phân tán (1) Chữa bài tập Java (1) code assembly (1) Công nghệ điện toán đám mây (1) Công nghệ lập trình (1) Cơ sở dữ liệu (10) CSS (2) Cuộc cách mạng công nghiệp 4.0 (1) Danh ngôn lập trình (1) Danh sách liên kết (list) (1) Datamining (4) Đại số gia tử và ứng dụng (1) đăng ký Amazon (1) Đăng ký hosting (2) đặt hàng trên Amazon (1) Đệ quy (2) Đồ họa (4) Độ phức tạp của thuật toán (1) ebook-csdl (1) ebook-giaithuat (1) ebook-laptrinh (1) ebook-phancung-mang (1) ebook-tinhocungdung (1) ebook-web (1) Exceptions (1) Genetic Algorithm (1) Giải hệ phương trình tuyến tính (5) giải thuật (3) giải thuật Đệ quy (1) Giáo trình (2) Góc học tập (34) Góc suy ngẫm (1) Google App Engine (2) Heap-Sort (1) Hệ quản trị CSDL (1) Học lập trình (125) Học lập trình C và CPP qua ví dụ (15) học lập trình Java (7) HostGator (1) hợp ngữ (1) HPH (25) HTML (1) Hướng Dẫn Đăng Ký Tên Miền và Host Trên Hostgator (1) hướng dẫn mua host (1) hướng dẫn nhận tiền (1) hướng dẫn payoneer (1) Hướng dẫn sử dụng Emu8086 (1) hướng dẫn viết báo (1) hướng đăng ký tên miền (1) Insert-sort (2) iOS (1) Java (50) Java Căn bản (5) java core (3) Java GUI (1) JavaScript (3) Kiếm tiền online (10) Kỹ thuật đồ họa máy tính (9) Kỹ thuật lập trình (16) kỹ thuật SEO (1) Lập trình 8051 với C/C++ (1) Lập trình căn bản (7) Lập trình Cơ sở dữ liệu (2) Lập trình điều khiển thiết bị (1) Lập trình hợp ngữ (1) Lập trình hướng đối tượng (38) Lập trình hướng đối tượng với Java (6) Lập trình mạng (6) Lập trình mobile (3) Lập trình nhúng (1) Lập trình trí tuệ nhân tạo (1) lập trình vi xử lý (1) lập trình viên (1) Lập trình viên độc lập (1) Luyện thi IC3 (4) Lý thuyết Cơ sở dữ liệu (2) Lý thuyết đồ thị (11) Mạng máy tính (1) Mẹo tìm kiếm trên Google (1) Merge-Sort (1) MS Access (1) Mua hàng trên Amazon (1) Nghiên cứu khoa học (1) ngon-ngu-khac (1) Ngôn ngữ lập trình (1) Nhúng code Assembly trong C\C++ (2) Những lỗi thường gặp khi lập trình (1) Oracle (1) Pascal (3) payoneer (1) people-group (1) phần cứng máy tính (1) PHP (1) Quản lý dự án CNTT (1) Queue (hàng đợi) (1) Quick-Sort (1) Seclection-sort (2) SEO (1) SQL (5) Stack (ngăn xếp) (1) Swift (8) tài liệu CNTT miễn phí (2) Tài liệu tham khảo (2) thanh toán quốc tế (1) Thiết kế Web (2) Thủ thuật máy tính (5) thuattoan-khac (1) Thuật toán (41) Thuật toán di truyền (2) Thuật toán Đệ quy (4) Thuật toán K-Mean (1) Thuật toán khác (9) Thuật toán leo đồi (1) Thuật toán ma trận (7) Thuật toán Sắp Xếp -Sort (9) Thuật toán Tìm kiếm - Search (5) Thương mại điện tử (4) Tiện ích máy tính (3) Tìm hiểu Blockchain (1) Tìm kiếm nhị phân (2) Tìm kiếm tuần tự (Line search) (2) Tin học văn phòng (5) Tin tức công nghệ (7) Tính định thức của ma trận (1) Toán rời rạc (12) Trí tuệ nhân tạo (8) Tự học lập trình Android (14) Tự học lập trình C và CPP (14) tự học lập trình iOS (8) Tự học lập trình java qua các ví dụ (7) Ứng dụng cơ sở dữ liệu (1) VB (2) vẽ ngôi nhà (1) ví dụ Assembly (1) xcode (8) XML (1) Xử lý ma trận (mảng 2 chiều) (7) Xử lý mảng 1 chiều (1) Xử lý ngoại lệ (1)