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