Bài 8 : Kiểu File Trong C

4651

Ở bài trước chúng ta đã cùng tìm hiểu kiểu cấu trúc trong c , để tiếp tục ở bài này tôi sẽ giới thiệu với mọi người kiểu file trong c :

  • „ … hiểu file là gì?
  • … cách mở file để ghi dữ liệu?
  • … cách mở file để đọc dữ liệu?
  • … cách mở file để thêm dữ liệu?
  • … cách ghi một chuỗi vào file?
  • … cách đọc một chuỗi từ file?

Kiểu File Trong C Là Gì?

  • File: là một tập hợp dữ liệu liên quan được máy tính ghi lên bộ nhớ thứ cấp (HDD, FDD,…)
  • Khi máy tính đọc file: copy dữ liệu từ bộ nhớ thứ cấp vào bộ nhớ trong của máy.
  • Khi máy tính ghi file: copy dữ liệu từ bộ nhớ trong ra bộ nhớ thứ cấp
  • File được dùng để lưu trữ dữ liệu
  • Buffers: là các vùng đặc biệt làm trung gian để đọc/ghi dữ liệu giữa máy tính và bộ nhớ thứ cấp (chẳng hạn: khi ghi dữ liêu, chương trình sẽ ghi vào buffers trước, rồi sau đó mới ghi vào HDD)

Các bước làm việc với file trong c

  • Khai báo một con trỏ file với từ khóa FILE (nằm trong stdio.h)
  • Mở file để đọc / ghi
  • Đọc / ghi dữ liệu từ file
  • Đóng file

Khai báo file trong c

  • FILE *<biến con trỏ file>
  • Ví dụ: FILE *f; FILE *a;
  • C quan niệm <biến con trỏ file> như là một luồng (stream) để kết nối giữa dữ liệu và thiết bị đầu cuối

file-trong-c

  • C định nghĩa sẵn 3 stream chuẩn, được tự động đóng mở, chúng ta không được định nghĩa lại 3 stream này
    • Stdin – dòng vào chuẩn (keyboard)
    • Stdout – dòng ra chuẩn (screen)
    • Stderr – dòng báo lỗi chuẩn (screen)

Mở file để đọc/ghi

  • Cú pháp: <bien_file> = fopen(“ten_file”, “mode”);
  • Trong đó
    • bien_file: là con trỏ kiểu FILE đã khai báo
    • ten_file: là tên của file cần đọc/ghi dữ liệu
    • mode: là kiểu mở file (để đọc/ghi)
    • Nếu việc mở file không thành công, bien_file = NULL
  • Ví dụ
#include<stdio.h>
main()
{
   FILE *f;
   f = fopen("mydata.txt","w");
   ...
}
#include<stdio.h>
main()
{
   FILE *f1;
   f1 = fopen("c:\mydata.dat","r");
   ...
}

=> Mở file mydata.txt để ghi dữ liệu; mở file c:\mydata.dat để đọc dữ liệu

Modes

mode

Đóng file trong C

  • Sau khi ghi dữ liệu xong, phải đóng file bằng thủ tục:
    • fclose(<con_tro_file>);
    • Ví dụ: fclose(f); fclose(f1);
  • Hàm kiểm tra file đã kết thúc chưa
    • feof(<con_tro_file>);
    • Nếu file đã kết thúc thì feof() = NULL
  • Nếu kết thúc chương trình mà không đóng file, thì khi mở file sẽ không có dữ liệu
  • Dù mở file để đọc / ghi đều nên đóng file sau khi hoàn tất làm việc với file.

Các hàm đọc/ghi file trong C

  • Hàm fgetc(<con_tro_file>);
    • Đọc một kí tự trong file
    • fgetc(stdin) tương đương getchar();
  • Hàm fgets(<con_tro_file>);
    • Đọc một dòng trong file
    • fgets(stdin) tương đương gets();
  • Hàm fputc(‘a’,<con_tro_file>);
    • Ghi một kí tự vào file
    • fputc(‘a’, stdout) tương đương putc(‘a’);
  • Hàm fputs(<con_tro_file>);
    • fputs(s, stdout) tương đương puts(s);
  • Hàm fprintf(<con_tro_file>, s);
    • Ghi một xâu s (có định dạng) vào file
  • Hàm fscanf(<con_tro_file>,s);
    • Đọc dữ liệu từ file

