VI N ỆVI N Ệ Ệ Ệ CÔNG NGH  THÔNG  CÔNG NGH  THÔNG  TIN VÀ TRUY N Ề TIN VÀ TRUY N Ề THÔNG THÔNG

S CHOOL OF INFORMATION  S CHOOL OF INFORMATION  & COMMUNICATION TECHNOLOGY & COMMUNICATION TECHNOLOGY

TIN HỌC ĐẠI CƯƠNG TIN HỌC ĐẠI CƯƠNG PHẦN 2: LẬP TRÌNH BẰNG NGÔN NGỮ C PHẦN 2: LẬP TRÌNH BẰNG NGÔN NGỮ C

BÀI 8: TỆP DỮ LIỆU BÀI 8: TỆP DỮ LIỆU

11

TỆP DỮ LIỆU TỆP DỮ LIỆU

8.1. Khái niệm và phân loại tệp 8.1. Khái niệm và phân loại tệp 8.2. Các thao tác với tệp 8.2. Các thao tác với tệp 8.2.1. Khai báo  8.2.1. Khai báo 8.2.2. Mở tệp  8.2.2. Mở tệp 8.2.3. Truy nhập tệp văn bản  8.2.3. Truy nhập tệp văn bản 8.2.4. Truy nhập tệp nhị phân  8.2.4. Truy nhập tệp nhị phân 8.2.5. Đóng tệp  8.2.5. Đóng tệp 8.3. Bài tập 8.3. Bài tập

22

TỆP DỮ LIỆU TỆP DỮ LIỆU

8.1. Khái niệm và phân loại tệp 8.1. Khái niệm và phân loại tệp 8.2. Các thao tác với tệp 8.2. Các thao tác với tệp 8.2.1. Khai báo  8.2.1. Khai báo 8.2.2. Mở tệp  8.2.2. Mở tệp 8.2.3. Truy nhập tệp văn bản  8.2.3. Truy nhập tệp văn bản 8.2.4. Truy nhập tệp nhị phân  8.2.4. Truy nhập tệp nhị phân 8.2.5. Đóng tệp  8.2.5. Đóng tệp 8.3. Bài tập 8.3. Bài tập

33

8.1.1. Khái niệm 8.1.1. Khái niệm

ệ ệ

ớ ớ

ế ị ế ị

c l u tr  trên các thi c l u tr  trên các thi

ượ ư ượ ư ề ề

ộ ộ

ớ ớ

ệ ớ ệ ớ

ệ ệ ệ ệ Khái ni m t p Khái ni m t p ữ ệ ợ ộ ậ ữ ệ FileFile) là m t t p h p các d  li u  ữ ệ ợ ộ ậ ữ ệ ) là m t t p h p các d  li u  T p d  li u (  T p d  li u ( ữ ệ ể ể ữ ệ có liên quan v i nhau và có cùng ki u d  li u.  có liên quan v i nhau và có cùng ki u d  li u.  ữ ớ ệ ữ ớ ệ t b  nh  ngoài  T p đ  T p đ t b  nh  ngoài  ứ (đĩa m m, đĩa c ng, CD­ROM…) v i m t tên  ứ (đĩa m m, đĩa c ng, CD­ROM…) v i m t tên  ể ể nào đó đ  phân bi nào đó đ  phân bi

t v i nhau. t v i nhau.

44

Mô hình lưu trữ dữ liệu Mô hình lưu trữ dữ liệu

hoặc 1)1)

Bit – dữ liệu nhỏ nhất (00 hoặc Bit – dữ liệu nhỏ nhất ( Byte – 8 bits - Dùng để lưu trữ các ký tự, Byte – 8 bits - Dùng để lưu trữ các ký tự, số nguyên 1 byte số nguyên 1 byte Trường (Field) – tập các byte dữ liệu Trường (Field) – tập các byte dữ liệu Bản ghi (Record) – tập các trường Bản ghi (Record) – tập các trường Tệp (file) - một tập các bản ghi Tệp (file) - một tập các bản ghi Cơ sở dữ liệu (database) - tập các tệp Cơ sở dữ liệu (database) - tập các tệp

55

Mô hình lưu trữ dữ liệu Mô hình lưu trữ dữ liệu

66

ạ ệ ạ ệ

8.1.2. Phân lo i t p 8.1.2. Phân lo i t p

ự ự

ủ ệ ủ ệ

ườ ườ i  i

ệ ệ ệ ệ

ấ ữ ệ ả ấ ữ ệ ả D a theo b n ch t d  li u c a t p, ng D a theo b n ch t d  li u c a t p, ng ạ ệ ạ ta chia t p thành 2 lo i: ệ ta chia t p thành 2 lo i: ả ả T p văn b n   T p văn b n  ị T p nh  phân ị  T p nh  phân

77

8.1.2. Phân loại tệp (tiếp) 8.1.2. Phân loại tệp (tiếp)

ự ồ ự ồ

ầ ử ủ ầ ử ủ

g m:  g m:

text file):):  c a nó là các kí t  c a nó là các kí t

ể ề ầ ể ề ầ

ể ể

ố ố

ớ Line Feed – có mã ASCII là 10, đ  xu ng dòng m i  – có mã ASCII là 10, đ  xu ng dòng m i ớ

ả text file ệ ả ệ T p văn b n ( T p văn b n ( Các ph n t  Các ph n t ữ ữCh  cái Ch  cái Ch  sữ ố Ch  sữ ố ấ Các d u câu ấ Các d u câu ấ Các d u cách  ấ Các d u cách  ể ự ề ộ ố ể ự ề ộ ố M t s  kí t M t s  kí t Carriage Return – có mã ASCII là 13, đ  v  đ u   – có mã ASCII là 13, đ  v  đ u  CR – Carriage Return  CR –  dòng dòng LF – Line Feed  LF –   ……

88

đi u khi n  đi u khi n

8.1.2. Phân loại tệp (tiếp) 8.1.2. Phân loại tệp (tiếp)

binary file):): binary file

ị ị

ố  c a nó là các s  nh  phân 0 và 1  ố  c a nó là các s  nh  phân 0 và 1

ị ị

ở ở ố ự ố ự

ấ ấ

ự ự c mã hóa là kí t c mã hóa là kí t ả ả

ợ ợ

ệ ệ ộ ườ ộ ườ ng h p riêng c a t p  ng h p riêng c a t p

