Một số khái niệm về tậptin (file) (1)
LẬP TRÌNH CĂN BẢN
l Tại sao ta cần đến kiểu tậptin? l Cho phép lưu trữ dữ liệu ở bộ nhớ ngoài (đĩa). l Khi kết thúc chương trình thì dữ liệu vẫn còndo
KIỂU TẬP TIN
đóchúng ta cóth ể sử dụng nhiều lần. l Kích thước lớn dữ liệu không hạn chế.
1 3
Một số khái niệm về tậptin (file) (2)
Nộidung chươngnày
l Có3lo ại dữ liệu kiểu tậptin: l Tậptin văn bản(Text File)
l Một số khái niệm về tậptin l Các thao tác trên tậptin l Truy cập tậptin văn bản l Truy cập tậptinnh ị phân
l Dùng để ghi các ký tự lên đĩa(d ưới dạng mã Ascii) l Cóch ứa: l Ký hiệu‘\n’:xu ống dòng l Kí tự EOF (End Of File)cómã Ascii là26: n ằm ở cuối tậptin
l Tậptin định kiểu(Typed File)
l Gồm nhiều phần tử cócùng ki ểu: char,int, long,struct… l Được lưu trữ trên đĩa dưới dạng một chuỗi cácbyteliên t ục.
l Tậptin không định kiểu(UntypedFile)
l Gồm các cấu trúc dữ liệu mà ta không quan tâm đến nộidung
hoặc kiểu của nó.
l Tach ỉ lưu ý đến các yếu tố vật lý của tậptin như độ lớn, ...
2 4
Khai báo biến tậptin
Một số khái niệm về tậptin (file)(3)
l Biến tậptin
l Cúpháp :
FILE
l Được dùng để đại diện cho một tậptin l Các thao tác lên tậptin s ẽ được thực hiện thôngquabi ến này
l Các bi ến trong danh sách ph ải làcáccontr
ỏ và
l Con trỏ tậptin
l Tại mỗi thời điểm, sẽ có một vị trí của tậptinmà t ại đóvi ệc
được phân cách bởi dấu phẩy(,).
đọc/ghi thôngtin s ẽ xảy ra
l Ví dụ:
ỏ đang chỉ đến vị trí đó
FILE *f1,*f2;
l Tahìnhdungcó1 contr l Sau khi đọc/ghi xong dữ liệu, contr ỏ sẽ chuyển dịch thêm một
phần tử về phía cuối tậptin.
l Sau phần tử dữ liệu cuối cùng của tậptinlà d ấu kết thúc tậptin
EOF
7 5
Các thao tác trên tậptin
Mở tậptin (1)
l Cúpháp :
FILE *fopen(char *Path, const char *Mode)
l Ýngh ĩa:
l Trả về contr ỏ tậptin c ủa tậptin được mở l Trả về NULL nếu có lỗi
l Khai báo biến tậptin l Mở tậptin l Đóng tậptin l Kiểm tra đến cuối tậptin hay chưa? l Di chuyểncontr ỏ tậptin v ề đầu tậptin -Hàm
rewind()
8 6
Mở tậptin (2)
Đóng tậptin
l Cúpháp :
l Path:chu ỗi chỉ đường dẫn đến tậptin trên đĩa l Type:chu ỗi xác định cách thức mà tậptin s ẽ mở.Các giátr ị
cóth ể của Mode:
int fclose(FILE *f) l Ghi dữ liệu còn lại trong vùng đệm vào tậptinvà đóng lại tậptin l flàcontr ỏ tậptin được mở bởi hàm fopen() l Giátr ị trả về là0báo r ằng việc đóng tậptinthành công l Giátr ị trả về là EOF nếu cóxu ất hiện lỗi
l Cúpháp :
int fcloseall()
l Đóng tất cả các tậptin l ại l Trả về tổng số các tậptin được đóng lại l Nếu không thành công, kết quả trả về làEOF
11 9
Mở tậptin (3)
Kiểm tra đến cuối tậptin hay chưa?
l Ví dụ: Mở một tậptintênTEST.txt để ghi.
l Cúpháp :
int feof(FILE *f)
l Ýngh ĩa:
FILE *f; f =fopen(“TEST.txt”, “w”); if (f!=NULL){
//Các câu l ệnh để thao tác với tậptin // Đóng tậptin
l Kiểm tra xem đã chạm tới cuối tậptin hay chưa. l Trả về EOF nếu cuối tậptin được chạm tới, ngược lại
}
trả về 0.
=> mở tậptin để ghi => nếu tậptin đã tồn tại rồi thì tậptin s ẽ bị xóa và một
tậptin m ới được tạo ra
12 10
Di chuyểncontr ỏ tậptin v ề đầu tậptin -Hàmrewind()
Ghi dữ liệu lên tậptin văn bản(1)
l Cúpháp:
l Hàm putc()
void rewind(FILE *f)
int putc(intc, FILE *f)
l Ýngh ĩa:
l Làm chocontr ỏ quay về đầu tậptin như khi mở nó
l Được dùng để ghi một ký tự lên một tậptin văn bản đang được mở (liên kết vớicontr ỏ f) để làm việc
l c chứa mã Ascii của ký tự l Hàm này trả về EOF nếu gặp lỗi
13 15
Truy cập tậptin văn bản
Ghi dữ liệu lên tậptin văn bản(2)
l Hàm fputs()
int fputs(const char *buffer, FILE *f)
l Ghi dữ liệu lên tậptin văn bản l Đọc dữ liệu từ tập tin văn bản
l Được dùng để ghi một chuỗi ký tự chứa trong vùng
đệm lên tậptin văn bản
l Hàm này trả về giátr ị 0 nếu buffer chứa chuỗi rỗng và
trả về EOF nếu gặp lỗi
14 16
Ghi dữ liệu lên tậptin văn bản(3)
Đọc dữ liệu từ tập tin văn bản (1)
l Ví dụ: Viết chương trình ghi chuỗi ký tự lên tậptin văn bản
l Hàm getc()
D:\\Baihat.txt
int getc(FILE *f)
l Được dùng để đọc dữ liệu từ tập tin văn bản đang được mở
để làm việc (liên kết với f)
l Hàm này trả về mã Ascii của một ký tự được đọc(k ể cả
EOF)
19 17
Ghi dữ liệu lên tậptin văn bản(3)
Đọc dữ liệu từ tập tin văn bản (2)
l Hàm fgets()
l Hàm fprintf()
char *fgets(char *buffer, int n, FILE *f)
fprintf(FILE *f, const char *format,varexpr)
l Được dùng để đọc1chu ỗi ký tự từ tậptin văn bản đang được mở
(liên kết vớicontr ỏ f)
l Được dùng để ghi dữ liệu có định dạng lên tậptin văn bản. l format:chu ỗi định dạng(gi ống với các định dạng của hàm
printf())
l Đọc cho đến khi đủ nký t ự hoặc gặp ký tự xuống dòng‘\n’(ký t ự này cũng được đưa vào chuỗi kết quả) hay gặp ký tự kết thúc EOF (ký tự này không được đưa vào chuỗi kết quả)
l varexpr:danh sách các bi ểu thức, mỗi biểu thức cách nhau
dấu phẩy(,)
l buffer:ch ỉ đến cùng nhớ đủ lớn chứa các ký tự nhận được l Ký tự NULL (‘\0’) tự động được thêm vào cuối chuỗi kết quả lưu
trong vùng đệm
l Hàm trả về địa chỉ đầu tiên của vùng đệm khi không gặp lỗi và
chưa gặp ký tự kết thúcEOF. Ngược lại,hàm tr ả về giátr ị NULL
20 18
Đọc dữ liệu từ tập tin văn bản (3)
Truy cập tậptinnh ị phân
l Hàm fscanf()
fscanf(FILE *f, const char *format,varlist)
l Được dùng để đọc dữ liệu từ tậptin văn bản vào danh
l Ghi dữ liệu lên tậptinnh ị phân l Đọc dữ liệu từ tậptinnh ị phân l Di chuyểncontr ỏ tậptin l Ví dụ
sách các biến theo định dạng.
l format:chu ỗi định dạng(gi ống hàm scanf()) l varlist:danh sách các bi ến mỗi biến cách nhau dấu
phẩy(,).
21 23
Đọc dữ liệu từ tập tin văn bản (4)
Ghi dữ liệu lên tậptinnh ị phân
l Ví dụ: Viết chương trình chép tậptin D:\Baihat.txt ở trênsang
l Hàm fwrite()
tậptin D:\Baica.txt.
size_tfwrite( const void *ptr, size_t size, size_t n, FILE *f)
l ptr: contr ỏ chỉ đến vùng nhớ chứa thôngtin c ần ghi lên tập
tin.
l n: số phần tử sẽ ghi lên tậptin. l size:kích th ước của mỗi phần tử. l f: contr ỏ tậptin đã được mở. l Giátr ị trả về của hàm này là số phần tử được ghi lên tậptin.
Giátr ị này bằng ntr ừ khi xuất hiện lỗi.
22 24
Ví dụ
Đọc dữ liệu từ tậptinnh ị phân
l Viết chương trình ghi lên tậptinCacSo.Dat3giátr
l Hàm fread()
size_tfread( const void *ptr, size_t size, size_t n, FILE *f)
ị số (thực, nguyên,nguyên dài). Sau đó đọc các số từ tậptin v ừa ghi và hiển thị lên màn hình
l ptr: contr ỏ chỉ đến vùng nhớ sẽ nhận dữ liệu từ tậptin l n: số phần tử được đọc từ tậptin l size:kích th ước của mỗi phần tử l f: contr ỏ tậptin đã được mở l Giátr ị trả về của hàm này là s ố phần tử đã đọc được từ ị này bằngn haynh ỏ hơn n nếu đã ch ạm
tậptin.Giátr đến cuối tậptinho ặc có lỗi xuất hiện
27 25
Di chuyểncontr ỏ tậptin
l Hàm fseek()
int fseek(FILE *f, long offset, int whence)
l Được dùng để di chuyểncontr ỏ tậptin đến vị trích ỉ định l f: contr ỏ tậptin đang thao tác l offset: số byte cần dịch chuyểncontr ỏ tậptin k ể từ vị trí trước đó.Ph ần
tử đầu tiên là vị trí0.
l whence: vị trí bắt đầu để tínhoffset,ta cóth ể chọn điểm xuất phát là
l Kết quả trả về của hàm là0 n ếu việc di chuyển thành công. N ếu không
thành công, 1giátr ị khác0 ( đólà1mã l ỗi) được trả về.
26