Download as pdf or txt
Download as pdf or txt
You are on page 1of 37

Lập trình với tập tin

Nguyễn Đông Hà
Khoa CNTT – ĐH KHTN

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Lập trình với tập tin
„ Dữ liệu của chương trình được lưu trữ trong bộ
nhớ chính (các biến bộ nhớ), không được lưu
trữ cho lần chạy kế tiếp của chương trình
„ Mục đích chính của việc lập trình với tập tin là
nhằm để lưu trữ dữ liệu vào bộ nhớ phụ và
truy xuất trở lại khi cần thiết

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Phân loại tập tin
„ Tập tin văn bản
„ có thể xem nội dung bằng lệnh type của hệ điều
hành DOS
„ được soạn thảo bằng các chương trình soạn thảo
văn bản đơn giản như Notepad của Windows...
„ Tập tin nhị phân
„ không có dạng văn bản ASCII
„ ví dụ: tập tin mã thực thi trên hệ điều hành
(.exe,.com), tập tin văn bản phức hợp (.doc), tập
tin hình ảnh (.jpg)

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Kỹ thuật lập trình tập tin
„ Cácthao tác với tập tin luôn gồm 3 bước
chính sau đây:
„ Mở tập tin để chuẩn bị làm việc
„ Đọc và ghi dữ liệu

„ Đóng tập tin

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Mở tập tin

„ Dùng hàm fopen để mở tập tin theo cú pháp sau:

FILE *fopen(const char *ten_tap_tin,


const char *tuy_chon);

„ Ví dụ:

/* Mo tap tin ten la text.txt de ghi */


fopen( “text.txt” , ”wt” );

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Mở tập tin
„ Các tùy chọn có thể có:
r mở file để đọc, nếu file ko tồn tại, fopen trả về
NULL
w mở file để ghi, nếu file ko tồn tại, tạo file mới, nếu
đã tồn tại, ghi đè lên file cũ ko cần hỏi
a mở file để thêm vào phía sau file đã tồn tại
r+ mở file để đọc viết, ghi đè lên phần dữ liệu đã có
w+ mở file để đọc viết, xóa hoàn toàn phần dữ liệu cũ
a+ mở file để đọc và thêm vào phía sau file cũ

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Mở tập tin
„ Mặc định mở tập tin là tập tin văn bản, để mở
tập tin nhị phân, phần tùy chọn phải thêm vào
ký tự “b”, tức là “wb”, “rb”.. (b: binary)
„ Có thể thêm ký tự “t” vào phần tùy chọn cho
tập tin văn bản, mặc dù không ghi cũng được.
(t: text)

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Mở tập tin
„ Hàm fopen() trả về NULL nếu xảy ra lỗi:
„ Sử dụng tên tập tin không đúng quy tắc
„ Mở tập tin chưa sẵn sàng (đĩa chưa format, chưa
đóng ổ đĩa)
„ Mở tập tin không tồn tại

„ Bất cứ khi nào sử dụng hàm fopen, luôn phải


kiểm tra kết quả trả về xem có thực hiện thành
công hay không

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Các hàm đọc, ghi
„ Đọc các giá trị số (số nguyên, thực, 1 ký tự..)
int fscanf(FILE *tap_tin,
const char * format [ , argument , ...] );

„ Ví d ụ

/* doc mot so nguyen dua vao bien n tu


tap tin duoc dai dien boi con tro ten la
fp */
fscanf(fp ,”%d” , &n);

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Các hàm đọc, ghi
„ Đọc các giá trị chuỗi ký tự
char * fgets (char * chuoi, int sokytu ,
FILE * tap_tin);

„ Ví d ụ

/* Doc mot chuoi ky tu chua toi da


20 ky tu tu tap tin duoc dai dien boi
con tro fp, dua vao bien chuoi ky tu ten
la dong */
fgets(dong,20,fp);

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Các hàm đọc, ghi
„ Ghi
int fprintf (FILE * tap_tin,
const char * ma[ , bien , ...] );

„ Ví d ụ

/* ghi mot so nguyen n ten tap tin duoc


dai dien boi con tro ten la fp */
fprintf(fp,"%d",n);

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Tạo tập tin văn bản mới
„ Gồm 3 bước:
„ Mở tập tin bằng hàm fopen() với tùy chọn “wt”
„ Ghi dữ liệu lên tập tin bằng hàm fprintf()

„ Đóng tập tin bằng hàm fclose()

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Tạo tập tin văn bản mới – ví dụ
void TaoTapTin()
{
FILE* fp;
int x = 10;
fp = fopen(“test.txt”,”wt”);
if(fp != NULL)
{
fprintf(fp, “Chao cac ban !\n”);
fprintf(fp,"x = %d", x);
fclose(fp);
}
else
printf(“Khong the tao tap tin”);
}

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Đọc dữ liệu từ tập tin văn bản có sẵn
„ Gồm 3 bước:
„ Mở tập tin bằng hàm fopen() với tùy chọn “rt”
„ Gọi hàm fscanf() hay fgets() để đọc dữ liệu từ tập
tin vào biến bộ nhớ
„ Đóng tập tin bằng hàm fclose()