ị ệ ệ T p nh  phân ( ị T p nh  phân ( ầ ử ủ Các ph n t ầ ử ủ  Các ph n t mã hóa thông tin.  mã hóa thông tin.  ượ ượ Thông tin đ c mã hóa b i các bit nh  phân   Thông tin đ c mã hóa b i các bit nh  phân  ữ ố ể ố ể có th  là s  nguyên, s  th c, các c u trúc d   ữ có th  là s  nguyên, s  th c, các c u trúc d   ệ ệli u…  li u…  ượ ế ượ ế  thì khi đó  N u thông tin đ  thì khi đó   N u thông tin đ ậ ở ị ệ t p nh  phân tr  thành t p văn b n. Vì v y  ậ ở ị ệ t p nh  phân tr  thành t p văn b n. Vì v y  ủ ệ ả ệ t p văn b n là m t tr ủ ệ ả ệ t p văn b n là m t tr ịnh  phân. nh  phân.

99

ủ ệ ủ ệ

8.1.3. Vai trò c a t p 8.1.3. Vai trò c a t p

ắ ắ

ế ế

ươ ươ

ộ ộ

ặ ặ ớ ớ

ể ấ ể ấ

ả ư ả ư ằ ở ộ ằ ở ộ ng ti n dùng đ  c t gi ng ti n dùng đ  c t gi

ể ử ụ ể ử ụ ữ ệ ữ ệ ớ  b  nh  ngoài.  ớ  b  nh  ngoài.  ữ ữ ữ ữ  d    d

t máy  ng trình k t thúc ho c khi t Khi ch t máy  Khi ch ng trình k t thúc ho c khi t thì các thông tin trong b  nh  chính (RAM)  thì các thông tin trong b  nh  chính (RAM)  không còn.  không còn.  ố ư ữ ữ ệ ố ư Mu n l u tr  d  li u lâu dài đ  s  d ng  ữ ữ ệ Mu n l u tr  d  li u lâu dài đ  s  d ng  ầ ữ cho nh ng l n sau ta ph i l u d  li u lên  ầ ữ cho nh ng l n sau ta ph i l u d  li u lên  ể ữ ệ ứ ệ ể ữ ệ ứ t p, t c là đ  d  li u n m  ệ t p, t c là đ  d  li u n m    T p là ph ệ ươ ệ ệ ươ ệ T p là ph ệ ệli u lâu dài. li u lâu dài.

1010

ệ ệ ệ ệ

ả ả

8.1.4. Phân bi 8.1.4. Phân bi

t t p và m ng t t p và m ng

ố ốGi ng nhau: Gi ng nhau: T p h p các ph n t  T p h p các ph n t Khác nhau: Khác nhau:

ớ ớ

ộ ộ

ượ ư ượ ư

ế ế

i lâu dài,  i lâu dài,  ế ế

ng trình k t  ng trình k t

ề ề

ắ ắ c c a m t t p  c c a m t t p  ướ ướ

MảngMảng ộ ượ ư ữ ộ ượ ư ữ Đ c l u tr  trên b  nh  trong  Đ c l u tr  trên b  nh  trong  ẽ ả ủ ữ ệ ủ ẽ ữ ệ D  li u c a m ng s  không  ả D  li u c a m ng s  không  ươ ng trình k t thúc  còn khi ch ươ ng trình k t thúc  còn khi ch ắ ặ ắ ặ t máy. ho c khi t ho c khi t t máy. ả ộ ủ ướ c c a m t m ng  Kích th ả ộ ủ ướ c c a m t m ng  Kích th ướ ỏ ơ ườ ỏ ơ ướ ườ c  ng nh  h n kích th th th c  ng nh  h n kích th ộ ệ ấ ủ c a m t t p r t nhi u. ộ ệ ấ ủ c a m t t p r t nhi u.

ủ c c a  ủ c c a

ệ ồ ạ ệ ồ ạ ươ ươ t máy. t máy. ộ ệ ủ ủ ộ ệ ơ ng l n h n kích th ơ ng l n h n kích th ấ ấ

ề ề

ả ả

T pệT pệ ớ ữ Đ c l u tr  trên b  nh   ớ ữ Đ c l u tr  trên b  nh   ngoài ngoài ữ ệ D  li u trên t p t n t ữ ệ D  li u trên t p t n t ẫ v n còn dù ch ẫ v n còn dù ch thúc hay t thúc hay t ướ ướ Kích th Kích th ớ ườ th ớ ườ th ộ ộ m t m ng r t nhi u. m t m ng r t nhi u.

1111

ậ ậ ợ ợ ầ ử ầ ử ể ể cùng ki u.   cùng ki u.

ứ ứ

ổ ổ

ủ ệ ủ ệ 8.1.5. T  ch c c a t p 8.1.5. T  ch c c a t p

h n t h n t

ượ ượ

ị c v   ị c v

ủ ệ ủ ệ

ệ ệ

ẽ ự ộ ẽ ự ộ ầ ử ầ ầ ử ầ

c a t p trên đĩa.  c a t p trên đĩa.

ị ớ ạ ầ ử ố ượ ệ ị ớ ạ ầ ử ố ượ ệ i h n   trong t p không b  gi ng ph n t S  l i h n   trong t p không b  gi ng ph n t S  l ọ ượ ố ứ ề ỗ ệ ầ ử ố ỗ ệ ượ c g i là   đ ọ ứ ề M i t p đ u ch a P ầ ử  cu i cùng  M i t p đ u ch a P c g i là   đ  cu i cùng ệ End Of File indicator  ế ầ ử kí hi u k t thúc t p (   ph n t ệ ế ầ ử kí hi u k t thúc t p ( End Of File indicator    ph n t – EOF).   – EOF). ệ ề H  đi u hành s  t ệ ề H  đi u hành s  t ữ ph n t ư trí l u tr   ư ữ ph n t trí l u tr

đ ng giúp ta tìm ra đ  đ ng giúp ta tìm ra đ  đ u tiên  đ u tiên

1212

ỏ ệ ỏ ệ

8.1.6. Con tr  t p  8.1.6. Con tr  t p

ấ ấ ệ ạ ệ ạ ể ể ậ ậ ờ ờ i th i đi m  i th i đi m

ỏ ệ ỏ ệ ầ ầ ỏ ỏ ị ị

ẽ ự ẽ ự

ỏ ệ ỏ ệ ả ả ọ ọ ề ề ể ể

ệ ệ ố ệ ố ệ ẽ ằ ẽ ằ ượ ượ ể ể ố ố c  c

ầ ử ủ ệ  S  ử S  ử ể ậ ộ ể ậ ầ ử ủ ệ ộ Đ  truy c p vào m t ph n t  c a t p  Đ  truy c p vào m t ph n t  c a t p   ) hay bi n ế ỏ ệ File positon locator ụ File positon locator ) hay bi n ế ỏ ệ ụ d ng con tr  t p ( d ng con tr  t p ( đ m.ệđ m.ệ ị ể Dùng đ  đánh d u v  trí truy c p vào t p t ể ị  Dùng đ  đánh d u v  trí truy c p vào t p t ị xác đ nh. ị xác đ nh. ẽ ở ệ Khi m  t p, con tr  t p s  luôn tr  vào v  trí đ u tiên  ẽ ở ệ  Khi m  t p, con tr  t p s  luôn tr  vào v  trí đ u tiên  ủ ệ c a t p. ủ ệ c a t p. ỗ ỗ Sau m i thao tác đ c ghi trên t p, con tr  t p s  t  Sau m i thao tác đ c ghi trên t p, con tr  t p s  t ộ ị ộ đ ng d ch chuy n v  phía cu i t p. Kho ng cách  ị đ ng d ch chuy n v  phía cu i t p. Kho ng cách  ị ị d ch chuy n (tính theo byte) s  b ng s  byte đã đ d ch chuy n (tính theo byte) s  b ng s  byte đã đ ệ ọ ừ ệ ệ ọ ừ ệ đ c t đ c t

1313

ặ ặ t p ho c ghi lên t p  t p ho c ghi lên t p

TỆP DỮ LIỆU TỆP DỮ LIỆU

8.1. Khái niệm và phân loại tệp 8.1. Khái niệm và phân loại tệp 8.2. Các thao tác với tệp 8.2. Các thao tác với tệp 8.2.1. Khai báo  8.2.1. Khai báo 8.2.2. Mở tệp  8.2.2. Mở tệp 8.2.3. Truy nhập tệp văn bản  8.2.3. Truy nhập tệp văn bản 8.2.4. Truy nhập tệp nhị phân  8.2.4. Truy nhập tệp nhị phân 8.2.5. Đóng tệp  8.2.5. Đóng tệp 8.3. Bài tập 8.3. Bài tập

1414

8.2. Các thao tác với tệp 8.2. Các thao tác với tệp

ả ả

ủ ủ

ớ ệ ớ ệ

ở ệ ở ệ

Các thao tác v i t p ph i tuân th  theo  Các thao tác v i t p ph i tuân th  theo  ự ự  sau:  trình t  sau:  trình t Khai báo t pệ  Khai báo t pệ ệ ể ệ M  t p đ  làm vi c ể  M  t p đ  làm vi c ậ ệ Truy nh p t p ậ ệ  Truy nh p t p Đóng t pệ  Đóng t pệ

1515

TỆP DỮ LIỆU TỆP DỮ LIỆU

8.1. Khái niệm và phân loại tệp 8.1. Khái niệm và phân loại tệp 8.2. Các thao tác với tệp 8.2. Các thao tác với tệp 8.2.1. Khai báo  8.2.1. Khai báo 8.2.2. Mở tệp  8.2.2. Mở tệp 8.2.3. Truy nhập tệp văn bản  8.2.3. Truy nhập tệp văn bản 8.2.4. Truy nhập tệp nhị phân  8.2.4. Truy nhập tệp nhị phân 8.2.5. Đóng tệp  8.2.5. Đóng tệp 8.3. Bài tập 8.3. Bài tập

1616

8.2.1. Khai báo tệp 8.2.1. Khai báo tệp

Cú pháp: Cú pháp:

FILE *ten_con_tro_tep; FILE *ten_con_tro_tep;

Ví dụ: Ví dụ:

FILE *f1, *f2; FILE *f1, *f2;

1717

TỆP DỮ LIỆU TỆP DỮ LIỆU

8.1. Khái niệm và phân loại tệp 8.1. Khái niệm và phân loại tệp 8.2. Các thao tác với tệp 8.2. Các thao tác với tệp 8.2.1. Khai báo  8.2.1. Khai báo 8.2.2. Mở tệp  8.2.2. Mở tệp 8.2.3. Truy nhập tệp văn bản  8.2.3. Truy nhập tệp văn bản 8.2.4. Truy nhập tệp nhị phân  8.2.4. Truy nhập tệp nhị phân 8.2.5. Đóng tệp  8.2.5. Đóng tệp 8.3. Bài tập 8.3. Bài tập

1818

8.2.2. Mở tệp 8.2.2. Mở tệp

Cú pháp: Cú pháp:

 Ten_tep  Che_do_mo_tep

ten_con_tro_tep = fopen(ten_tep,che_đo_mo_tep); ten_con_tro_tep = fopen(ten_tep,che_đo_mo_tep); : Đường dẫn đến tệp cần mở. Ten_tep: Đường dẫn đến tệp cần mở. : Tùy thuộc vào mục đích sử Che_do_mo_tep: Tùy thuộc vào mục đích sử dụng tệp và bản chất dữ liệu trên tệp. dụng tệp và bản chất dữ liệu trên tệp.

Kết quả trả về: Kết quả trả về:  Nếu mở thành công

Nếu mở thành công  Trả về một con trỏ tệp Trả về một con trỏ tệp tương ứng với tệp đã được mở tương ứng với tệp đã được mở Nếu không  Trả về con trỏ

Trả về con trỏ NULLNULL..

 Nếu không

1919

8.2.2. Mở tệp (tiếp) 8.2.2. Mở tệp (tiếp)

"r+b", , "w+b" "r+t", , "w+t" "wb", , "ab" "wt", , "at" "a+b" vàvà "w+b", , "a+b" "a+t".. "w+t", , "a+t"

Các chế độ mở tệp: Các chế độ mở tệp: "rb",, "wb" "ab", , "r+b"  "rb" "at", , "r+t" "rt", , "wt" "rt" Kí tự cuối cùng: Bản chất dữ liệu của tệp  Kí tự cuối cùng: Bản chất dữ liệu của tệp Kí tự đầu tiên: Mục đích sử dụng tệp.  Kí tự đầu tiên: Mục đích sử dụng tệp.

2020

8.2.2. Mở tệp (tiếp) 8.2.2. Mở tệp (tiếp)

2121

8.2.2. Mở tệp (tiếp) 8.2.2. Mở tệp (tiếp)

Ví dụ: Với khai báo: Ví dụ: Với khai báo:

FILE * f1, * f2, *f3; FILE * f1, * f2, *f3;

 Để mở tệp

để đọc: sinh_vien.txt để đọc:

Để mở tệp c:\c:\ sinh_vien.txt f1 = fopen("c:\\sinh_vien.txt", "r"); f1 = fopen("c:\\sinh_vien.txt", "r"); Để mở tệp c:\ho_so.dat

để ghi: c:\ho_so.dat để ghi:

 Để mở tệp

 Để mở tệp

f2 = fopen("c:\\ho_so.dat", "w"); f2 = fopen("c:\\ho_so.dat", "w"); để vừa đọc và ghi: c:\abc.txt để vừa đọc và ghi: Để mở tệp c:\abc.txt

2222

f3 = fopen("c:\\abc.txt", "r+"); f3 = fopen("c:\\abc.txt", "r+");

8.2.2. Mở tệp (tiếp) 8.2.2. Mở tệp (tiếp)

 Ví dụ để mở tệp

Chú ý: Chú ý: Khi mở tệp, nếu không chỉ rõ bản chất dữ liệu  Khi mở tệp, nếu không chỉ rõ bản chất dữ liệu của tệp thì C sẽ ngầm hiểu đó là tệp văn bản. của tệp thì C sẽ ngầm hiểu đó là tệp văn bản. theo chế độ nhị c:\ho_so.dat theo chế độ nhị Ví dụ để mở tệp c:\ho_so.dat phân và để ghi, ta dùng lệnh: phân và để ghi, ta dùng lệnh:

f2 = fopen("c:\\ho_so.dat", "wb"); f2 = fopen("c:\\ho_so.dat", "wb");

2323

TỆP DỮ LIỆU TỆP DỮ LIỆU

8.1. Khái niệm và phân loại tệp 8.1. Khái niệm và phân loại tệp 8.2. Các thao tác với tệp 8.2. Các thao tác với tệp 8.2.1. Khai báo  8.2.1. Khai báo 8.2.2. Mở tệp  8.2.2. Mở tệp 8.2.3. Truy nhập tệp văn bản  8.2.3. Truy nhập tệp văn bản 8.2.4. Truy nhập tệp nhị phân  8.2.4. Truy nhập tệp nhị phân 8.2.5. Đóng tệp  8.2.5. Đóng tệp 8.3. Bài tập 8.3. Bài tập

2424

8.2.3. Truy nhập tệp văn bản 8.2.3. Truy nhập tệp văn bản

Các hàm: fscanf(), fgets(), getc() fscanf(), fgets(), getc()

Các hàm: fprintf(), fputs(), putc() fprintf(), fputs(), putc()

Đọc dữ liệu từ tệp Đọc dữ liệu từ tệp  Các hàm: Ghi dữ liệu lên tệp Ghi dữ liệu lên tệp  Các hàm: Một số thao tác khác Một số thao tác khác Các hàm: feof(), fseek(), rewind()  Các hàm: feof(), fseek(), rewind() : Để sử dụng các hàm trên, cần khai Lưu ý: Để sử dụng các hàm trên, cần khai Lưu ý stdio.h.. báo tệp tiêu đề stdio.h báo tệp tiêu đề

2525

Đọc dữ liệu từ tệp văn bản a.a. Đọc dữ liệu từ tệp văn bản

ế ả ề ộ ả ề ộ ị ị

fscanf():: Hàm Hàm fscanf() int fscanf(FILE* con_tro_tep,  int fscanf(FILE* con_tro_tep, xau_dinh_dang, [danh_sach_dia_chi]); xau_dinh_dang, [danh_sach_dia_chi]); ả ả ề ế ế ả ả ề K t qu  tr  v :  K t qu  tr  v :  Tr  v  m t giá tr  nguyên là s   ố ếN u thành công   Tr  v  m t giá tr  nguyên là s   ố N u thành công  ượ ừ ệ ọ  t p. c t byte đ c đ ượ ừ ệ ọ  t p. c t byte đ c đ ượ ạ  Tr  v  giá tr   ị EOFEOF ả ề  Tr  v  giá tr   i  c l Ng ị ả ề ượ ạ i  c l Ng Ví dụ:  Ví dụ:

fscanf(fptr, “%d %c”,&a, &c); fscanf(fptr, “%d %c”,&a, &c);

2626

Đọc dữ liệu từ tệp văn bản (tiếp) a.a. Đọc dữ liệu từ tệp văn bản (tiếp)

ự ự ,  ,

Hàm Hàm fflush() fflush()::  Khi dùng hàm ự ừ ệ ự ừ ệ

fscanf() đ  nh p d  li u là kí t ữ ệ ậ ể đ  nh p d  li u là kí t ể ữ ệ ậ fflush().. fflush()  t p ta nên dùng  t p ta nên dùng

Khi dùng hàm fscanf()  t xâu kí t  t xâu kí t Cú pháp:  Cú pháp:

 Hàm Hàm fflush()

int fflush(FILE* con_tro_tep); int fflush(FILE* con_tro_tep);

ệ ệ ứ ứ

ị ị

ghi toàn b  d  li u ch a trong vùng  ứ ộ ữ ệ ứ ộ ữ ệ toàn b  d  li u ch a trong vùng  ớ ươ ớ ằ ở ộ ớ ươ ằ ở ộ ng  ng v i   b  nh  trong) t ớ ng  ng v i   b  nh  trong) t ớ ộ ớ ủ ệ ớ ộ ớ ủ ệ

