14
GV. GV. Nguyễn Nguyễn Minh Minh Huy Huy Tập Tập tin tin nâng nâng cao cao 1 Kỹ thuật lập trình - Nguyễn Minh Huy

Programming C: Advanced File

Embed Size (px)

Citation preview

Page 1: Programming C: Advanced File

GV. GV. NguyễnNguyễn Minh Minh HuyHuy

TậpTập tin tin nângnâng caocao

1Kỹ thuật lập trình - Nguyễn Minh Huy

Page 2: Programming C: Advanced File

NộiNội dungdung

�� TậpTập tin tin nhịnhị phânphân..

�� TậpTập tin BMP.tin BMP.

2Kỹ thuật lập trình - Nguyễn Minh Huy

Page 3: Programming C: Advanced File

NộiNội dungdung

�� TậpTập tin tin nhịnhị phânphân..

�� TậpTập tin BMP.tin BMP.

3Kỹ thuật lập trình - Nguyễn Minh Huy

Page 4: Programming C: Advanced File

TậpTập tin tin nhịnhị phânphân

�� TậpTập tin vs. tin vs. BộBộ nhớnhớ::�� GiốngGiống nhaunhau: : đềuđều lưulưu trữtrữ dữdữ liệuliệu chươngchương trìnhtrình..

KhácKhác nhaunhau::�� KhácKhác nhaunhau::

Tiêu chí Tập tin (Bộ nhớ ngoài) Bộ nhớ

Tốc độ xử lý Chậm Nhanh

Khả năng truy xuất Tuần tự Ngẫu nhiên

Chi phí Rẻ tiền Đắc tiền

Dung lượng Lớn Nhỏ

4Kỹ thuật lập trình - Nguyễn Minh Huy

Thời gian Lưu trữ lâu dài Lưu trữ nhất thời

Page 5: Programming C: Advanced File

TậpTập tin tin nhịnhị phânphân

�� TậpTập tin tin trongtrong C:C:�� ĐọcĐọc ghighi vùngvùng nhớnhớ bằngbằng cáchcách nàonào??

�� Con Con trỏtrỏ..�� Con Con trỏtrỏ..

�� ĐọcĐọc ghighi tậptập tin tin bằngbằng con con trỏtrỏ tậptập tin.tin.

�� KhaiKhai báobáo: : FILE *FILE *<<TênTên con con trỏtrỏ>.>.FILE *FILE *f1;f1;FILE *FILE *f2;f2;

�� CácCác bướcbước xửxử lýlý tậptập tin:tin:�� BướcBước 1: 1: mởmở tậptập tin.tin.

�� BướcBước 2: 2: thaothao táctác trêntrên tậptập tin.tin.

�� BướcBước 3: 3: đóngđóng tậptập tin.tin.

5Kỹ thuật lập trình - Nguyễn Minh Huy

Page 6: Programming C: Advanced File

TậpTập tin tin nhịnhị phânphân

�� CácCác lệnhlệnh cơcơ bảnbản::�� fopenfopen

fclosefclose..�� fclosefclose..

�� fscanffscanf, , fgetsfgets..

�� fprintffprintf..

6Kỹ thuật lập trình - Nguyễn Minh Huy

Page 7: Programming C: Advanced File

TậpTập tin tin nhịnhị phânphân

�� LệnhLệnh fseekfseek::�� ThayThay đổiđổi vịvị trítrí con con trỏtrỏ tậptập tin.tin.

�� CúCú pháppháp: : fseekfseek((<Con <Con trỏtrỏ tậptập tin>, <tin>, <ĐộĐộ dờidời>, <>, <VịVị trítrí gốcgốc>>));;�� CúCú pháppháp: : fseekfseek((<Con <Con trỏtrỏ tậptập tin>, <tin>, <ĐộĐộ dờidời>, <>, <VịVị trítrí gốcgốc>>));;

�� <<VịVị trítrí gốcgốc>:>:�� SEEK_SET (SEEK_SET (đầuđầu tậptập tin).tin).

�� SEEK_CUR (SEEK_CUR (vịvị trítrí hiệnhiện hànhhành).).

�� SEEK_END (SEEK_END (cuốicuối tậptập tin).tin).