„ Dùng hàm fscanf để đọc số nguyên, số thực


hay ký tự; dùng hàm fgets để đọc nguyên một
dòng của tập tin
„ Để kiểm tra đã đến cuối tập tin hay chưa, dùng
hàm feof

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Đọc dữ liệu từ tập tin văn bản – ví dụ

CuuDuongThanCong.com https://fb.com/tailieudientucntt
#define MAXCHAR 255
void DocTapTin()
{
FILE* fp;
char dong[MAXCHAR+1];
fp = fopen(“test.txt”,”rt”);
if(fp != NULL)
{
while(!feof(fp)) /* chua cuoi tt*/
{
if(fgets(dong,MAXCHAR,fp)!=NULL)
printf(“%s”,dong);
}
fclose(fp);
}
else
printf(“Khong the mo tap tin”);
}
CuuDuongThanCong.com https://fb.com/tailieudientucntt
#define MAXCHAR 255
void DocTapTin()
{
FILE* fp;
char dong[MAXCHAR+1];
fp = fopen(“test.txt”,”rt”);
if(fp != NULL)
{
while(!feof(fp)) /* chua cuoi tt*/
{
if(fgets(dong,MAXCHAR,fp)!=NULL)
printf(“%s”,dong);
}
fclose(fp);
}
else
printf(“Khong the mo tap tin”);
}
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Thêm dữ liệu vào cuối tập tin văn bản có sẵn

„ Gồm 3 bước:
„ Mở tập tin bằng hàm fopen() với tùy chọn “at”
„ Ghi dữ liệu thêm vào cuối tập tin bằng hàm
fprintf()
„ Đóng tập tin bằng hàm fclose()

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Ví dụ ghép 2 tập tin
/* Copy du lieu tu tap tin 2 vao phia sau tap
tin 1, tra ve 1 neu thanh cong, tra ve 0 neu
that bai */
int GhepHaiTapTin(char *tap_tin_1,
char *tap_tin_2)
{
FILE *fp1,*fp2;
char dong[MAXCHAR +1];

fp1 = fopen(tap_tin_1,"at");
fp2 = fopen(tap_tin_2,"rt");
if(fp1==NULL || fp2==NULL)
{
printf("Loi mo tap tin\n");
return 0;
}
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Ví dụ ghép 2 tập tin

fprintf(fp1,"\n");
while(!(feof(fp2)))
{
if(fgets(dong, MAXCHAR, fp2) !=NULL)
fprintf(fp1,dong);
}

fclose(fp1);
fclose(fp2);

return 1;
}

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Xử lý tập tin nhị phân
„ Gồm 3 bước:
„ Gọi hàm fopen() với tùy chọn có phối hợp với “b”
„ Gọi hàm fread() hay fwrite() để đọc dữ liệu từ tập
tin vào biến bộ nhớ (là biến kiểu mẫu tin) hay ghi
dữ liệu từ biến bộ nhớ vào tập tin
„ Đóng tập tin bằng hàm fclose()

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Các hàm đọc, ghi tập tin nhị phân
„ Đọ c
int fread (void * vungnho, size_t sobytedoc,
size_t solandoc, FILE * tap_tin);

„ Ví d ụ
/* Doc vung du lieu tren tap tin dai dien
boi con tro fp, co kich thuoc bang
(sizeof) kich thuoc cua 1 mau tin HOCSINH
dua vao bien mau tin hs */
fread(&hs,sizeof(HOCSINH),1,fp);

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Các hàm đọc, ghi tập tin nhị phân
„ Ghi
size_t fwrite ( const void * vungnho,
size_t sobyteghi, size_t solanghi, FILE * tap_tin );

„ Ví d ụ