2727

fflush() ghi ủ ệ đ m c a t p (n m  ủ ệ đ m c a t p (n m  ..  ra vùng nh  c a t p trên b  nh  ngoài con_tro_tep ra vùng nh  c a t p trên b  nh  ngoài con_tro_tep ị ả ề Giá tr  tr  v : ị ả ề  Giá tr  tr  v :  Tr  v  giá tr  0 ả ề ế ả ề  Tr  v  giá tr  0 ếN u thành công  N u thành công  ượ ạ  Tr  v   ả ề EOFEOF.. ả ề  Tr  v   ượ ạ i  c l Ng i  c l Ng

Đọc dữ liệu từ tệp văn bản (tiếp) a.a. Đọc dữ liệu từ tệp văn bản (tiếp)

Hàm Hàm fgets() fgets():: Cú pháp:  Cú pháp: char* fgets(char* xau_ki_tu, int n, char* fgets(char* xau_ki_tu, int n, FILE* con_tro_tep); FILE* con_tro_tep);

 Hàm fgets() sẽ tự động thêm kí tự xuống dòng (

Đọc từ tệp một xâu kí tự (cho phép chứa dấu cách) và gán  Đọc từ tệp một xâu kí tự (cho phép chứa dấu cách) và gán xâu đọc được cho biến xau_ky_tu xau_ky_tu.. xâu đọc được cho biến Việc đọc từ tệp sẽ dừng lại khi đọc đủ n-1 kí tự hoặc khi  Việc đọc từ tệp sẽ dừng lại khi đọc đủ n-1 kí tự hoặc khi nó gặp kí tự xuống dòng. nó gặp kí tự xuống dòng. ‘\n’) và kí Hàm fgets() sẽ tự động thêm kí tự xuống dòng (‘\n’) và kí tự kết thúc xâu (‘\0’, kí tự NULL) vào cuối xâu_kí_tự. tự kết thúc xâu (‘\0’, kí tự NULL) vào cuối xâu_kí_tự. Giá trị trả về:  Giá trị trả về:

Trả về xâu kí tự trỏ bởi xau_ki_tu xau_ki_tu

Nếu đọc thành công  Trả về xâu kí tự trỏ bởi Nếu đọc thành công Nếu có lỗi  Trả về con trỏ NULL. Trả về con trỏ NULL. Nếu có lỗi

2828

Đọc dữ liệu từ tệp văn bản (tiếp) a.a. Đọc dữ liệu từ tệp văn bản (tiếp)

getc():: Hàm Hàm getc() Cú pháp:  Cú pháp:

ự ự

ự ự intint (b ng ằ (b ng ằ

ự ọ ự ọ

ượ ượ

ể ể

c sau khi đã chuy n  c sau khi đã chuy n

 Tr  v  kí t ả ề  Tr  v  kí t ả ề

đ c đ  đ c đ

ị ả ề ủ ị ả ề ủ ượ ượ

intint..

ả ề ả ề

int getc(FILE* con_tro_tep); int getc(FILE* con_tro_tep); ữ ệ ộ ộ ọ ừ ệ  (m t byte d  li u), sau đó   t p m t kí t Đ c t ữ ệ ộ ọ ừ ệ ộ  (m t byte d  li u), sau đó   t p m t kí t  Đ c t ố ạ ổ ể ố ạ ổ ể  đó sang d ng s  nguyên  chuy n đ i kí t  đó sang d ng s  nguyên  chuy n đ i kí t ị ố ồ ấ cách thêm byte cao 0x00) r i l y giá tr  s  nguyên thu  ị ố ồ ấ cách thêm byte cao 0x00) r i l y giá tr  s  nguyên thu  c làm giá tr  tr  v  c a hàm. đ c làm giá tr  tr  v  c a hàm. đ ị ả ề Giá tr  tr  v : ị ả ề  Giá tr  tr  v : ế ếN u thành công  N u thành công  sang d ng ạ sang d ng ạ ượ ạ  Tr  v  giá tr   ị EOFEOF.. ị  Tr  v  giá tr   ượ ạ i  c l Ng i  c l Ng

2929

b. Ghi dữ liệu lên tệp văn bản b. Ghi dữ liệu lên tệp văn bản

Hàm Hàm fprintf() fprintf() Cú pháp:  Cú pháp:

ế ị ị  Tr  v  m t giá tr  nguyên là s   ố  Tr  v  m t giá tr  nguyên là s   ố

ả ề ả ề

int fprintf(FILE* con_tro_tep, int fprintf(FILE* con_tro_tep, xau_đinh_dang, [danh_sach_tham_so]); xau_đinh_dang, [danh_sach_tham_so]); fprintf() ghi d  li u lên m t t p   Hàm Hàm fprintf() ữ ệ ộ ệ ữ ệ ộ ệ ghi d  li u lên m t t p  ố con_tro_tep ỉ ị ượ con_tro_tep.. ố c ch  đ nh trong tham s   đ ỉ ị ượ c ch  đ nh trong tham s   đ ả ả ề ế K t qu  tr  v : ế ả ả ề  K t qu  tr  v : ả ề ộ ếN u thành công  ả ề ộ N u thành công  ệ ữ ệ bytes d  li u đã ghi lên t p. ệ ữ ệ bytes d  li u đã ghi lên t p. ượ ạ  Tr  v  giá tr   ị EOFEOF.. ị  Tr  v  giá tr   ượ ạ i  c l Ng i  c l Ng

3030

Ví dụVí dụ

#include #include void main() void main() { { int soTK; // so tai khoan int soTK; // so tai khoan char tenChuTK[30]; // ten chu tai khoan char tenChuTK[30]; // ten chu tai khoan double soDuTK; // so tien co trong TK double soDuTK; // so tien co trong TK

FILE *cfPtr; FILE *cfPtr; // mo tep moi de ghi, neu da co thi ghi de // mo tep moi de ghi, neu da co thi ghi de if ((cfPtr=fopen("clients.dat", "w"))==NULL){ if ((cfPtr=fopen("clients.dat", "w"))==NULL){ printf("File khong the mo duoc\n"); printf("File khong the mo duoc\n"); }} else { else { printf("Nhap vao so, ten va so du TK.\n"); printf("Nhap vao so, ten va so du TK.\n"); printf("Nhap so TK = 0 de ket thuc.\n"); printf("Nhap so TK = 0 de ket thuc.\n");

3131

do do {{

printf("? "); printf("? "); scanf("%d",&soTK); scanf("%d",&soTK); if (soTK != 0) if (soTK != 0) {{

scanf("%s %lf",tenChuTK,&soDuTK); scanf("%s %lf",tenChuTK,&soDuTK); fprintf(cfPtr, "%d %s %.2f\n", fprintf(cfPtr, "%d %s %.2f\n",

soTK, tenChuTK, soDuTK); soTK, tenChuTK, soDuTK);

}}

}} while (soTK != 0); while (soTK != 0); fclose(cfPtr); fclose(cfPtr); printf("\nDa ghi vao tep thanh cong!"); printf("\nDa ghi vao tep thanh cong!"); } //ket thuc else } //ket thuc else getch(); getch(); }}

3232

3333

Hàm fprintf có thể ghi cả xâu chứa dấu cách vào tệp Hàm fprintf có thể ghi cả xâu chứa dấu cách vào tệp Ví dụ: Sửa lại ví dụ trên nếu tenChuTK chứa cả dấu cách Ví dụ: Sửa lại ví dụ trên nếu tenChuTK chứa cả dấu cách do { do { printf("? "); printf("? "); scanf("%d",&soTK); scanf("%d",&soTK); if (soTK != 0) if (soTK != 0) {{ fflush(stdin); gets(tenChuTK); fflush(stdin); gets(tenChuTK); scanf("%lf",&soDuTK); scanf("%lf",&soDuTK); fprintf(cfPtr, "%d %s %.2f\n", fprintf(cfPtr, "%d %s %.2f\n",

soTK, tenChuTK, soDuTK); soTK, tenChuTK, soDuTK);

}}

}} while (soTK != 0); while (soTK != 0);

3434

3535

b. Ghi dữ liệu lên tệp văn bản (tiếp) b. Ghi dữ liệu lên tệp văn bản (tiếp)

fputs():: Hàm Hàm fputs() Cú pháp:  Cú pháp: int fputs(char* xau_ki_tu, int fputs(char* xau_ki_tu,

FILE* con_tro_tep); FILE* con_tro_tep);

 Hàm Hàm fputs()

fputs() sẽ ghi nội dung của sẽ ghi nội dung của xau_ki_tu

lên xau_ki_tu lên , tuy nhiên nó khác con_tro_tep, tuy nhiên nó khác ở chỗ nó không tự động ghi thêm kí puts() ở chỗ nó không tự động ghi thêm kí

Nếu thành công  Trả về kí tự cuối cùng ghi được lên tệp Trả về kí tự cuối cùng ghi được lên tệp Nếu thành công Ngược lại  Trả về giá trị Ngược lại

Trả về giá trị EOFEOF..

3636

tệp tương ứng với con_tro_tep tệp tương ứng với với hàm puts() với hàm tự xuống dòng lên tệp. tự xuống dòng lên tệp. Giá trị trả về:  Giá trị trả về:

b. Ghi dữ liệu lên tệp văn bản (tiếp) b. Ghi dữ liệu lên tệp văn bản (tiếp)

Hàm Hàm putc() putc() Cú pháp:  Cú pháp:

ứ ứ

ch a trong bi n   ch a trong bi n

ự  ự

 Hàm Hàm putc()

int putc(int ch, FILE* con_tro_tep); int putc(int ch, FILE* con_tro_tep);

ự ộ  ghi n i dung c a kí t ự ộ putc() ghi n i dung c a kí t ế ấ ế ấ

ủ ủ ủ ủ

ượ ượ

c ch a trong byte th p c a bi n ch) lên t p t c ch a trong byte th p c a bi n ch) lên t p t

