Tin Học Cơ Sở 4
Làm Việc Với Tệp Tin (File)
Cơ bản về tập tin
• Lưu trữ trong tập tin: Giá trị nhị phân
• Trường hợp lưu trữ chuẩn (không mã hóa)
– Ký tự: Mã ASCII - UNICODE
– Chuỗi ký tự: Chuỗi mã ASCII của từng ký tự
– Số: chuỗi mã ASCII của ký số hoặc biểu diễn
nhị phân của số.
• Đặc điểm truy xuất dữ liệu trong tập tin:
tuần tự từng byte.
Lê Nguyên Khôi
2
Cơ bản về tập tin
• Hệ điều hành xác định 1 file bằng Absolute
Path hay Relative Path. Đó là 1 chuỗi ký tự.
• Một thí dụ về Absolute Path trong C
– “C:\\TM1\\TM11\\f1.txt” hoặc
– “C:/TM1/TM11/f1.txt”
• Với 1 file nằm trong thư mục hiện hành, chỉ
cần chỉ định file này bằng tên file ngắn gọn
(relative path). Ví dụ : “nhanvien.dat”
Lê Nguyên Khôi
3
Phân loại tập tin
• Tập tin văn bản:
– Dữ liệu lưu trữ là mã ASCII của ký tự chữ số.
01000001010000100011000100110010
‘A’
‘B’
‘1’
‘2’
• Tập tin nhị phân:
– Dữ liệu lưu trữ là dạng nhị phân của dữ liệu.
0100000101000010000000....001100
‘A’
‘B’
‘12’
Lê Nguyên Khôi
4
Hệ điều hành đượ c ủy thác truy xuất tập tin
byte 1800
(4) Địa chỉ
file desc.
đưa vào
biến f của
chương
trình
Bộ nhớ của
chương
trình C
Path, Last accessed date,
filesize, Current position,..
code segment
...........
...........
f= fopen(“t1.txt”.”r”);
.....
Data segment
biến File*f
1800
(3) OS đọc file
description data
OS
(1)chương
trình nhờ
OS mở tập
tin
Disk
(2) OS
kiểm tra
sự tồn tại
của tập tin
Mọi thao tác file trong chương trình đều thông qua biến f
Lê Nguyên Khôi
5
Thao tác file chuẩn là thao tác file thông qua hệ điều hành
Khai báo biến tập tin trong C
FILE *f ;
Chú ý:
• Kiểu FILE được khai báo trong thư viện
stdio.h
• Khai báo File *f; là SAI.
Lê Nguyên Khôi
6
Hai thao tác cơ bản với tập tin
• Đọc dữ liệu từ tập tin ra biến Đọc file
• Ghi dữ liệu từ biến vào tập tin Ghi file
Lê Nguyên Khôi
7
Các bướ c đọ c file
(1)
(2)
(3)
(4)
Chọn sách
Mở sách để đọc
Chọn vị trí sẽ đọc
Lặp khi chưa xong
(4.1) Đọc dữ liệu vào đầu
(4.2) Xử lý dữ liệu trong đầu
(5) Đóng sách
(1)
(2)
(3)
(4)
Chọn file (hàm main làm)
Mở file để đọc
Chọn vị trí sẽ đọc
Lặp khi chưa xong
(4.1) Đọc dữ liệu từ filebiến
(4.2) Xử lý biến
(5) Đóng file
• Nếu đọc dữ liệu từ đầu file thì bỏ qua bước chọn vị
trí sẽ đọc. Vị trí mặc định của file ngay sau khi mở
file là đầu file.
Lê Nguyên
Khôi thì tên file là tham số.
8
• Nếu viết
hàm
Các bướ c ghi file
(1)
(2)
(3)
(4)
Chọn sách
Mở sách để ghi
Chọn vị trí sẽ ghi
Lặp khi chưa xong
(4.1) Chuẩn bị dữ liệu trong đầu
(4.2) Ghi dữ liệu trong đầu lên file
(5)
Đóng sách
(1)
(2)
(3)
(4)
Chọn file (hàm main làm)
Mở file để ghi
Chọn vị trí sẽ ghi
Lặp khi chưa xong
(4.1) Chuẩn bị giá trị cho biến
(4.2) Ghi biến File
(5) Đóng file
• Nếu ghi dữ liệu từ đầu file thì bỏ qua bước chọn vị trí sẽ
ghi. Vị trí mặc định của file ngay sau khi mở file là đầu file.
• Nếu viết hàm thì tên file là tham số.
Lê Nguyên Khôi
9
Thao tác file chuẩn
•
•
•
•
•
•
•
Thư viện stdio.h
Mở file
Đóng file
Di chuyển trong file
Kiểm tra đã hết file chưa?
Thao tác với vị trí hiện hành
Đổi tên/hủy 1 file đã đóng
Lê Nguyên Khôi
10
Mở file
• FILE* fopen (const char* filename, const char* mode);
•
mode
Text file
Binary file
Description
“r”, “rt”
“rb”
read
“w”, “wt”
“wb”
write, ghi đè nếu file đã tồn tại
“a”
“a”
append, mở mới nếu file chưa có
“r+”, “r+t”
“r+b”
mở để vừa đọc vừa ghi
“w+”, “w+t”
“w+b”
mở để vừa đọc vừa ghi
“a+”, “a+t”
“a+b”
mở để vừa đọc + ghi ở cuối
file,
mở mới nếu file chưa tồn tại.
• Trả trị: NULL : thất bại Khác NULL: thành công.
• Ví dụ: FILE* f = fopen(“c:\\tm1\\tm2\\f1.txt” , ”r” );
Lê Nguyên Khôi
11
Đóng file
• int fclose(FILE* f);
– Trả trị: 0: thành công
– Trả giá trị EOF ( hằng -1) thất bại
– Ví dụ:
int
FileExist (const char* fname){
FILE* f = fopen(fname, “r”);
int result = (f==NULL)? 0 : 1;
if (f) fclose(f);
return result;
}
Lê Nguyên Khôi
12
Kiểm tra hết file chưa?
• int feof(FILE* f)
– Trả trị: 1: Hết file rồi
– Trả trị 0: chưa hết file
Lê Nguyên Khôi
13
Di chuyển trong file
• Về đầu file : void rewind (FILE* f);
• Dời n byte từ 1 vị trí:
fseek (FILE* f, long n, long pos);
pos = SEEK_SET (hằng 0) : từ đầu file
pos = SEEK_CUR (hằng 1): từ vị trí hiện hành
pos = SEEK_END (hằng 2): từ cuối file
n>0 : dời tới, n<0: dời lùi, n=0: đứng tại chỗ
Dời quá biên: gây lỗi
Lê Nguyên Khôi
14
Thao tác với vị trí hiện hành
• Lấy vị trí hiện hành trong file:
long ftell(FILE* f);
• Lưu vị trí hiện hành
int fgetpos(FILE *f, fpos_t *pos);
• Thiết lập vị trí hiện hành từ vị trí đã lưu
int fsetpos(FILE *f, const fpos_t *pos);
Lê Nguyên Khôi
15
Thao tác với vị trí hiện hành
long filelength(const char* fname)
{
FILE *f = fopen(fname, “r”);
fseek(f , 0, SEEK_END);
long len = ftell(f);
fclose(f);
return len;
}
Lê Nguyên Khôi
16
Đổi tên/Huỷ 1 file đã đóng
• int rename (const char* oldName,
const char* newName);
• int remove (const char* filename);
• Trả giá trị 0: thành công
• Trả giá trị -1: thất bại
• OS không thể đổi tên/hủy 1 file đang mở
Lê Nguyên Khôi
17
Đọc/ghi dữ liệu với file đã mở
Thao tác với Đọc file biến
Ký tự
c=fgetc(f);
char c
Ghi biến filw
fputc(c,f);
Chuỗi ký tự
char S[];
fgets(S, n, f)
fputs (S,f);
Số
fscanf(f,”format”,
&var);
fprintf(f,”format”,
var);
n Cấu trúc
nhị phân
size_t fread
int fwrite
(&Rec,sizeof(struct),n,f) (&Rec,sizeof(struct),
n,f )
Lê Nguyên Khôi
18