Bài giảng Tin học đại cương - Phần 2: Lập trình bằng ngôn ngữ C - Bài 8: Tệp dữ liệu - Nguyễn Thanh Hùng

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.1. Khai báo

8.2.2. Mở tệp

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.5. Đóng tệp

8.3. Bài tập

 

ppt 60 trang yennguyen 5420
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Tin học đại cương - Phần 2: Lập trình bằng ngôn ngữ C - Bài 8: Tệp dữ liệu - Nguyễn Thanh Hùng", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

Tóm tắt nội dung tài liệu: Bài giảng Tin học đại cương - Phần 2: Lập trình bằng ngôn ngữ C - Bài 8: Tệp dữ liệu - Nguyễn Thanh Hùng

Bài giảng Tin học đại cương - Phần 2: Lập trình bằng ngôn ngữ C - Bài 8: Tệp dữ liệu - Nguyễn Thanh Hùng
1 
TIN HỌC ĐẠI CƯƠNG  PHẦN 2: LẬP TRÌNH BẰNG NGÔN NGỮ C BÀI 8: TỆP DỮ LIỆU 
VIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG 
SCHOOL OF INFORMATION 
& COMMUNICATION TECHNOLOGY 
2 
TỆP DỮ LIỆU 
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.1. Khai báo 
8.2.2. Mở tệp 
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.5. Đóng tệp 
8.3. Bài tập 
3 
TỆP DỮ LIỆU 
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.1. Khai báo 
8.2.2. Mở tệp 
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.5. Đóng tệp 
8.3. Bài tập 
4 
8.1.1. Khái niệm 
Khái niệm tệp 
Tệp dữ liệu ( File ) là một tập hợp các dữ liệu có liên quan với nhau và có cùng kiểu dữ liệu. 
Tệp được lưu trữ trên các thiết bị nhớ ngoài (đĩa mềm, đĩa cứng, CD-ROM) với một tên nào đó để phân biệt với nhau. 
5 
Mô hình lưu trữ dữ liệu 
Bit – dữ liệu nhỏ nhất ( 0 hoặc 1) 
Byte – 8 bits - Dùng để lưu trữ các ký tự, số nguyên 1 byte 
Trường (Field) – tập các byte dữ liệu 
Bản ghi (Record) – tập các trường 
Tệp (file) - một tập các bản ghi 
Cơ sở dữ liệu (database) - tập các tệp 
6 
Mô hình lưu trữ dữ liệu 
7 
8.1.2. Phân loại tệp 
Dựa theo bản chất dữ liệu của tệp, người ta chia tệp thành 2 loại: 
Tệp văn bản 
Tệp nhị phân 
8 
8.1.2. Phân loại tệp (tiếp) 
Tệp văn bản ( text file ): 
Các phần tử của nó là các kí tự gồm: 
Chữ cái 
Chữ số 
Các dấu câu 
Các dấu cách 
Một số kí tự điều khiển 
CR – Carriage Return – có mã ASCII là 13, để về đầu dòng 
LF – Line Feed – có mã ASCII là 10, để xuống dòng mới 
9 
8.1.2. Phân loại tệp (tiếp) 
Tệp nhị phân ( binary file ): 
Các phần tử của nó là các số nhị phân 0 và 1 mã hóa thông tin. 
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ữ liệu 
Nếu thông tin được mã hóa là kí tự thì khi đó 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ường hợp riêng của tệp nhị phân. 
10 
8.1.3. Vai trò của tệp 
Khi chương trình kết thúc hoặc khi tắt máy thì các thông tin trong bộ nhớ chính (RAM) không còn. 
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 tệp, tức là để dữ liệu nằm ở bộ nhớ ngoài. 
 Tệp là phương tiện dùng để cất giữ dữ liệu lâu dài. 