ế intint ch (kí t ế  ch (kí t ớ ứ ệ ươ ớ ứ ng  ng v i  ệ ươ ng  ng v i

ả ề ố ả ề ố

ố ứ ự ố ứ ự

trong   trong

ể intint) là s  th  t ) là s  th  t ể

ự ự

ệ ệ

 Tr  v  s  nguyên (ki u   Tr  v  s  nguyên (ki u  ủ ủ ả ề ả ề

đã ghi lên t p.  đã ghi lên t p. ượ ạ  Tr  v  giá tr   ị EOFEOF..  Tr  v  giá tr   ị ượ ạ i  c l i  c l

ứ ứ đ đ con_tro_tep.. con_tro_tep ị ả ề Giá tr  tr  v : ị ả ề  Giá tr  tr  v : ế ếN u thành công  N u thành công  ả b ng mã ASCII c a kí t ả b ng mã ASCII c a kí t Ng Ng  Ví d :ụVí d :ụ

int m; int m; m = putc(0x2345,stdout); //m = 0x0045 = 69  ki tu E ki tu E m = putc(0x2345,stdout); //m = 0x0045 = 69

3737

c. Các thao tác khác c. Các thao tác khác

ố ệ ố ệ ố ữ ệ ố ữ ệ ầ ử ầ ử

ấ ấ ị ị

Hàm Hàm feof() feof() Cú pháp: int feof(FILE* con_tro_tep);  Cú pháp: int feof(FILE* con_tro_tep); ể ư ị ệ ế ể ư Ki m tra xem đã duy t đ n v  trí cu i t p hay ch a  ị ệ ế  Ki m tra xem đã duy t đ n v  trí cu i t p hay ch a  ể ọ ượ ằ ể ượ ằ c đ c  b ng cách ki m tra xem trong kh i d  li u đ ọ b ng cách ki m tra xem trong kh i d  li u đ c đ c  ự ầ ệ ở ầ  EOF không  l n th c hi n g n nh t có ph n t vào  ự ầ ệ ở ầ  EOF không  l n th c hi n g n nh t có ph n t vào   Tr  v  m t giá tr  khác 0 ả ề ộ ế ả ề ộ  Tr  v  m t giá tr  khác 0 ếN u có thì  N u có thì  ượ ạ  Tr  v  giá tr  0. ị ả ề ị ả ề  Tr  v  giá tr  0. ượ ạ i  c l Ng i  c l Ng

3838

c. Các thao tác khác (tiếp) c. Các thao tác khác (tiếp)

Hàm Hàm fseek() fseek():: Cú pháp:  Cú pháp: int fseek(FILE* con_tro_tep, long int n, int fseek(FILE* con_tro_tep, long int n, int vi_tri_ban_đau); int vi_tri_ban_đau);

ỏ ệ ừ vi_tri_ban_dau vi_tri_ban_dau   ỏ ệ ừ

ể ị ể ị ả ả ộ ộ ộ ộ ể Dùng đ  d ch chuy n con tr  t p t ể  Dùng đ  d ch chuy n con tr  t p t đi m t kho ng cách có đ  dài n bytes.  đi m t kho ng cách có đ  dài n bytes.

3939

ị ả ề Giá tr  tr  v : ị ả ề  Giá tr  tr  v :  Tr  v  giá tr  0 ế ị ả ề ếN u thành công  ả ề  Tr  v  giá tr  0 ị N u thành công  ượ ạ  Tr  v  giá tr  khác 0 ị ả ề  Tr  v  giá tr  khác 0 ị ả ề Ng ượ ạ i  c l Ng c l i

c. Các thao tác khác (tiếp) c. Các thao tác khác (tiếp)

(tiếp): fseek() (tiếp):

Hàm Hàm fseek()  Ví d :ụVí d :ụ

fseek(file_ptr, 50, SEEK_SET); fseek(file_ptr, 50, SEEK_SET); // con tro tep cach vi tri dau tep 50 bytes // con tro tep cach vi tri dau tep 50 bytes

Giá trị của biến n: Giá trị của biến n:

>0: Hướng dịch chuyển là về phía cuối tệp  >0: Hướng dịch chuyển là về phía cuối tệp < 0: Hướng dịch chuyển về phía đầu tệp  < 0: Hướng dịch chuyển về phía đầu tệp = 0: Không dịch chuyển.  = 0: Không dịch chuyển.

Chú ý:  Chú ý:

‘\n’ thành kí tự

‘\r’ và

và ‘\n’

Đối với tệp văn bản, khi mở tệp có thể có sự tự động chuyển đổi Đối với tệp văn bản, khi mở tệp có thể có sự tự động chuyển đổi ‘\n’) ) thành kí tự ‘\n’ kí tự (ví dụ chuyển đổi cặp kí tự ‘\r’ kí tự (ví dụ chuyển đổi cặp kí tự Việc tính toán số bước dịch chuyển con trỏ tệp rất dễ bị sai.  Việc tính toán số bước dịch chuyển con trỏ tệp rất dễ bị sai.

4040

c. Các thao tác khác (tiếp) c. Các thao tác khác (tiếp)

rewind():: Hàm Hàm rewind() Cú pháp:  Cú pháp:

Dùng để đưa con trỏ tệp về đầu tệp. .   Dùng để đưa con trỏ tệp về đầu tệp ị ả ề Không có giá tr  tr  v : ị ả ề  Không có giá tr  tr  v :  Ví d :ụVí d :ụ

void rewind(FILE* con_tro_tep); void rewind(FILE* con_tro_tep);

4141

rewind(file_ptr); rewind(file_ptr); Tương đương với: Tương đương với: fseek(file_ptr,0,SEEK_SET); fseek(file_ptr,0,SEEK_SET);

Ví dụVí dụ

Nối nội dung file 1 vào file 2 Nối nội dung file 1 vào file 2

#include #include void main() void main() {{ FILE *fp1, *fp2, *fpout; FILE *fp1, *fp2, *fpout; char sf1[50], sf2[50], sfout[50]; char sf1[50], sf2[50], sfout[50]; int c; int c; printf("\nNhap ten tap tin thu nhat : "); printf("\nNhap ten tap tin thu nhat : "); scanf("%s", &sf1); scanf("%s", &sf1); printf("\nNhap ten tap tin thu hai : "); printf("\nNhap ten tap tin thu hai : "); scanf("%s", &sf2); scanf("%s", &sf2); printf("\nNhap ten tap tin ket qua : "); printf("\nNhap ten tap tin ket qua : "); scanf("%s", &sfout); scanf("%s", &sfout);

4242

Ví dụ (2) Ví dụ (2)

if ((fp1 = fopen(sf1, "r")) == NULL){ if ((fp1 = fopen(sf1, "r")) == NULL){ printf("Khong the mo tap tin %s\n", sf1); printf("Khong the mo tap tin %s\n", sf1); getch(); exit(1); getch(); exit(1);

}}

if ((fp2 = fopen(sf2, "r")) == NULL){ if ((fp2 = fopen(sf2, "r")) == NULL){ printf("Khong the mo tap tin %s\n", sf2); printf("Khong the mo tap tin %s\n", sf2); getch(); exit(1); getch(); exit(1);

}}

if ((fpout = fopen(sfout, "w")) == NULL){ if ((fpout = fopen(sfout, "w")) == NULL){ printf(stderr, "Khong the mo tap tin %s\n", printf(stderr, "Khong the mo tap tin %s\n",

sfout); sfout);

getch(); exit(1); getch(); exit(1);

}}

4343

Ví dụ (3) Ví dụ (3)

while ((c = getc(fp1)) != EOF) while ((c = getc(fp1)) != EOF) putc(c, fpout); putc(c, fpout); while ((c = getc(fp2)) != EOF) while ((c = getc(fp2)) != EOF) putc(c, fpout); putc(c, fpout); fclose(fp1); fclose(fp1); fclose(fp2); fclose(fp2); fclose(fpout); fclose(fpout); printf("\nHoan tat."); printf("\nHoan tat."); getch(); getch(); } }