/* Ghi mau tin hs len tap tin dai dien


boi con tro fp, co kich thuoc bang
(sizeof) kich thuoc cua 1 mau tin
HOCSINH*/
fwrite(&hs,sizeof(HOCSINH),1,fp);

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Xử lý tập tin gồm các mẫu tin
„ Mở tập tin bằng hàm fopen với tùy chọn “r+b”
để đọc và ghi
„ Đóng tập tin bằng hàm fclose
„ Có thể dùng hàm fseek để đưa bộ định vị đọc
ghi đến mẫu tin thích hợp
„ Dùng hàm ftell để ghi nhận lại vị trí của mẫu
tin mà sau này sẽ được cập nhật dữ liệu
„ Vẫn đọc và ghi bằng hàm fread và fwrite

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Tạo một tập tin gồm các mẫu tin
„ Gồm 3 bước:
„ Tạo tập tin bằng hàm fopen() với tùy chọn “wb”
„ Gọi hàm fwrite() ghi dữ liệu từ biến bộ nhớ (là
biến kiểu mẫu tin) vào tập tin
„ Đóng tập tin bằng hàm fclose()

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Tạo một tập tin gồm các mẫu tin
int TaoDanhSachHS(char *ten_tap_tin)
{
HOCSINH dshs[3] =
{
{"993236","Lam Vinh Khang",0,0,0},
{"993237","To My Hien",0,0,0},
{"993238","Van Si Ha",0,0,0}
};

FILE *fp;

fp = fopen(ten_tap_tin,"wb");

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Tạo một tập tin gồm các mẫu tin
if(fp!=NULL)
{
fwrite(dshs,sizeof(HOCSINH),3,fp);
fclose(fp);
return 1;
}
else
{
printf("Khong the tao tap tin!\n");
return 0;
}
}

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Thêm mẫu tin vào tập tin có sẵn
„ Gồm 3 bước:
„ Gọi hàm fopen() với tùy chọn “ab”
„ Gọi hàm fwrite() ghi dữ liệu từ biến bộ nhớ (là
biến kiểu mẫu tin) vào tập tin
„ Đóng tập tin bằng hàm fclose()

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Đọc danh sách mẫu tin từ tập tin
„ Gồm 3 bước:
„ Gọi hàm fopen() với tùy chọn “rb”
„ Gọi hàm fread() để đọc dữ liệu từ tập tin vào biến
bộ nhớ (là biến kiểu mẫu tin)
„ Đóng tập tin bằng hàm fclose()

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Đọc danh sách mẫu tin từ tập tin
int DocDanhSachHS(char *ten_tap_tin)
{
FILE *fp;
HOCSINH hs;

int stt = 0;
fp = fopen(ten_tap_tin,"rb");
if(fp!=NULL)
{
/* Doc tap tin */
....

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Đọc danh sách mẫu tin từ tập tin
while(!feof(fp))
{
stt++;
if(fread(&hs, sizeof(HOCSINH),1,fp)==1)
printf("%5d %6s %20s %f %f %f\n",
stt, hs.maso, hs.hoten, hs.diem1,
hs.diem2,hs.diem3);
}
fclose(fp);
return 1;
}
else
{
printf("Khong the mo tap tin!\n");
return 0;
}
}

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Các hàm quản lý tập tin
„ Xóa tập tin
int remove ( const char *ten_tap_tin);

„ Ví d ụ

char ten_tap_tin[80];
printf(“Nhap ten tap tin muon xoa: ");
gets(ten_tap_tin);
if(remove(ten_tap_tin) == 0)
printf(“Da xoa tap tin”);
else
printf( “Loi xoa tap tin”);

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Các hàm quản lý tập tin
„ Đổi tên tập tin
int rename( const char *ten_cu, const char *ten_moi );

„ Ví d ụ
char ten_cu[80], ten_moi[80];
printf(“Nhap ten hien tai: ");
gets(ten_cu);
printf(“Nhap ten moi: ");
gets(ten_moi);
if (rename( ten_cu, ten_moi) == 0 )
printf(“Da doi ten tap tin”);
else
printf(“Loi doi ten tap tin”);
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Các hàm quản lý tập tin
„ Sao chép tập tin
„ Không có hàm sẵn trong thư viện. Phải tự viết
bằng cách đọc và ghi dữ liệu dạng nhị phân.
„ Tham khảo hàm CopyFile trong sách trang 75.

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Kỹ thuật lập trình tập tin
Tên hàm Chức năng Loại tập tin
fopen mở tập tin (tập tin mới văn bản, nhị phân
hoặc đã có sẵn)
fprintf ghi dữ liệu vào tập tin văn bản
fscanf đọc dữ liệu từ tập tin văn bản
vào biến số nguyên,
thực, ký tự
fgets đọc dữ liệu dòng ký tự văn bản
từ tập tin vào biến
chuỗi ký tự

CuuDuongThanCong.com https://fb.com/tailieudientucntt
Kỹ thuật lập trình tập tin
Tên hàm Chức năng Loại tập tin

fread đọc dữ liệu từ tập tin nhị phân


vào biến
fwrite ghi dữ liệu vào tập tin nhị phân

fclose đóng tập tin sau khi văn bản, nhị


thao tác phân
feof kiểm tra đã đến cuối tập văn bản, nhị
tin hay chưa phân
ftell lấy vị trí hiện tại văn bản, nhị
phân

CuuDuongThanCong.com https://fb.com/tailieudientucntt
CuuDuongThanCong.com https://fb.com/tailieudientucntt

You might also like