11 
8.1.4. Phân biệt tệp và mảng 
Giống nhau: 
Tập hợp các phần tử cùng kiểu. 
Khác nhau: 
Mảng 
Được lưu trữ trên bộ nhớ trong 
Dữ liệu của mảng sẽ không còn khi chương trình kết thúc hoặc khi tắt máy. 
Kích thước của một mảng thường nhỏ hơn kích thước của một tệp rất nhiều. 
Tệp 
Được lưu trữ trên bộ nhớ ngoài 
Dữ liệu trên tệp tồn tại lâu dài, vẫn còn dù chương trình kết thúc hay tắt máy. 
Kích thước của một tệp thường lớn hơn kích thước của một mảng rất nhiều. 
12 
8.1.5. Tổ chức của tệp 
Số lượng phần tử trong tệp không bị giới hạn 
Mỗi tệp đều chứa P hần tử cuối cùng được gọi là phần tử kí hiệu kết thúc tệp ( End Of File indicator – EOF). 
Hệ điều hành sẽ tự động giúp ta tìm ra được vị trí lưu trữ phần tử đầu tiên của tệp trên đĩa. 
13 
8.1.6. Con trỏ tệp 
Để truy cập vào một phần tử của tệp Sử dụng con trỏ tệp ( File positon locator ) hay biến đệm . 
Dùng để đánh dấu vị trí truy cập vào tệp tại thời điểm xác định . 
Khi mở tệp , con trỏ tệp sẽ luôn trỏ vào vị trí đầu tiên của tệp . 
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 dịch chuyển ( tính theo byte) sẽ bằng số byte đã được đọc từ tệp hoặc ghi lên tệp 
14 
TỆP DỮ LIỆU 
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.1. Khai báo 
8.2.2. Mở tệp 
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.5. Đóng tệp 
8.3. Bài tập 
15 
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 trình tự sau: 
Khai báo tệp 
Mở tệp để làm việc 
Truy nhập tệp 
Đóng tệp 
16 
TỆP DỮ LIỆU 
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.1. Khai báo 
8.2.2. Mở tệp 
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.5. Đóng tệp 
8.3. Bài tập 
17 
8.2.1. Khai báo tệp 
Cú pháp: 
FILE *ten_con_tro_tep; 
Ví dụ: 
	 FILE *f1, *f2; 
18 
TỆP DỮ LIỆU 
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.1. Khai báo 
8.2.2. Mở tệp 
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.5. Đóng tệp 
8.3. Bài tập 
19 
8.2.2. Mở tệp 
Cú pháp : 
ten_con_tro_tep = fopen ( ten_tep,che_đo_mo_tep ); 
Ten_tep : Đường dẫn đến tệp cần mở . 
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 . 
Kết quả trả về : 
Nếu mở thành công T rả về một con trỏ tệp tương ứng với tệp đã được mở 
Nếu không Trả về con trỏ NULL . 
20 
8.2.2. Mở tệp (tiếp) 
Các chế độ mở tệp: 
"rb" , "wb" , "ab" , "r+b" , "w+b" , "a+b" và "rt" , "wt" , "at" , "r+t" , "w+t" , "a+t" . 
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. 
21 
8.2.2. Mở tệp (tiếp) 
22 
8.2.2. Mở tệp (tiếp) 
Ví dụ: Với khai báo: 
FILE * f1, * f2, *f3; 
Để mở tệp c:\ sinh_vien.txt để đọc: 
	 f1 = fopen("c:\\sinh_vien.txt", "r"); 
Để mở tệp c:\ho_so.dat để ghi: 
	 f2 = fopen("c:\\ho_so.dat", "w"); 
Để mở tệp c:\abc.txt để vừa đọc và ghi: 
	 f3 = fopen("c:\\abc.txt", "r+"); 
23 
8.2.2. Mở tệp (tiếp) 
Chú ý: 
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. 
Ví dụ để mở tệp c:\ho_so.dat theo chế độ nhị phân và để ghi, ta dùng lệnh: 
	 f2 = fopen("c:\\ho_so.dat", "wb"); 