4444

TỆP DỮ LIỆU TỆP DỮ LIỆU

8.1. Khái niệm và phân loại tệp 8.1. Khái niệm và phân loại tệp 8.2. Các thao tác với tệp 8.2. Các thao tác với tệp 8.2.1. Khai báo  8.2.1. Khai báo 8.2.2. Mở tệp  8.2.2. Mở tệp 8.2.3. Truy nhập tệp văn bản  8.2.3. Truy nhập tệp văn bản 8.2.4. Truy nhập tệp nhị phân  8.2.4. Truy nhập tệp nhị phân 8.2.5. Đóng tệp  8.2.5. Đóng tệp 8.3. Bài tập 8.3. Bài tập

4545

8.2.4. Truy nhập tệp nhị phân 8.2.4. Truy nhập tệp nhị phân

Đọc dữ liệu trên tệp Đọc dữ liệu trên tệp Ghi dữ liệu trên tệp Ghi dữ liệu trên tệp Dịch chuyển con trỏ tệp Dịch chuyển con trỏ tệp

4646

a. Đọc dữ liệu trên tệp nhị phân a. Đọc dữ liệu trên tệp nhị phân

ố ữ ệ ố ữ ệ

ướ ướ ữ ệ ữ ệ

ỉ ỉ

 Tr  v  m t giá tr  nguyên là s   ố  Tr  v  m t giá tr  nguyên là s   ố

