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
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
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:
- bai_giang_tin_hoc_dai_cuong_phan_2_lap_trinh_bang_ngon_ngu_c.ppt