24 
TỆP DỮ LIỆU 
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.1. Khai báo 
8.2.2. Mở tệp 
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.5. Đóng tệp 
8.3. Bài tập 
25 
8.2.3. Truy nhập tệp văn bản 
Đọc dữ liệu từ tệp 
Các hàm: fscanf(), fgets(), getc() 
Ghi dữ liệu lên tệp 
Các hàm: fprintf(), fputs(), putc() 
Một số thao tác khác 
Các hàm: feof(), fseek(), rewind() 
Lưu ý : Để sử dụng các hàm trên, cần khai báo tệp tiêu đề stdio.h . 
26 
a. Đọc dữ liệu từ tệp văn bản 
Hàm fscanf() : 
int fscanf(FILE* con_tro_tep, xau_dinh_dang, [danh_sach_dia_chi]); 
Kết quả trả về: 
Nếu thành công T rả về một giá trị nguyên là số byte đọc được từ tệp. 
Ngược lại Trả về giá trị EOF 
Ví dụ: 
fscanf(fptr, “%d %c”,&a, &c); 
27 
a. Đọc dữ liệu từ tệp văn bản (tiếp) 
Hàm fflush() : 
Khi dùng hàm fscanf() để nhập dữ liệu là kí tự, xâu kí tự từ tệp ta nên dùng fflush() . 
Cú pháp: 
int fflush(FILE* con_tro_tep); 
Hàm fflush() ghi toàn bộ dữ liệu chứa trong vùng đệm của tệp (nằm ở bộ nhớ trong) tương ứng với con_tro_tep ra vùng nhớ của tệp trên bộ nhớ ngoài . 
Giá trị trả về: 
Nếu thành công T rả về giá trị 0 
Ngược lại Trả về EOF . 
28 
a. Đọc dữ liệu từ tệp văn bản (tiếp) 
Hàm fgets() : 
Cú pháp: 
char* fgets(char* xau_ki_tu, int n, 	FILE* con_tro_tep); 
Đọ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 . 
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. 
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ự. 
Giá trị trả về: 
Nếu đọc thành công Trả về xâu kí tự trỏ bởi xau_ki_tu 
Nếu có lỗi Trả về con trỏ NULL. 
29 
a. Đọc dữ liệu từ tệp văn bản (tiếp) 
Hàm getc() : 
Cú pháp: 
int getc(FILE* con_tro_tep); 
Đọc từ tệp một kí tự (một byte dữ liệu), sau đó chuyển đổi kí tự đó sang dạng số nguyên int (bằng 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. 
Giá trị trả về: 
Nếu thành công Trả về kí tự đọc được sau khi đã chuyển sang dạng int . 
Ngược lại T rả về giá trị EOF . 
30 
b. Ghi dữ liệu lên tệp văn bản 
Hàm fprintf() 
Cú pháp: 
 int fprintf(FILE* con_tro_tep, 	xau_đinh_dang, [danh_sach_tham_so]); 
Hàm fprintf() ghi dữ liệu lên một tệp được chỉ định trong tham số con_tro_tep . 
Kết quả trả về: 
Nếu thành công Trả về một giá trị nguyên là số bytes dữ liệu đã ghi lên tệp. 
Ngược lại Trả về giá trị EOF . 
31 
Ví dụ 
#include 
void main() 
{ 
 int soTK; // so tai khoan 
 char tenChuTK[30]; // ten chu tai khoan 
 double soDuTK; // so tien co trong TK 
 FILE *cfPtr; 
 // mo tep moi de ghi, neu da co thi ghi de 
 if ((cfPtr=fopen("clients.dat", "w"))==NULL){ 
 printf("File khong the mo duoc\n"); 
 } 
 else { 
 printf("Nhap vao so, ten va so du TK.\n"); 
 printf("Nhap so TK = 0 de ket thuc.\n"); 
32 
 do 
 { 
	 printf("? "); 
 scanf("%d",&soTK); 
 if (soTK != 0) 
 { 
	 scanf("%s %lf",tenChuTK,&soDuTK); 
	 fprintf(cfPtr, "%d %s %.2f\n", 
	soTK, tenChuTK, soDuTK); 
	 } 
 } 
 while (soTK != 0); 
 fclose(cfPtr); 
 printf("\nDa ghi vao tep thanh cong!"); 
 } //ket thuc else 
 getch(); 
} 
33 
34 
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 
 do { 
 	 printf("? "); 
 scanf("%d",&soTK); 
 if (soTK != 0) 
 { 
 	 fflush(stdin); gets(tenChuTK); 
 	 scanf("%lf",&soDuTK); 
	 	 fprintf(cfPtr, "%d %s %.2f\n", 
	soTK, tenChuTK, soDuTK); 
	 } 
 } 
 while (soTK != 0); 
35 
36 
b. Ghi dữ liệu lên tệp văn bản (tiếp) 
Hàm fputs() : 
Cú pháp: 
	int fputs(char* xau_ki_tu, 
	FILE* con_tro_tep); 
Hàm fputs() sẽ ghi nội dung của xau_ki_tu lên tệp tương ứng với con_tro_tep , tuy nhiên nó khác với hàm puts() ở chỗ nó không tự động ghi thêm kí tự xuống dòng lên tệp. 
Giá trị trả về: 
Nếu thành công T rả về kí tự cuối cùng ghi được lên tệp 
Ngược lại T rả về giá trị EOF . 
37 
b. Ghi dữ liệu lên tệp văn bản (tiếp) 
Hàm putc() 
Cú pháp: 
	 int putc(int ch, FILE* con_tro_tep); 
Hàm putc() ghi nội dung của kí tự chứa trong biến int ch (kí tự được chứa trong byte thấp của biến ch) lên tệp tương ứng với con_tro_tep . 
Giá trị trả về: 
Nếu thành công Trả về số nguyên (kiểu int ) là số thứ tự trong bảng mã ASCII của kí tự đã ghi lên tệp. 
Ngược lại Trả về giá trị EOF . 
Ví dụ: 
int m; 
m = putc(0x2345,stdout); //m = 0x0045 = 69 ki tu E 
38 
c. Các thao tác khác 
Hàm feof() 
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 bằng cách kiểm tra xem trong khối dữ liệu được đọc vào ở lần thực hiện gần nhất có phần tử EOF không 
Nếu có thì T rả về một giá trị khác 0 
Ngược lại Trả về giá trị 0. 
39 
c. Các thao tác khác (tiếp) 
Hàm fseek() : 
Cú pháp: 
int fseek(FILE* con_tro_tep, long int n, 
int vi_tri_ban_đau); 
Dùng để dịch chuyển con trỏ tệp từ vi_tri_ban_dau đi một khoảng cách có độ dài n bytes. 
Giá trị trả về: 
Nếu thành công Tr ả về giá trị 0 
Ngược lại Trả về giá trị khác 0 
40 
c. Các thao tác khác (tiếp) 
Hàm fseek() (tiếp): 
Ví dụ: 
fseek(file_ptr, 50, SEEK_SET); 
// con tro tep cach vi tri dau tep 50 bytes 
Chú ý: 
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 về phía đầu tệp 
= 0: Không dịch chuyển. 
Đối với tệp văn bản, khi mở tệp có thể có sự tự động chuyển đổi kí tự (ví dụ chuyển đổi cặp kí tự ‘\r’ và ‘\n’ thành kí tự ‘\n’ ) Việc t ính toán số bước dịch chuyển con trỏ tệp rất dễ bị sai. 
41 
c. Các thao tác khác (tiếp) 
Hàm rewind() : 
Cú pháp: 
void rewind(FILE* con_tro_tep); 
Dùng để đưa con trỏ tệp về đầu tệp . 
Không có giá trị trả về: 
Ví dụ: 
rewind(file_ptr); 
Tương đương với: 
fseek(file_ptr,0,SEEK_SET); 
42 
Ví dụ 
Nối nội dung file 1 vào file 2 
#include 
void main() 
{ 
 FILE *fp1, *fp2, *fpout; 
 char sf1[50], sf2[50], sfout[50]; 
 int c; 
 printf("\nNhap ten tap tin thu nhat : "); 
 scanf("%s", &sf1); 
 printf("\nNhap ten tap tin thu hai : "); 
 scanf("%s", &sf2); 
 printf("\nNhap ten tap tin ket qua : "); 
 scanf("%s", &sfout); 
43 
Ví dụ (2) 
if ((fp1 = fopen(sf1, "r")) == NULL){ 
 printf("Khong the mo tap tin %s\n", sf1); 
	 getch(); exit(1); 
} 
if ((fp2 = fopen(sf2, "r")) == NULL){ 
 printf("Khong the mo tap tin %s\n", sf2); 
	 getch(); exit(1); 
} 
if ((fpout = fopen(sfout, "w")) == NULL){ 
 printf(stderr, "Khong the mo tap tin %s\n", sfout); 
	 getch(); exit(1); 
} 
44 
Ví dụ (3) 
 while ((c = getc(fp1)) != EOF) 
 putc(c, fpout); 
 while ((c = getc(fp2)) != EOF) 
 putc(c, fpout); 
 fclose(fp1); 
 fclose(fp2); 
 fclose(fpout); 
 printf("\nHoan tat."); 
 getch(); 
} 
45 
TỆP DỮ LIỆU 
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.1. Khai báo 
8.2.2. Mở tệp 
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.5. Đóng tệp 
8.3. Bài tập 
46 
8.2.4. Truy nhập tệp nhị phân 
Đọc dữ liệu trên tệp 
Ghi dữ liệu trên tệp 
Dịch chuyển con trỏ tệp 
47 
a. Đọc dữ liệu trên tệp nhị phân 
Cú pháp: 
	 int fread(void *đia_chi_bien, int so_byte, int so_muc, FILE *con_tro_tep); 
Hàm fread() đọc từ tệp một khối dữ liệu kích thước = so_muc * so_byte bytes, sau đó ghi khối dữ liệu đó lên vùng nhớ có địa chỉ là dia_chi_bien . 
Kết quả trả về: 
Nếu thành công T rả về một giá trị nguyên là số mục (không phải số bytes) đọc được từ tệp. 
Ngược lại T rả về giá trị 0. 
48 
b. Ghi dữ liệu trên tệp nhị phân 
Cú pháp: 
int fwrite(void *dia_chi_bien, int so_byte, 	 int so_muc, FILE* ); 
Hàm fwrite() sẽ đọc từ bộ nhớ một khối dữ liệu có địa chỉ bắt đầu là dia_chi_bien và có kích thước là so_byte*so_muc bytes , sau đó nó ghi khối dữ liệu này lên tệp. 
Kết quả trả về: 
Nếu thành công T rả về một giá trị nguyên là số mục (không phải số bytes) đã ghi lên tệp. 
Ngược lại Trả về giá trị 0 
49 
c. Dịch chuyển con trỏ tệp nhị phân 
Tương tự như tệp văn bản, ta có thể dùng các hàm fseek() và rewind() để dịch chuyển con trỏ tệp trên tệp nhị phân. 
Hàm 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. 
Nhận xét: 
Các hàm trong các cặp hàm fread() – fwrite(), fscanf() – fprintf(), fputs() – fgets(), và getc() – putc() có chức năng đối ngẫu nhau. 
50 
TỆP DỮ LIỆU 
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.1. Khai báo 
8.2.2. Mở tệp 
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.5. Đóng tệp 
8.3. Bài tập 
51 
8.2.5. Đóng tệp 
Đóng tệp là đảm bảo những thay đổi dữ liệu được lưu lại trên tệp . 
Để đóng tệp ta dùng hàm fclose () có cú pháp khai báo : 
int fclose (FILE* ); 
Kết quả trả về : 
Nếu thành công Trả về g iá trị 0 
Ngược lại T rả về giá trị EOF. 
52 
Ví dụ tổng hợp 
#include 
#include 
#include 
void main() 
{ 
	FILE* fptr1, fptr2; //Khai bao bien con tro tep 
	int i; float f, a[100]; 
	char file_name_2[20]; //Xau ki tu chua ten tep thu 2 
	clrscr(); 
 // Mo tep c:\float.dat de ghi len dó 100 so thuc 
	if((fptr1 = fopen("c:\\float.dat","wb"))==NULL) 
	{ 
	 printf("\n Khong mo duoc file c:\\float.dat"); 
	 printf("\n An phim bat ki de ket thuc!"); 
	 exit(1); 
	} 
53 
Ví dụ tổng hợp (tiếp) 
 //Tao 100 so thuc và ghi vào mang a[100] 
	 for(i=0;i<100;i++) 
	a[i] = (i*i+1.0)/(i+1); 
	 //Ghi cac so thuc len tep c:\float.dat 
	 for(i=0;i<100;i++) 
	fwrite(&a[i],sizeof(float),1,fptr1); 
	 //Đong tep c:\float.dat lai de luu du lieu vua ghi 
	fclose(fptr1); 
 // Mo tep c:\float.dat vua tao de doc du lieu 
	if((fptr1 = fopen("c:\\float.dat","rb"))==NULL) 
	{ 
	printf("\n Khong mo duoc file c:\\float.dat"); 
	printf("\n An phim bat ki de ket thuc!"); 
	exit(1); 
	} 
54 
Ví dụ tổng hợp (tiếp) 
 // Mo tep thu 2 co ten nhap tu ban phim 
	 // Copy du lieu tu tep c:\float.dat sang tep nay 
	printf("\n Nhap vao ten tep thu 2: "); 
	fflush(stdin); gets(file_name_2); 
	if((fptr2 = fopen(file_name_2,"wb"))==NULL) 
	{ 
	printf("\n Khong mo duoc file %s",file_name_2); 
	printf("\n An phim bat ki de ket thuc!"); 
	exit(1); 
	} 
 // Sao chep du lieu từ tệp c:\float.dat sang tệp thứ 2 
	fread(&f,4,1,fptr1); 
	while(!feof(fptr1)) 
	{ 
	fwrite(&f,4,1,fptr2); fread(&f,4,1,fptr1); 
	} 
55 
Ví dụ tổng hợp (tiếp) 
	 /* Dich chuyen con tro tu vi tri lam viec hien tai cua tep c:\float.dat ve dau tep. Đoc và hien thi so thuc dau tien trong tep c:\float.dat */ 
	rewind(fptr1); 
	fread(&f,sizeof(float),1,fptr1); 
	printf("\n So thuc dau tien tren c:\\float.dat la 	%f",f); 
 /* Doc và hien thi so thuc trong tep c:\float.dat 
 có so thu tu nhap tu ban phim */ 
	printf("\n Cho biet thu tu cua so thuc trong c:\\float.dat: “); 
	scanf("%d",&i); 
56 
Ví dụ tổng hợp (tiếp) 
	 /* Dich chuyen con tro tep cua c:\float.dat 
	 den vi tri tuong ung voi so thuc muon 	hien thi */ 
	fseek(fptr1,(i-1)*sizeof(float),SEEK_SET); 
	fread(&f,sizeof(float),1,fptr1); 
	printf(" So thuc thu %d trong c:\\float.dat la 	%f",i,f); 
	fclose(fptr1); 
	fclose(fptr2); 
	 // Cho an phim bat ki de ket thuc chuong trinh 
	getch(); 
} 
57 
Ví dụ tổng hợp (tiếp) 
Kết quả thực hiện: 
Nhap vao ten tep thu 2: c:\f_copy.dat 
So thuc dau tien tren c:\float.dat la 1.000000 
Cho biet thu tu cua so thuc trong tep c:\float.dat: 10 
So thuc thu 10 trong c:\float.dat la 8.200000 
58 
Bài tập 
Bài 1: 
	 Viết chương trình , mỗi việc viết thành một hàm . 
Nhập từ bàn phím N số thực lưu vào một mảng (N 100 và N được nhập từ bàn phím ). 
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ượng các số thực , các dòng tiếp theo lưu các số thực , mỗi số lưu trên một dòng . 
Đọc lại tệp văn bản đó và lưu các số thực đọc được vào một mảng . 
Sắp xếp các số thực trong mảng theo thứ tự tăng dần và ghi ra một tệp văn bản khác có tên là " float_sx.dat " theo quy cách giống như tệp " float.dat " . 
59 
Bài tập (tiếp) 
Bài 2: 
	Viết chương trình sao chép nội dung tệp mã nguồn chương trình C có tên là file_1.C sang tệp có tên là file_2.C. 
60 
Bài tập (tiếp) 
Bài 3: Viết chương trình copy file: 
Nhập vào từ bàn phím 2 xâu kí tự là đường dẫn của file nguồn và file đích . 
Copy nội dung của file nguồn sang file đích . 
Bài 4: Viết chương trình ghép nối nội dung 2 file: 
Nhập vào từ bàn phím 2 xâu kí tự là đường dẫn của file nguồn và file đích 
Ghép nội dung của file nguồn vào cuối file đích . 

File đính kèm:

  • pptbai_giang_tin_hoc_dai_cuong_phan_2_lap_trinh_bang_ngon_ngu_c.ppt