ị ị ượ ừ ệ c t ượ ừ ệ c t t p.  t p.

ị ị

Cú pháp: Cú pháp: int fread(void *đia_chi_bien, int so_byte, int fread(void *đia_chi_bien, int so_byte, int so_muc, FILE *con_tro_tep); int so_muc, FILE *con_tro_tep); ọ ừ ệ ộ Hàm Hàm fread() ọ ừ ệ  đ c t ộ  t p m t kh i d  li u kích  fread() đ c t  t p m t kh i d  li u kích   bytes, sau đó ghi kh i ố so_muc*so_byte bytes, sau đó ghi kh i ố c =  th c =  th so_muc*so_byte ị ớ d  li u đó lên vùng nh  có đ a ch  là  ị ớ d  li u đó lên vùng nh  có đ a ch  là  dia_chi_bien.. dia_chi_bien ả ả ề ế K t qu  tr  v : ả ả ề ế K t qu  tr  v : ế ả ề ộ ếN u thành công  ả ề ộ  N u thành công  ả ố ụ ọ ả ố ụ m c (không ph i s  bytes) đ c đ ọ m c (không ph i s  bytes) đ c đ ượ ạ  Tr  v  giá tr  0. ả ề  Tr  v  giá tr  0. ả ề i  c l Ng ượ ạ i  c l  Ng

4747

b. Ghi dữ liệu trên tệp nhị phân b. Ghi dữ liệu trên tệp nhị phân

Cú pháp: Cú pháp:

ớ ộ ớ ộ

ẽ ọ ừ ộ ẽ ọ ừ ộ

ệ ệ