�� ChỉChỉ làmlàm việcviệc vớivới tậptập tin tin đangđang mởmở..FILE FILE *f*f = = fopenfopen((“C:“C:\\\\BaiTap.txt”, “BaiTap.txt”, “rr”);”);if ( if ( ff != NULL )!= NULL )if ( if ( ff != NULL )!= NULL ){{

fseekfseek(( ff, 2, SEEK_CUR , 2, SEEK_CUR )); // ; // ChuyểnChuyển con con trỏtrỏ tớitới 2 bytes.2 bytes.fclosefclose( f );( f );

}}

7Kỹ thuật lập trình - Nguyễn Minh Huy

Page 8: Programming C: Advanced File

TậpTập tin tin nhịnhị phânphân

�� ChếChế độđộ mởmở nhịnhị phânphân::�� BảngBảng chếchế độđộ mởmở tậptập tin:tin:

Chế độ mở Ý nghĩa

r Read-only, mở để đọc dữ liệu (kiểu text).

w Write-only, mở để ghi dữ liệu (kiểu text).

a Append-only, mở để ghi thêm dữ liệu (kiểu text).

[Chế độ mở]+ Kết hợp đọc, ghi cùng lúc.

[Chế độ mở]b Mở kiểu nhị phân (binary).

�� Cho Cho phépphép đọcđọc//ghighi từngtừng byte byte trêntrên tậptập tin.tin.

�� ÁnhÁnh xạxạ từngtừng byte byte tậptập tin tin vàovào từngtừng byte byte bộbộ nhớnhớ..

8Kỹ thuật lập trình - Nguyễn Minh Huy

Page 9: Programming C: Advanced File

TậpTập tin tin nhịnhị phânphân

�� LệnhLệnh freadfread::�� ĐọcĐọc mộtmột block bytes block bytes từtừ tậptập tin.tin.