Ví dụ đọc/ghi file trong c

#include<stdio.h>
int main (void)
{
   int account;
   char name[30];
   double balance;
   FILE *cfPtr; /* khai báo con trỏ file */
   // mở file clients.dat để ghi
   cfPtr = fopen( "clients.dat","w");
   // kiểm tra việc mở file có thành công?
   if ( cfPtr == NULL ) {
     printf("Khong the mo duoc file\n");
   }
   else {
     printf(" nhap account, name, and balance.\n");
     printf(" Go EOF (Cltr^z) de ket thuc nhap.\n");
     printf(" ? ");
     scanf(" %d%s%1f ", &account, name, &balance );
     /* ghi account, nam and balance vào file bằng fprintf */
     while ( !feof (stdin ) ) {
       fprintf( cfPtr, "%d %s %.2f\n", account, name, balance );
       printf("?");
       scanf("%d%s%1f", &account, name, &balance );
     }
     fclose( cfPtr ); /* đóng file */
   }
   return 0;
}
/* đọc và ghi dữ liệu từ file */
#include <stdio.h>
int main (void)
{
   int account;
   char name[30];
   double balance;
   FILE *cfPtr; /* khai báo con trỏ file */
   /* mở file để đọc, đồng thời kiểm tra file có tồn tại */
   if (( cfPtr = fopen ( "clients.dat", "r") ) == NULL ) {
     printf ( "khong the mo duoc file\n " );
   } /* end if */
   else { /* đọc dữ liệu từ file */
     printf ( "%-10s%-13s%s\n", "Account", "Name", " Balance " );
     fscanf( cfPtr, "%d%s%1f", &account, name, &balance );
     /* đọc cho đến kết thúc file */
     while ( !feof (cfPtr ) ) {
       printf("%-10d%-13s%7.2f\n", account, name, balance );
       fscanf( cfPtr, "%d%s%1f", &account, name, &balance );
     } /* kết thúc while */
     fclose( cfPtr ); /* đóng file */
   } /* kết thúc else */
   return 0;
} /* end main */

Ví dụ bài tập : Giả sử có file c/data.txt lưu 10 số nguyên 1 5 7 9 8 0 4 3 15 20 . Hãy đọc các số nguyên thêm vào một mãng sau đó sắp xếp tăng dần rồi ghi vào file datasx.txt

#include <stdio.h>
#include<conio.h>
#include<stdlib.h>
#define n 10
void main ( )
   { FILE *fp ; int i, j, t, a[n]
      clrscr ( ) ;
     fp = fopen (" c :\\data.txt ", "rt" ); /* mở file để đọc vào mãng */
     if (fp = NULL)
        { printf ("không mở được file ");
          exit (1);
        }
/* Sắp xếp mãng */
      for ( i=0 ; i<n-1 ; i++)
      for (j=i+1; j<n ; j++)
          if (a[i]<a[j] )
              { t = a[i] ; a[i]=a[j] ; a[j] = t ; }
      fclose (fp);
/* mở file datasx.txt để ghi sau khi sắp xếp */
     fp = fopen ("c:\\datasx.txt ", "wt");
     for ( i=0 ; i<n;i++)
     printf (fp,"%2d", a[i] );
      fclose (fp);
/* đọc dữ liệu từ file cách 2 ( tổng quát hơn ) không phụ thuộc vào n */
    i = 0 ;
while (1)
{ fscanf (fp,"%d",&a[i] ;
   i++;
   if (foef(fp) ) break ;
}

Nguồn : lap trinh c

No votes yet.
Please wait...

BÌNH LUẬN