int fwrite(void *dia_chi_bien, int so_byte, int fwrite(void *dia_chi_bien, int so_byte,

ả ề ộ ả ề ộ ị ị  Tr  v  m t giá tr  nguyên là s   ố  Tr  v  m t giá tr  nguyên là s   ố

ệ ệ

4848

ả ố ả ố ả ề ả ề ị ị int so_muc, FILE* ); int so_muc, FILE* ); ố ữ Hàm Hàm fwrite()  b  nh  m t kh i d    s  đ c t ố ữ fwrite() s  đ c t  b  nh  m t kh i d   ỉ ắ ầ ị ệ  và có  ỉ ắ ầ li u có đ a ch  b t đ u là  ị ệ dia_chi_bien và có  li u có đ a ch  b t đ u là  dia_chi_bien ướ , sau đó  c là  kích th ướ so_byte*so_muc bytes, sau đó  c là  kích th so_byte*so_muc bytes ố ữ ệ ố ữ ệ nó ghi kh i d  li u này lên t p. nó ghi kh i d  li u này lên t p. ả ả ề ế K t qu  tr  v : ả ả ề ế K t qu  tr  v : ế ếN u thành công  N u thành công  ụ ụ m c (không ph i s  bytes) đã ghi lên t p. m c (không ph i s  bytes) đã ghi lên t p. ượ ạ  Tr  v  giá tr  0   Tr  v  giá tr  0  i  c l Ng ượ ạ i  c l Ng

c. Dịch chuyển con trỏ tệp nhị phân c. Dịch chuyển con trỏ tệp nhị phân

và rewind()

fseek() và

ặ ặ

ẫ ẫ ố ố

Tương tự như tệp văn bản, ta có thể dùng các Tương tự như tệp văn bản, ta có thể dùng các để dịch chuyển con hàm fseek() hàm rewind() để dịch chuyển con trỏ tệp trên tệp nhị phân. trỏ tệp trên tệp nhị phân. khi dùng với tệp nhị phân thì Hàm Hàm fseek() fseek() khi dùng với tệp nhị phân thì không phải lưu ý như khi dùng với tệp văn bản. không phải lưu ý như khi dùng với tệp văn bản. ậ ậNh n xét: Nh n xét: Các hàm trong các c p hàm fread() – fwrite(), fscanf()   Các hàm trong các c p hàm fread() – fwrite(), fscanf()  – fprintf(), fputs() – fgets(), và getc() – putc() có ch c ứ – fprintf(), fputs() – fgets(), và getc() – putc() có ch c ứ năng đ i ng u nhau. năng đ i ng u nhau.

4949

TỆP DỮ LIỆU TỆP DỮ LIỆU

8.1. Khái niệm và phân loại tệp 8.1. Khái niệm và phân loại tệp 8.2. Các thao tác với tệp 8.2. Các thao tác với tệp 8.2.1. Khai báo  8.2.1. Khai báo 8.2.2. Mở tệp  8.2.2. Mở tệp 8.2.3. Truy nhập tệp văn bản  8.2.3. Truy nhập tệp văn bản 8.2.4. Truy nhập tệp nhị phân  8.2.4. Truy nhập tệp nhị phân 8.2.5. Đóng tệp  8.2.5. Đóng tệp 8.3. Bài tập 8.3. Bài tập

5050

8.2.5. Đóng tệp 8.2.5. Đóng tệp

có cú fclose() có cú

Đóng tệp là đảm bảo những thay đổi dữ Đóng tệp là đảm bảo những thay đổi dữ liệu được lưu lại trên tệp. liệu được lưu lại trên tệp. Để đóng tệp ta dùng hàm fclose() Để đóng tệp ta dùng hàm pháp khai báo: pháp khai báo:

5151

int fclose(FILE* ); int fclose(FILE* ); ả ả ề ế ế K t qu  tr  v : ả ả ề K t qu  tr  v :  Tr  v  giá tr  0 ế ả ề ị ếN u thành công  ả ề ị  Tr  v  giá tr  0  N u thành công  ượ ạ  Tr  v  giá tr   ị EOF. ả ề ị ả ề  Tr  v  giá tr   ượ ạ i  c l Ng EOF. i  c l  Ng

ụ ổ ụ ổ

ợ ợ

Ví d  t ng h p Ví d  t ng h p

#include #include #include #include #include #include void main() void main() {{

//Xau ki tu chua ten tep thu 22

//Khai bao bien con tro tep FILE* fptr1, fptr2; //Khai bao bien con tro tep FILE* fptr1, fptr2; int i; float f, a[100]; int i; float f, a[100]; char file_name_2[20];//Xau ki tu chua ten tep thu char file_name_2[20]; clrscr(); clrscr();

// Mo tep c:\float.dat de ghi len dó 100 so thuc // Mo tep c:\float.dat de ghi len dó 100 so thuc if((fptr1 = fopen("c:\\float.dat","wb"))==NULL) if((fptr1 = fopen("c:\\float.dat","wb"))==NULL) {{ printf("\n Khong mo duoc file c:\\float.dat"); printf("\n Khong mo duoc file c:\\float.dat"); printf("\n An phim bat ki de ket thuc!"); printf("\n An phim bat ki de ket thuc!"); exit(1); exit(1); }}

5252

ụ ổ ụ ổ

ế ế

ợ ợ

Ví d  t ng h p (ti p) Ví d  t ng h p (ti p)

//Tao 100 so thuc và ghi vào mang a[100] //Tao 100 so thuc và ghi vào mang a[100] for(i=0;i<100;i++) for(i=0;i<100;i++)

a[i] = (i*i+1.0)/(i+1); a[i] = (i*i+1.0)/(i+1);

//Ghi cac so thuc len tep c:\float.dat //Ghi cac so thuc len tep c:\float.dat for(i=0;i<100;i++) for(i=0;i<100;i++)

fwrite(&a[i],sizeof(float),1,fptr1); fwrite(&a[i],sizeof(float),1,fptr1);

//Đong tep c:\float.dat lai de luu du lieu vua ghi //Đong tep c:\float.dat lai de luu du lieu vua ghi fclose(fptr1); fclose(fptr1); // Mo tep c:\float.dat vua tao de doc du lieu // Mo tep c:\float.dat vua tao de doc du lieu if((fptr1 = fopen("c:\\float.dat","rb"))==NULL) if((fptr1 = fopen("c:\\float.dat","rb"))==NULL) {{

printf("\n Khong mo duoc file c:\\float.dat"); printf("\n Khong mo duoc file c:\\float.dat"); printf("\n An phim bat ki de ket thuc!"); printf("\n An phim bat ki de ket thuc!"); exit(1); exit(1);

}}

5353

ụ ổ ụ ổ

ế ế

ợ ợ

Ví d  t ng h p (ti p) Ví d  t ng h p (ti p)

// Mo tep thu 2 co ten nhap tu ban phim // Mo tep thu 2 co ten nhap tu ban phim // Copy du lieu tu tep c:\float.dat sang tep nay // Copy du lieu tu tep c:\float.dat sang tep nay printf("\n Nhap vao ten tep thu 2: "); printf("\n Nhap vao ten tep thu 2: "); fflush(stdin); gets(file_name_2); fflush(stdin); gets(file_name_2); if((fptr2 = fopen(file_name_2,"wb"))==NULL) if((fptr2 = fopen(file_name_2,"wb"))==NULL) {{

printf("\n Khong mo duoc file printf("\n Khong mo duoc file

%s",file_name_2); %s",file_name_2);