�� CúCú pháppháp:: freadfread((<<ĐịaĐịa chỉchỉ vùngvùng nhớnhớ>, <>, <KíchKích thướcthước block> , block> , �� CúCú pháppháp:: freadfread((<<ĐịaĐịa chỉchỉ vùngvùng nhớnhớ>, <>, <KíchKích thướcthước block> , block> , <<SốSố block block cầncần đọcđọc>, <Con >, <Con trỏtrỏ tậptập tin>tin>));;

�� TrảTrả vềvề: : sốsố block block đọcđọc đượcđược..

�� KếtKết thúcthúc tậptập tin tin khikhi sốsố block block đọcđọc đượcđược < < sốsố block block cầncần đọcđọc..intint xx;;char *char *p = new char[ 100 ]p = new char[ 100 ];;FILE *f = FILE *f = fopenfopen(“C:(“C:\\\\BaiTap.txt”, “BaiTap.txt”, “rbrb”);”);

if ( f != NULL )if ( f != NULL ){{

freadfread( &x( &x, , sizeofsizeof((intint), 1,), 1, f f )); // ; // ĐọcĐọc 4 bytes 4 bytes vàovào sốsố nguyênnguyên x.x.freadfread( p( p, , sizeofsizeof(char), 100,(char), 100, f f ));// ;// ĐọcĐọc 100 bytes 100 bytes vàovào vùngvùng nhớnhớ p.p.fclosefclose( f );( f );

}}

9Kỹ thuật lập trình - Nguyễn Minh Huy

Page 10: Programming C: Advanced File

TậpTập tin tin nhịnhị phânphân

�� LệnhLệnh fwritefwrite::�� GhiGhi mộtmột block bytes block bytes vàovào tậptập tin.tin.

�� CúCú pháppháp: : fwritefwrite((<<ĐịaĐịa chỉchỉ vùngvùng nhớnhớ>, <>, <KíchKích thướcthước block> , block> , �� CúCú pháppháp: : fwritefwrite((<<ĐịaĐịa chỉchỉ vùngvùng nhớnhớ>, <>, <KíchKích thướcthước block> , block> , <<SốSố block block cầncần đọcđọc>, <Con >, <Con trỏtrỏ tậptập tin>tin>));;

�� TrảTrả vềvề: : sốsố block block ghighi đượcđược..intint xx = 123456;= 123456;char char s[ ]s[ ] = “Hello World”;= “Hello World”;FILE *f = FILE *f = fopenfopen(“C:(“C:\\\\BaiTap.txt”, “BaiTap.txt”, “wbwb”);”);

if ( f != NULL )if ( f != NULL )if ( f != NULL )if ( f != NULL ){{

fwritefwrite( &x( &x, , sizeofsizeof((intint), 1,), 1, f f )); ; // // GhiGhi 4 bytes 4 bytes sốsố nguyênnguyên x.x.fwritefwrite( s( s, , sizeofsizeof(char), (char), strlenstrlen(s),(s), f f )); // ; // GhiGhi 11 bytes 11 bytes chuỗichuỗi s.s.fclosefclose( f );( f );

}}

10Kỹ thuật lập trình - Nguyễn Minh Huy

Page 11: Programming C: Advanced File

TậpTập tin tin nhịnhị phânphân

�� ĐọcĐọc ghighi cấucấu trúctrúc::�� ÁnhÁnh xạxạ cáccác byte byte tậptập tin tin vàovào thànhthành phầnphần cấucấu trúctrúc..

�� HiệuHiệu quảquả hơnhơn đọcđọc ghighi từngtừng thànhthành phầnphần..�� HiệuHiệu quảquả hơnhơn đọcđọc ghighi từngtừng thànhthành phầnphần..

�� ThứThứ tựtự ánhánh xạxạ theotheo thứthứ tựtự khaikhai báobáo thànhthành phầnphần..structstruct PhanSoPhanSo {{

intint tutu;;intint maumau;;

};};

void void docPSdocPS(FILE *f, (FILE *f, PhanSoPhanSo &p) {&p) { // // ĐọcĐọc 8 bytes 8 bytes vàovào phânphân sốsố p.p.void void docPSdocPS(FILE *f, (FILE *f, PhanSoPhanSo &p) {&p) { // // ĐọcĐọc 8 bytes 8 bytes vàovào phânphân sốsố p.p.freadfread( ( &p&p, , sizeofsizeof((PhanSoPhanSo), 1, f ); ), 1, f ); // 4 bytes // 4 bytes đầuđầu vàovào p.tup.tu..

}} // 4 bytes // 4 bytes sausau vàovào p.mau.p.mau.

void void ghiPSghiPS(FILE *f, (FILE *f, PhanSoPhanSo p) {p) { // // GhiGhi 8 bytes 8 bytes phânphân sốsố p p rara tậptập tin.tin.fwritefwrite( ( &p&p, , sizeofsizeof((PhanSoPhanSo), 1, f );), 1, f ); // // p.tup.tu rara 4 bytes 4 bytes đầuđầu..

}} // p.mau // p.mau rara 4 bytes 4 bytes sausau..

11Kỹ thuật lập trình - Nguyễn Minh Huy

Page 12: Programming C: Advanced File

TậpTập tin tin nhịnhị phânphân

�� ThưThư việnviện <<stdint.hstdint.h>:>:�� KíchKích thướcthước sốsố nguyênnguyên baobao nhiêunhiêu bytes?bytes?

�� TùyTùy thuộcthuộc hệhệ máymáy tínhtính..�� TùyTùy thuộcthuộc hệhệ máymáy tínhtính..

�� CầnCần cáccác kiểukiểu sốsố nguyênnguyên kíchkích thướcthước cốcố địnhđịnh..

�� ThưThư việnviện <<stdint.hstdint.h>>

�� KiểuKiểu sốsố nguyênnguyên xácxác địnhđịnh::�� SốSố nguyênnguyên 1 byte: int8_t, uint8_t.1 byte: int8_t, uint8_t.

�� SốSố nguyênnguyên 2 bytes: int16_t, uint16_t.2 bytes: int16_t, uint16_t.

#include#include <<stdint.hstdint.h>>

structstruct PhanSoPhanSo{{�� SốSố nguyênnguyên 2 bytes: int16_t, uint16_t.2 bytes: int16_t, uint16_t.

�� SốSố nguyênnguyên 4 bytes: int32_t, uint32_t.4 bytes: int32_t, uint32_t.

�� SốSố nguyênnguyên 8 bytes: int64_t, uint64_t.8 bytes: int64_t, uint64_t.

12Kỹ thuật lập trình - Nguyễn Minh Huy

{{int32_tint32_t tutu;;int32_tint32_t maumau;;

};};

Page 13: Programming C: Advanced File

NộiNội dungdung

�� TậpTập tin tin nhịnhị phânphân..

�� TậpTập tin BMP.tin BMP.

13Kỹ thuật lập trình - Nguyễn Minh Huy

Page 14: Programming C: Advanced File

TómTóm tắttắt

�� TậpTập tin tin nhịnhị phânphân::

�� TậpTập tin BMP:tin BMP:

14Kỹ thuật lập trình - Nguyễn Minh Huy