Professional Documents
Culture Documents
Tập tin
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
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Mở tập tin
Ví dụ:
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
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 ụ
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 ụ
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Các hàm đọc, ghi
Ghi
int fprintf (FILE * tap_tin,
const char * ma[ , bien , ...] );
Ví d ụ
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()
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()
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 ụ
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
CuuDuongThanCong.com https://fb.com/tailieudientucntt
CuuDuongThanCong.com https://fb.com/tailieudientucntt