370 likes | 528 Views
CHƯƠNG 9 TẬP TIN (FILE). 1. GiỚI THIỆU. C/C++ hổ trợ 2 hệ thống nhập xuất : Một hệ thống thừa kế từ ngôn ngữ C Một hệ thống nhập xuất hướng đối tượng của C++. . 2. Streams và Files. Hệ thống nhập xuất của C
E N D
1. GiỚI THIỆU • C/C++ hổtrợ 2 hệthốngnhậpxuất: • Mộthệthốngthừakếtừngônngữ C • Mộthệthốngnhậpxuấthướngđốitượngcủa C++.
2. Streamsvà Files • Hệthốngnhậpxuấtcủa C • Cung cấpmộtgiaodiện (interface) nhấtquánđộclậpvớithiếtbịthậtsựmàchươngtrìnhtươngtác. • cungcấpmộtmứcđộtrừutượnggiữalậptrìnhviênvàthiếtbịnhậpxuất. Sựtrừutượngnàyđượcgọi là streamvàthiếtbịthậtsựđượcgọi là file.
3. Streams (dòngnhậpxuất) • Hệthống file của C đượcthiếtkếđểlàmviệcvớinhiềuloạithiếtbịkhácnhaunhưterminals (thiếtbịđầucuối), cácloại ổ đĩa, băngtừ, ... • Hệthống file chuyểnđổimỗiloạithànhmộtthiếtbịlogicgọi là stream.Tấtcảstreamcócùnghành vi
3. Streams (dòngnhậpxuất) • Streamđộclậpvớithiếtbịnêncùngmộthoạtđộngtrênstreamnhưghivàomộttập tin trênđĩacũngcóthểdùngđểghivàoloạithiếtbịkhácnhư console (mànhình). • Cóhailoạistream: • Vănbản (text) • Nhịphân (binary).
3.1. Text Streams • Mộttext stream làmộtchuổicáckýtự. Trongmột text stream, mộtsốkýtựcóthểbịchuyểnđổitùythuộcmôitrường. • Vídụ, kýtự newline ('\n') cóthểbịđổithànhcặpkýtự carriage return/linefeed (kýtựxuốngdòngvàvềđầudòng).
3.1. Text Streams • Khôngcóquanhệmột-mộtgiữacáckýtựđượcviết (hay đọc) vànhữngkýtựtrêncácthiếtbịngoài. Do đósốkýtựđượcviết (hay đọc) cóthểkhácsốsốkýtựtrênthiếtbịngoài.
3.2. Binary Streams • Mộtbinary stream làmộtchuổi bytes tươngứngmột-mộtvớichuổi bytes trênthiếtbịngoài. Nghĩalàkhôngcósựchuyểnđổixảyra. Do đó, số bytes đượcviết (hay đọc) thìbằngvớisố bytes trênthiếtbịngoài.
4. FILES • Một file cóthểlàmộttập tin trênđĩa, một terminal, hay máy in. • Đểtạokếtnối (associate) giữamột stream vớimột file tadùnghoạtđộngmở (open). • Khi file đượcmở, thông tin cóthểđượctraođổigiữa file vàchươngtrình.
4. FILES • Khôngphảitấtcả file đềucócùngkhảnăngnhưnhau. • Vídụ, mộttập tin trênđĩa (file) cóthểhỗtrợtruyxuấtngẫunhiêntrongkhiđómáy in (cũnglà file) thìkhôngthể. • “Tấtcả stream lànhưnhaunhưng file thìkhông".
4. FILES • Đểngắtkếtnốigiữamột stream vớimột file tadùnghoạtđộngđóng (close). Nếuđóngmột file đangmởchoxuất (output) thìnội dung của stream tươngứngđượcviếtrathiếtbịngoài. • Qúatrìnhnàyđượcgọilà flushing vàđảmbảolàkhôngcóthông tin bịđểlạitrongvùngđệm (buffer).
4. FILES • Tấtcả file đượctựđộngđóngkhichươngtrìnhmởchúngkếtthúcbìnhthường. Files khôngđượcđóngkhichươngtrìnhmởchúngbịkếtthúcbấtthườngnhưbịtreo (halt) hay khichươngtrìnhthựchiệnhàm abort(). • Mỗi stream liênđớivớimột file cómộtcấutrúckiểu FILE.
4.1. Cơbảnvềhệthống file Cáchàmliênquanđến file trongthưviệnstdio.h
4.2. Con trỏ file (File pointer) • Con trỏ file làmộtcấutrúckiểu FILE, trỏđếnthông tin về file nhưtên file, trạngthái, vàvịtríhiệnhànhcủa file. • Con trỏ file đượcdùngbởi stream tươngứngđểthựchiệncáchoạtđộngnhậpxuấttrên file. • Cúphápkhaibáo: FILE *fp;
4.3. Mở file • Hàmfopen() mởmột stream vàliênkếtmột file với stream đó. Hàmtrảvềmột con trỏ file trỏđếntập tin đượcmở. • Cúpháp: • filename: chứatên /đườngdẫncủa file • mode: chobiếtmở file theo mode nào. FILE *fopen(const char *filename, const char *mode);
4.3. Mở file • Các mode đểmởtập tin • "r"Nếutập tin đượcmởthànhcông, hàmfopen() nạpnóvàobộnhớvàtrảvề con trỏtrỏđếnkýtựđầutiêncủatập tin. Ngượclại, hàmfopen() trảvề NULL • "w"Nếutập tin tồntại, nội dung củanósẽbịghiđè
4.3. Mở file • "a"Nếutập tin đượcmởthànhcônghàmfopen() nạpnóvàobộnhớvàtrảvề con trỏtrỏđếnkýtựcuốicùngcủatập tin. Nếutập tin khôngtồntại, mộttập tin mớiđượctạo. Trảvề NULL nếukhôngthểmởtập tin. • "r+"Nếutập tin đượcmởthànhcông, hàmfopen() nạpnóvàotrongbộnhớ. Trảvề NULL nếukhôngthểmởtập tin.
4.3. Mở file • "a+"Nếutập tin đượcmởthànhcông, hàmfopen() nạpnóvàobộnhớvàtrảvề con trỏtrỏđếnkýtựđầutiêncủatập tin. Nếutập tin khôngtồntại, mộttập tin mớiđượctạo. Trảvề NULL nếukhôngthểmởtập tin. • Cáchoạtđộngcóthểlàmtrêntập tin: đọc, ghithêmnội dung mớivàocuốitập tin. Khôngthểsửađổinội dung đangcótrongtập tin.
4.3. Mở file • Vídụ: FILE *fp; if((fp = fopen("test.txt","w")) == NULL) { cout << "Cannot open file"; exit(1); }
4.4. Đóng file • Hàmfclose() đóng stream đượcmởbởihàmfopen(). Khihàmđượcgọi, nósẽviếtbấtkỳdữliệunàovẫncòntrong buffer đến file rồiđóng file. • Cúpháp: • fp: là con trỏ file trảvềbởihàmfopen(). intfclose(FILE *fp);
4.5. Ghimộtkýtựđếnmột file • Cóhaihàmxuấtkýtựđến file làputc() vàfputc(). Haihàmnàylàtươngđươngnhau. Hàmputc() ghimộtkýtựđếnmột file đãđượcmởbởihàmfopen(). • Cúpháp: • fplà con trỏ file trảvềbởihàmfopen() • chlàkýtựđượcviếtđến file. intputc(intch, FILE *fp);
VD: đọckýtựtừbànphímvàghivào file đếnkhigặpkt $ • void main() • { • FILE *fp; char ch; • if((fp=fopen(“test.txt”, "w"))==NULL) • { cout << "Cannot open file.\n"; • exit(1); • } • do { • ch = getchar();//đọctừbànphím • putc(ch, fp);//ghivào file • }while (ch != '$'); • fclose(fp);//đóng file • }
4.6. Đọcmộtkýtựtừmột file • Hàmđểđọcmộtkýtựtừfile:getc() vàfgetc() • Đọcmỗilầnmộtkýtựtừ file đượcmởbởihàmfopen() ở chếđộđọc (read). • Cúpháp: intgetc(FILE *fp); • fplà con trỏ file kiểu FILE . • Hàmtrảvềmãasciicủakýtựđượcđọc, trảvề EOF nếumộtlỗixảyra.
void main() • { • FILE *fp; char ch; • if((fp=fopen(”test.txt”, "r"))==NULL) • { • cout << "Cannot open file.\n"; • exit(1); • } • ch = getc(fp); // đọcmộtkýtự • while (ch!=EOF) • { • putchar(ch); // in ramànhình • ch = getc(fp); • }fclose(fp); • }
3.8. Đọcvàviếtchuổitrên file • fgets(): đọcmộtchuổitừ stream tươngứngchođếnkhigặpkýtự newline hay đãđọcđược length-1 kýtự. • Hàmtrảvềstrnếuđọcthànhcôngvàmột con trỏ null nếukhông. • Cúpháp: char *fgets(char *str, int length, FILE *fp);
3.8. Đọcvàviếtchuổitrên file • fputs() ghimộtchuổitrỏđếnbởistrđến stream trỏđếnbởi con trỏ file fp. Hàmtrảvề EOF nếumộtlỗixảyra. • Cúpháp: intfputs(const char *str, FILE *fp);
void main(void) • { • char str[80]; FILE *fp; • if((fp = fopen("teststr.txt", "w"))==NULL) • { • cout << "Cannot open file.\n"; • exit(1); • } • Do { • cout << "Enter a string (CR to quit):\n"; • gets(str); • strcat(str, "\n"); /* add a newline */ • fputs(str, fp); • } while(*str!='\n'); • }
4.9. Hàmfread() vàfwrite() • Hàmfread() vàfwrite() : đọcvàghimộtkhốicủabấtkỳdữliệunàocókíchthướclớnhơn 1 byte • Cúpháp: size_tfread(void *buffer, size_tnumbytes, size_t count, FILE *fp); size_tfwrite(const void *buffer, size_tnumbytes, size_tcount,FILE *fp);
4.10. Hàm rewind() • Hàm rewind() dichuyển indicator đếnđiểmbắtđầucủa file. • Hàmcó prototype nhưsau: void rewind(FILE *fp);
4.11. Hàmferror() • Hàmferror() chobiếtmộthoạtđộngtrên file đãgâyralỗi. • Cúpháp: intferror(FILE *fp); • Hàmtrảvề true nếumộtlỗiđãxảyravớihoạtđộngtrên file trướckhigọihàmferror(), ngượclạitrảvề false.
4.12. Xóa file • Hàm remove() dùngđểxóatập tin. • Cúpháp: int remove(const char *filename); • Hàmtrảvề zero nếuxóathànhcông, ngượclạitrảvề nonzero
4.13. Flushing a stream • Hàmfflush() dùngđểxuấttấtcảnội dung cònlạitrong buffer của stream. • Cúpháp: intfflush(FILE *fp); • Hàmghinội dung còntrong buffer đến file fp. Nếugọihàmfflush() khôngcóđốisốthìtấtcả file đangmở. • Hàmtrảvề 0 nếuthànhcông, ngượclạitrảvề EOF
5. Truyxuất file ngẫunhiên • Đểđọc hay viếttừ hay đếnmộtvịtríbấtkỳtrong file tacầnsựgiúpđỡcủahàmfseek(). Hàmnàydùngđểdichuyểnchỉbáo file. • Cúpháp: intfseek(FILE *fp, long numbytes, int origin);
6. Các stream chuẩn • Khimộtchươngtrìnhthựcthi, ba stream đượcmởtựđộng. Đólàstdin (standard input), stdout (standard output), vàstderr (standard error). stdindùngđểđọctừbànphím, stdoutvàstderrdùngđểviếtđếnmànhình. • Bởivì standard streams làcác con trỏ file nêncóthểdùngcáchàmnhậpxuấttrênchúng.