printf("\n An phim bat ki de ket thuc!"); printf("\n An phim bat ki de ket thuc!"); exit(1); exit(1);

}} // Sao chep du lieu từ tệp c:\float.dat sang tệp thứ 2 // Sao chep du lieu từ tệp c:\float.dat sang tệp thứ 2 fread(&f,4,1,fptr1); fread(&f,4,1,fptr1); while(!feof(fptr1)) while(!feof(fptr1)) {{

fwrite(&f,4,1,fptr2); fread(&f,4,1,fptr1); fwrite(&f,4,1,fptr2); fread(&f,4,1,fptr1);

}}

5454

ụ ổ ụ ổ

ế ế

ợ ợ

Ví d  t ng h p (ti p) Ví d  t ng h p (ti p)

/* Dich chuyen con tro tu vi tri lam viec hien tai /* Dich chuyen con tro tu vi tri lam viec hien tai cua tep c:\float.dat ve dau tep. Đoc và hien thi cua tep c:\float.dat ve dau tep. Đoc và hien thi so thuc dau tien trong tep c:\float.dat */ so thuc dau tien trong tep c:\float.dat */ rewind(fptr1); rewind(fptr1); fread(&f,sizeof(float),1,fptr1); fread(&f,sizeof(float),1,fptr1); printf("\n So thuc dau tien tren c:\\float.dat la printf("\n So thuc dau tien tren c:\\float.dat la %f",f); %f",f); /* Doc và hien thi so thuc trong tep c:\float.dat /* Doc và hien thi so thuc trong tep c:\float.dat có so thu tu nhap tu ban phim */ có so thu tu nhap tu ban phim */

printf("\n Cho biet thu tu cua so thuc trong printf("\n Cho biet thu tu cua so thuc trong c:\\float.dat: “); c:\\float.dat: “); scanf("%d",&i); scanf("%d",&i);

5555

ụ ổ ụ ổ

ế ế

ợ ợ

Ví d  t ng h p (ti p) Ví d  t ng h p (ti p)

/* Dich chuyen con tro tep cua c:\float.dat /* Dich chuyen con tro tep cua c:\float.dat den vi tri tuong ung voi so thuc muon den vi tri tuong ung voi so thuc muon hien thi */ hien thi */ fseek(fptr1,(i-1)*sizeof(float),SEEK_SET); fseek(fptr1,(i-1)*sizeof(float),SEEK_SET); fread(&f,sizeof(float),1,fptr1); fread(&f,sizeof(float),1,fptr1); printf(" So thuc thu %d trong c:\\float.dat la printf(" So thuc thu %d trong c:\\float.dat la

%f",i,f); %f",i,f);

fclose(fptr1); fclose(fptr1); fclose(fptr2); fclose(fptr2); // Cho an phim bat ki de ket thuc chuong trinh // Cho an phim bat ki de ket thuc chuong trinh getch(); getch();

}}

5656

ụ ổ ụ ổ

ế ế

ợ ợ

Ví d  t ng h p (ti p) Ví d  t ng h p (ti p)

ệ ệ

ế ế

ả ự ả ự K t qu  th c hi n: K t qu  th c hi n:

5757

Nhap vao ten tep thu 2: c:\f_copy.dat Nhap vao ten tep thu 2: c:\f_copy.dat So thuc dau tien tren c:\float.dat la 1.000000 So thuc dau tien tren c:\float.dat la 1.000000 Cho biet thu tu cua so thuc trong tep c:\float.dat: 10 Cho biet thu tu cua so thuc trong tep c:\float.dat: 10 So thuc thu 10 trong c:\float.dat la 8.200000 So thuc thu 10 trong c:\float.dat la 8.200000

Bài t pậ Bài t pậ

mỗi việc viết thành một hàm. mỗi việc viết thành một hàm.

ộ ộ

ả ả

100   100

ươ ươ ậ ừ ậ ừ ượ ượ

ố ự ư ố ự ư  bàn phím).  bàn phím).

ỉ ỉ

ố ượ ố ượ

ầ ầ

ị ị ố ự ng các s  th c, các  ố ự ng các s  th c, các

ỗ ố ư ỗ ố ư ố ự ố ự

ộ ộ ượ ượ

ả ả

ọ ọ

ố ự ố ự

ứ ự ứ ự

ả ả

ộ ệ ộ ệ

(cid:0) (cid:0)

ầ  tăng d n và  ầ  tăng d n và  "float_sx.dat"   "float_sx.dat"

ố ố

Bài 1: Bài 1: ế ng trình,  ế t ch Vi ng trình,  t ch Vi  bàn phím N s  th c l u vào m t m ng (N  Nh p t  bàn phím N s  th c l u vào m t m ng (N   Nh p t ậ ừ ậ ừ c nh p t và N đ c nh p t và N đ ả ộ Sau đó ghi ra m t file văn b n có đ a ch  là "float.dat" theo  ộ ả  Sau đó ghi ra m t file văn b n có đ a ch  là "float.dat" theo  ư ư quy cách: dòng đ u tiên l u s  l quy cách: dòng đ u tiên l u s  l ố ự ư ế ế ố ự ư dòng ti p theo l u các s  th c, m i s  l u trên m t dòng. dòng ti p theo l u các s  th c, m i s  l u trên m t dòng. ư ọ ạ ệ ọ ạ ệ ư c vào  i t p văn b n đó và l u các s  th c đ c đ Đ c l i t p văn b n đó và l u các s  th c đ c đ c vào   Đ c l ả ộ m t m ng. ả ộ m t m ng. ế ắ S p x p các s  th c trong m ng theo th  t ế ắ  S p x p các s  th c trong m ng theo th  t ả ghi ra m t t p văn b n khác có tên là  ả ghi ra m t t p văn b n khác có tên là  theo quy cách gi ng nh  t p  theo quy cách gi ng nh  t p

"float.dat".. ư ệ "float.dat" ư ệ

5858

ế ế

ậ ậ

Bài t p (ti p) Bài t p (ti p)

ệ ệ

ộ ộ

ươ ươ ồ ồ

ươ ươ ệ ệ

Bài 2: Bài 2: ế ng trình sao chép n i dung t p  t ch Vi ế ng trình sao chép n i dung t p  t ch Vi ng trình C có tên là  mã ngu n ch ng trình C có tên là  mã ngu n ch file_1.C sang t p có tên là file_2.C. file_1.C sang t p có tên là file_2.C.

5959

ế ế

ậ ậ

Bài t p (ti p) Bài t p (ti p)

ế ế

ươ ươ  bàn phím 2 xâu kí t  bàn phím 2 xâu kí t

ng trình copy file: ng trình copy file:  là đ  là đ

ủ ủ ự ự ườ ườ ẫ ng d n c a  ẫ ng d n c a

ố ộ ố ộ

ồ ồ

t ch t ch

ủ ủ ươ ươ ng trình ghép n i n i dung 2  ng trình ghép n i n i dung 2

ườ ườ ự ự ủ ủ bàn phím 2 xâu kí t  bàn phím 2 xâu kí t là đ  là đ ẫ ng d n c a  ẫ ng d n c a

ồ ồ ộ ộ ủ ủ ố ố ồ ồ

 Bài 3:  Vi t ch Bài 3: Vi t ch ừ ậ Nh p vào t ừ ậ  Nh p vào t ồ file ngu n và file đích. ồ file ngu n và file đích. ộ Copy n i dung c a file ngu n sang file đích. ộ  Copy n i dung c a file ngu n sang file đích.  Bài 4: ế ế  Vi Bài 4: Vi file: file: ừ ậ Nh p vào t ừ ậ  Nh p vào t file ngu n và file đích file ngu n và file đích Ghép n i dung c a file ngu n vào cu i file đích.  Ghép n i dung c a file ngu n vào cu i file đích.

6060