1. Hãy dành vài giây Đăng nhập hoặc Đăng ký tài khoản để truy cập và sử dụng TBit hiệu quả nhất.
    Ẩn thông báo
  2. Bạn hãy like trang Facebook của TBit để nhận được tin tức công nghệ nhanh nhất từ chúng tôi.
    Ẩn thông báo

[C/C++] - Bài 13: Xử lý dữ liệu kiểu tệp tin (file)

Thảo luận trong 'Lập trình C/C++' bắt đầu bởi Admin, 21/4/15.

0/5, 0 phiếu

    1. Admin Founder

      * 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
      Ví dụ :
      // Khai bao bien con tro file f
      FILE *f;

      B2. Mở tập tin
      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.
      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.
      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.
      Ví dụ:
      fprintf(f,“%d”,x);

      + Ghi một chuỗi ký tự vào tập tin đang mở.
      Ví dụ:
      fputs("Giao trinh BT", f);

      ii)Tập tin nhị phân
      a. Đọc tập tin
      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
      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.
      hoặc fcloseall () ;
      Ví dụ :
      fclose (f) ;

      3. Các thao tác khác trên tập tin
      * Xoá tập tin :
      * Đổi tên tập tin :
      * Di chuyển con trỏ tập tin :
      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:
      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:
      Mã (C++):
      1. #include<conio.h>
      2. #include<stdio.h>
      3. #include<iostream>
      4.  
      5. using namespace std;
      6.  
      7. int n, m;
      8.  
      9. // ghi 2 so nguyen vao file
      10. void GhiFile()
      11. {
      12.    FILE *f;
      13.    // mo file
      14.    f = fopen ("D:\\test.txt" ,"wt");     
      15.    // Nhap n,M tu ban phim
      16.    cout<<"\n n = "; cin>>n;
      17.    cout<<"\n m = "; cin>>m;
      18.    // ghi n, m vao file
      19.    fprintf (f, "%d %d",n,m);
      20.    // dong file
      21.    fclose (f);
      22. }
      23.  
      24. // Doc du lieu tu file test, tinh tong 2 so
      25. void DocFile()
      26. {
      27.    FILE *f;
      28.    // mo file
      29.    f = fopen ("D:\\test.txt" , "rt" );
      30.    // doc du lieu
      31.    fscanf(f, "%d %d", &n, &m );
      32.    // Tinh tong
      33.    int s=n+m;
      34.    // In tong
      35.    cout<<"\n Tong: "<<s;
      36.    // dong file  
      37.    fclose (f);
      38. }
      39.  
      40. // ham main
      41. int main ()
      42. {
      43.    GhiFile();
      44.    DocFile();
      45.    return 0;
      46. }
      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:
      Mã (C++):
      1.  
      2. [plain]
      3.  
      4. #include<conio.h>
      5. #include<stdio.h>
      6. #include<iostream>
      7.  
      8. using namespace std;
      9.  
      10. //doc du lieu tu tap tin
      11. void Doc_File(int **A,int &n) {
      12.   FILE*f = fopen("input.txt","rb");
      13.   fscanf(f,"%d",&n);
      14.   *A = new int [n];
      15.   cout<<"Ma Tran Lien Ket Cua Do Thi";
      16.   for(int i =0;i<n;i++) {  
      17.   A[i] = new int [n];
      18.   cout<<endl;
      19.   for(int j =0;j<n;j++) {  
      20.   fscanf(f,"%d",&A[i][j]);
      21.   cout<<" "<<A[i][j];
      22.   }
      23.   }
      24.   fclose(f);
      25. }
      26.  
      27. //ham tra ve so thanh phan lien thong cua do thi
      28. int TPLien_Thong(int **A, int n) {
      29.   char*DanhDau = new char [n];
      30.   char ThanhCong;
      31.   int Dem=0, i,j, MLT=0;
      32.   //khoi tao cac dinh chua danh dau
      33.   for( i = 0; i<n; i++)
      34.   DanhDau[i] = 0;
      35.   do {  
      36.   j = 0;
      37.   //tim 1 dinh chua duoc danh dau
      38.   while(DanhDau[j]==1)
      39.       j++;
      40.       //danh dau dinh tim duoc     
      41.   DanhDau[j] = 1;
      42.   //tang so dinh danh dau len 1
      43.   Dem++;
      44.   //tang so thanh phan lien thong len 1
      45.   MLT++;
      46.   do {
      47.       ThanhCong =0;
      48.       for(i = 0; i<n; i++)
      49.       if(DanhDau[i]==1)
      50.       for(j = 0; j<n; j++)
      51.       if (DanhDau[j] == 0 && A[i][j] > 0) {
      52.         DanhDau[j] = 1;
      53.         ThanhCong =1;
      54.       Dem++;
      55.       if(Dem == n) return MLT;
      56.       }
      57.       }while (ThanhCong == 1); 
      58.        //lap lai khi con dinh chua duoc danh dau
      59.       }  while(Dem<n);
      60.    return MLT;
      61. }
      62.  
      63. //ham main
      64. int main() {
      65.   int **A,n;
      66.   Doc_File(A,n);
      67.   cout<<"\nTHANH PHAN LIEN THONG: "<<TPLien_Thong(A,n);
      68.   delete *A;
      69.   return 0;
      70. }
      71.  
      72. [/plain]
       

      Các file đính kèm:

      Đang tải...
    2. Admin

      Admin Founder Thành viên BQT

      Điểm:
      10.012ß
      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:
      Mã (C++):
      1. [plain]
      2.  
      3. #include<conio.h>
      4. #include<stdio.h>
      5. #include<iostream>
      6. #include <stdlib.h>
      7. #include <string.h>
      8.  
      9. #define fio "Products.txt"
      10. #define fbin "Products.dat"
      11. using namespace std;
      12.  
      13. typedef struct products{  
      14.   char Id[50], name[50];
      15.   int quantity; // so luong  
      16.   double cost; // gia  
      17. } product;
      18.  
      19. void input(product prd[], int *n);
      20. void writeBin(product prd[], int n);
      21. void write(product prd[], int n);
      22. void sort_cost(product prd[], int n);
      23. void readBin(product prd[], int *n);
      24. void output(product prd[], int n);
      25. void search_id(product prd[], int n, char id[]);
      26. void search_name(product prd[], int n, char name[]);
      27. void search(product prd[], int n);
      28.  
      29. // ham main
      30. int main() {
      31.   product prd[50];
      32.   int n, i;
      33.   FILE *f = fopen(fio, "r");  
      34.   int select;
      35.   do {
      36.   printf("Products:\n-----------------\n");
      37.   printf("1: input\n2: read and sort by cost\n3: Search\n4: exit\n");
      38.   printf("Enter the number to work: ");
      39.   scanf("%d", &select);
      40.   switch(select){
      41.   case 1: {
      42.   printf("1: INPUT\n");
      43.   input(prd, &n);
      44.   write(prd, n);
      45.   break;
      46.   }
      47.   case 2: {
      48.   printf("2: READ AND SORT BY COST\n");
      49.   printf("Befor sort:\n--------------\n");
      50.   readBin(prd, &n);
      51.   output(prd, n);
      52.   sort_cost(prd, n);
      53.   write(prd, n);
      54.   printf("After sort:\n--------------\n");
      55.   readBin(prd, &n);
      56.   output(prd, n);
      57.   break;
      58.   }
      59.   case 3: {
      60.   printf("SEARCH\n");
      61.   search(prd, n);
      62.   break;
      63.   }
      64.   case 4: return 0;
      65.   default : printf("Error select !"); break;
      66.   }
      67.   }
      68.   while (select != 4);
      69.   return 0;
      70. }
      71.  
      72. // ham input
      73. void input(product prd[], int *n){
      74.   int i;
      75.   char s[50];
      76.   printf("Enter the number of products: ");
      77.   scanf("%d", n);
      78.   gets(s);
      79.   printf("\n");
      80.   for (i = 0; i < (*n); i++){
      81.   printf("Enter the Id of products %d : ", i+1);
      82.   gets(prd[i].Id);
      83.   printf("\tEnter the nam of products %d : ", i+1);
      84.   gets(prd[i].name);
      85.   printf("\tEnter the quantity of products %d : ", i+1);
      86.   scanf("%d", &prd[i].quantity);
      87.   printf("\tEnter the cost of products %d : ", i+1);
      88.   scanf("%lf", &prd[i].cost);
      89.   gets(s);
      90.  
      91.   }
      92. }
      93.  
      94. // ghi
      95.  
      96. void writeBin(product prd[], int n){
      97.   FILE *f = fopen(fbin,"wb");;
      98.   int i;
      99.   if(f==NULL) printf("Error load file");
      100.   else fwrite(prd,sizeof(product),n,f);
      101.   fclose(f);
      102. }
      103.  
      104. void write(product prd[], int n){
      105.   int i;
      106.   FILE *f = fopen(fio, "w");
      107.   if(f==NULL) printf("Error load file");
      108.   fprintf(f, "%-10s %-15s %-10s %-10s\n", "Id", "Name", "Quantity", "Cost");
      109.   for (i = 0; i < n; i++)
      110.   fprintf(f, "%-10s %-15s %-10d %-10.2lf\n", prd[i].Id, prd[i].name, prd[i].quantity, prd[i].cost);
      111.   fclose(f);
      112.   writeBin(prd, n);
      113.   printf("input and write success to file!\n");
      114. }
      115.  
      116. void sort_cost(product prd[], int n){
      117.   int i, j;
      118.   for (i = 0; i < n - 1; i++){
      119.   for (j = i + 1; j < n; j++){
      120.   if (prd[i].cost > prd[j].cost){
      121.   product temp = prd[i];
      122.   prd[i] = prd[j];
      123.   prd[j] = temp;
      124.   }
      125.   }
      126.   }
      127. }
      128.  
      129.  
      130. void output(product prd[], int n){
      131.   int i;
      132.   printf("%-10s %-10s %-15s %-10s %-10s\n", "Order", "Id", "Name", "Quantity", "Cost");
      133.   for (i = 0; i < n; i++)
      134.   printf("%-10d %-10s %-15s %-10d %-10.2lf\n", i + 1, prd[i].Id, prd[i].name, prd[i].quantity, prd[i].cost);
      135. }
      136.  
      137.  
      138. void readBin(product prd[], int *n){
      139.   FILE *f = fopen(fbin,"rb");
      140.   fseek(f,0,SEEK_END); //Nhay ve cuoi file, di chuyen di 0 vi tri
      141.   (*n) = (ftell(f)+1)/sizeof(product); //ftell(); tra ve vi tri hien tai cua con tro
      142.  
      143.   // SEEK_CUR: di chuyen bat dau tu vi tri hien tai cua con tro, chi dung trong fseek()
      144.   fseek(f,0,SEEK_SET); //Nhay ve dau file, di chuyen di 0 vi tri
      145.   fread(prd,sizeof(product),(*n),f);
      146.   fclose(f);
      147. }
      148.  
      149. void search_id(product prd[], int n, char id[]){
      150.   int i, check = 0;
      151.   for (i = 0; i < n; i++){
      152.   if (strcmp(id, prd[i].Id) == 0){
      153.   check = 1;
      154.   printf("%-10s %-10s %-15s %-10s %-10s\n", "Order", "Id", "Name", "Quantity", "Cost");
      155.   printf("%-10d %-10s %-15s %-10d %-10.2lf\n", i + 1, prd[i].Id, prd[i].name, prd[i].quantity, prd[i].cost);
      156.   break;
      157.   }
      158.   if (check == 0 && i == n - 1)
      159.   printf("Not found product have Id is %s !\n", id);
      160.   }
      161. }
      162.  
      163. void search_name(product prd[], int n, char name[]){
      164.   int i, check = 0;
      165.   for (i = 0; i < n; i++){
      166.   if (strcmp(name, prd[i].name) == 0){
      167.   check = 1;
      168.   printf("%-10s %-10s %-15s %-10s %-10s\n", "Order", "Id", "Name", "Quantity", "Cost");
      169.   printf("%-10d %-10s %-15s %-10d %-10.2lf\n", i + 1, prd[i].Id, prd[i].name, prd[i].quantity, prd[i].cost);
      170.   break;
      171.   }
      172.   if (check == 0 && i == n - 1)
      173.   printf("Not found product have name is %s !\n", name);
      174.   }
      175. }
      176.  
      177. void search(product prd[], int n){
      178.   int select;
      179.   char s[50];
      180.   do{
      181.   printf("\t1: Id\n\t2: Name\n\t3: exit search\nEnter the type you want search: ");
      182.   scanf("%d", &select);
      183.   gets(s);
      184.   switch(select){
      185.   case 1: {
      186.   printf("Enter Id want search: ");
      187.   char id[50];
      188.   gets(id);
      189.   search_id(prd, n, id);
      190.   break;
      191.   }
      192.   case 2: {
      193.   printf("Enter name want search: ");
      194.   char name[50];
      195.   gets(name);
      196.   search_name(prd, n, name); break;
      197.   }
      198.   case 3: return;
      199.   default : printf("Error select !"); break;
      200.   }
      201.   }while (select != 3);
      202. }
      203.  
      204. [/plain]
       
    3. binhln

      binhln TBit-Member

      Điểm:
      Anh cho em hỏi cái chỗ gets(s) trong hàm input và hàm search nó báo lỗi identifier get is undefined
       
    4. Admin

      Admin Founder Thành viên BQT

      Điểm:
      10.012ß
      Em xem lại code của mình xem có phải làgets không,get là không đúng nhé.
       
Từ khóa:

Chia sẻ trang này

Đang tải...