Giáo trình Phương pháp lập trình
int main()
ðịnh nghĩa hàm main(). Hàm main() là ñiểm mà tất cả các chương
trình C/C++ bắt ñầu thực hiện. Nó không phụ thuộc vào vị trí của
hàm, nội dung của nó luôn ñược thực hiện ñầu tiên khi chương
trình thực thi. Một chương trình C/C++ ñều phải tồntại một hàm
main(). Hàm main() có thể có hoặc không có tham số. Nội dung
của hàm main() tiếp ngay sau phần khai báo chính thức ñược ñặt
trong cặp dấu ngoặc { }.
cout << "Hello World!";
ðây là một lệnh nằm trong phần thân của hàm main. cout là một
dòng (stream) xuất chuẩn trong C/C++ ñược ñịnh nghĩa trong thư
viện iostream.h. Khi dòng lệnh này ñược thực thi, kết quả là chuổi
"Hello World!" ñược xuất ra màn hình. Dòng lệnh ñược kết thúc
bằng dấu chấm phẩy (;).
ñóng file thành công, hàm trả về giá trị zero. Nếu một lỗi xảy ra khi ñóng file, hàm trả về EOF. 3.5. Viết một ký tự ñến một file Có hai hàm xuất ký tự ñến file là putc() và fputc(). Hai hàm này là tương ñương nhau. Hàm putc() viết một ký tự ñến một file ñã ñược mở bởi hàm fopen(). Nguyên mẫu của hàm như sau: int putc(int ch, FILE *fp); fp là con trỏ file trả về bởi hàm fopen() và ch là ký tự ñược viết ñến file. Nếu hoạt ñộng putc() thành công, nó trả về ký tự ñược viết vào file. Ngược lại, nó trả về EOF. Giáo trình PP lập trình TT.Công Nghệ Thông Tin 117/124 3.6. ðọc một ký tự từ một file Có hai hàm tương ñương ñể ñọc một ký tự từ file là getc() và fgetc(). Hàm getc() ñọc mỗi lần một ký tự từ file ñược mở bởi hàm fopen() ở chế ñộ ñọc (read). Nguyên mẫu của fopen là: int getc(FILE *fp); fp là con trỏ file kiểu FILE trả về bởi hàm fopen(). Hàm getc() trả về một số nguyên là giá trị của ký tự ñược ñọc. Hàm getc() trả về EOF nếu một lỗi xảy ra. 3.7. Ví dụ minh họa fopen(), getc(), putc(), và fclose() Ví dụ 1: Minh họa việc ñọc từ bàn phím và ghi chúng vào một tập tin cho ñến khi người dùng nhấn nhập ký tự $. #include #include void main() { FILE *fp; char ch; if((fp=fopen(“test.txt”, "w")==NULL) { cout << "Cannot open file.\n"; exit(1); } do { ch = getchar(); putc(ch, fp); }while (ch != '$'); fclose(fp); } Ví dụ 2: Minh họa việc ñọc từ một file văn bản và xuất chúng ra màn hình. #include #include void main() { FILE *fp; Giáo trình PP lập trình TT.Công Nghệ Thông Tin 118/124 char ch; if((fp=”test.txt”, "r")==NULL) { cout << "Cannot open file.\n"; exit(1); } ch = getc(fp); // read one character while (ch!=EOF) { putchar(ch); // print on screen ch = getc(fp); } fclose(fp); } 3.8. ðọc và viết chuổi trên file C/C++ hỗ trợ hai hàm fgets() và fputs() ñể ñọc và viết chuổi ký tự trên file. Những hàm này tương tự như getc() và putc() nhưng thay vì ñọc hay viết từng ký tự, chúng ñọc hay viết một chuổi. Nguyên mẫu của các hàm trên như sau: int fputs(const char *str, FILE *fp); char *fgets(char *str, int length, FILE *fp); Hàm fputs() viết một chuổi trỏ ñến bởi str ñến stream trỏ ñến bởi con trỏ file fp. Hàm trả về EOF nếu một lỗi xảy ra. Hàm fgets() ñọc một chuổi từ stream tương ứng cho ñến khi gặp ký tự newline hay ñã ñọc ñược length-1 ký tự. Hàm trả về str nếu ñọc thành công và một con trỏ null nếu không. Chương trình sau minh họa hàm fputs(). Nó ñọc các chuổi từ bàn phím và viết chúng ñến file tên teststr.txt. ðể kết thúc chương trình, nhập một dòng trống #include #include #include void main(void) { char str[80]; FILE *fp; Giáo trình PP lập trình TT.Công Nghệ Thông Tin 119/124 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'); } 3.9. Hàm fread() và fwrite() ðể ñọc và viết các kiểu dữ liệu có kích thước lớn hơn 1 byte, C/C++ cung cấp hai hàm fread() và fwrite(). Những hàm này cho phép ñọc và viết một khối của bất kỳ dữ liệu nào. Nguyên mẫu của các hàm này như sau: size_t fread(void *buffer, size_t numbytes, size_t count, FILE *fp); size_t fwrite(const void *buffer, size_t numbytes, size_t count, FILE *fp); ðối với fread(), buffer là một con trỏ ñến một vùng bộ nhớ mà sẽ nhận dữ liệu ñọc từ file. ðối với fwrite(), buffer là một con trỏ ñến thông tin mà sẽ viết ñến file. Giá trị của count cho biết bao nhiêu phần tử ñược ñọc hay viết với mỗi phần tử có ñộ dài num_bytes. fp là con trỏ ñến file ñã ñược mở bởi fopen(). /* Write some non-character data to a disk file and read it back. */ #include #include void main(void) { FILE *fp; double d = 12.23; int i = 101; long l = 123023L; if((fp=fopen("testNchar.txt", "wb+"))==NULL) { cout << "Cannot open file.\n"; exit(1); } Giáo trình PP lập trình TT.Công Nghệ Thông Tin 120/124 fwrite(&d, sizeof(double), 1, fp); fwrite(&i, sizeof(int), 1, fp); fwrite(&l, sizeof(long), 1, fp); rewind(fp); fread(&d, sizeof(double), 1, fp); fread(&i, sizeof(int), 1, fp); fread(&l, sizeof(long), 1, fp); cout << “double= ” << d << endl; cout << “integer= ” << i << endl; cout << “long= ” << l; fclose(fp); } Một trong những ứng dụng hữu dụng của fread() và fwrite() là ñọc và viết kiểu dữ liệu người dùng ñịnh nghĩa như các cấu trúc. Ví dụ 1: Nhập các mẫu tin nhân viên vào tập tin employee.dat #include void main() { FILE *fp; struct employee { char name[30]; int age; }; struct employee e; char more = 'Y'; fp = fopen("employee.dat", "wb"); if(fp == NULL) { cout << "Cannot open file"); exit(1); } while(more == 'Y'|| more == ‘y’) { cout << "\nEnter name and age: "; cin >> e.name >> e.age; fwrite(&e, sizeof(e), 1, fp); cout << "Input more (y/n)?: "; fflush(stdin); more = getche(); } fclose(fp); Giáo trình PP lập trình TT.Công Nghệ Thông Tin 121/124 } Ví dụ 2: Xuất các mẫu tin nhân viên có trong tập tin employee.dat #include void main() { FILE *fp; struct employee { char name[30]; int age; }; struct employee e; fp = fopen("employee.dat", "rb"); if(fp == NULL) { cout << "Cannot open file"); exit(1); } while(fread(&e, sizeof(e), 1, fp) == 1) { cout << "\nName= " << e.name; cout << "\tAge= " << e.age; } fclose(fp); } Hàm rewind() Hàm rewind() di chuyển indicator ñến ñiểm bắt ñầu của file. Hàm có prototype như sau: void rewind(FILE *fp); Hàm ferror() Hàm ferror() cho biết một hoạt ñộng trên file ñã gây ra lỗi. Nguyên mẫu của hàm như sau: int ferror(FILE *fp); Hàm trả về true nếu một lỗi ñã xảy ra với hoạt ñộng trên file trước khi gọi hàm ferror(), ngược lại trả về false. Xóa file Hàm remove() dùng ñể xóa tập tin. Nguyên mẫu như sau: Giáo trình PP lập trình TT.Công Nghệ Thông Tin 122/124 int remove(const char *filename); Hàm trả về zero nếu xóa thành công, ngược lại trả về nonzero Flushing a stream Hàm fflush() dùng ñể xuất tất cả nội dung còn lại trong buffer của stream. Hàm có nguyên mẫu sau: int fflush(FILE *fp); Hàm viết nội dung còn trong buffer ñến file liên ñới với fp. Nếu ta gọi hàm fflush() không có ñối số thì tất cả flush tất cả file ñang mở. Hàm trả về 0 nếu thành công, ngược lại trả về EOF Truy xuất file ngẫu nhiên ðể ñọc hay viết từ hay ñến một vị trí bất kỳ trong file ta cần sự giúp ñỡ của hàm fseek(). Hàm này dùng ñể di chuyển chỉ báo file. Hàm có nguyên mẫu sau: int fseek(FILE *fp, long numbytes, int origin); fp là con trỏ trả về bởi hàm fopen() origin là một trong các giá trị sau: SEEK_SET (từ ñầu file), SEEK_CUR (từ vị trí hiện hành), và SEEK_END (từ cuối file). numbytes: số byte mà indicator di chuyển tùy thuộc origin cung cấp. Các stream chuẩn Khi một chương trình thực thi, ba stream ñược mở tự ñộng. ðó là stdin (standard input), stdout (standard output), và stderr (standard error). stdin dùng ñể ñọc từ bàn phím, stdout và stderr dùng ñể viết ñến màn hình. Bởi vì standard streams là các con trỏ file nên có thể dùng các hàm nhập xuất trên chúng. Giáo trình PP lập trình TT.Công Nghệ Thông Tin 123/124 BÀI TẬP CHƯƠNG 10 Viết hàm tạo một tập chứa 10000 số nguyên ngẫu nhiên khác nhau ñôi một trong phạm vi từ 1 ñến 32767 ñặt tên là “SONGUYEN.INP” 1) Viết hàm ñọc tập “SONGUYEN.INP”, sau ñó sắp xếp theo thứ tự tăng dần và lưu kết quả vào tập “SONGUYEN.OUT” 2) Viết hàm tạo tập văn bản có tên là “INPUT.TXT” có cấu trúc như sau - Dòng ñầu tiên ghi N (N là số nguyên dương nhập từ bàn phím) - Trong các dòng tiếp theo ghi N số nguyên ngẫu nhiên trong phạm vi từ 0 ñến 100, mỗi dòng 10 số (các số cách nhau ít nhất một dấu cách) - Hãy ñọc dữ liệu của file “INPUT.TXT” và lưu vào mảng một chiều A Hãy thực hiện các công việc sau : a) Tìm giá trị lớn lớn nhất của mảng A b) ðếm số lượng số chẳn, số lượng số lẽ của mảng A c) Hãy sắp xếp các phần tử theo thứ tự tăng dần Hãy ghi các kết quả trên vào filetext có tên là “OUTPUT.TXT” theo mẫu sau: 4) Viết hàm tạo tập văn bản có tên là “INPUT.TXT” có cấu trúc như sau - Dòng ñầu tiên ghi hai số M và N (M,N là các số nguyên dương nhập từ bàn phím) OUTPUT.TXT Cau a: 99 cau b: 9 9 cau c: 1 4 4 19 20 29 34 38 39 40 43 58 65 78 87 89 98 99 INPUT.TXT 18 87 39 78 19 89 4 40 98 29 65 20 43 1 99 38 34 58 4 Giáo trình PP lập trình TT.Công Nghệ Thông Tin 124/124 - Trong M dòng tiếp theo mỗi dòng ghi N số nguyên ngẫu nhiên trong phạm vi từ 0 ñến 50 (các số cách nhau ít nhất một dấu cách) Hãy ñọc dữ liệu của tập “INPUT.TXT” và lưu vào mảng hai chiều A. Hãy thực hiện các công việc sau: a) Tìm giá trị lớn lớn nhất của mảng A b) ðếm số lượng số chẳn, số lượng số lẽ của mảng A c) Hãy tính tổng các phần tử trên mỗi dòng của mảng A Hãy ghi các kết quả trên vào tập tin văn bản có tên là “OUTPUT.TXT” theo như mẫu trong ví dụ sau INPUT.TXT OUTPUT.TXT 5) Viết hàm ñọc một file “SONGUYEN.INP” ñược tạo ở bài tập 1. Sau ñó ghi các số chẵn vào file SOCHAN.OUT và các số lẻ vào file SOLE.OUT. 6) Viết một hàm gộp nội dung của hai tập tin có sẵn vào một tập tin thứ ba. Tên các tập tin ñược nhập vào từ bàn phím. 7) Viết một hàm tìm kiếm trên tập nhị phân có cấu trúc employee gồm tên và tuổi. Hiển thị kết quả là tất cả các thông tin về các nhân viên ñược tìm thấy khi cho biết : a) Tên nhân viên b) Có tuổi cao hơn một giá trị X nào ñó. 6 6 41 17 33 23 12 1 44 24 23 49 5 24 33 20 17 25 33 19 0 48 45 48 41 32 10 24 36 19 19 24 30 4 23 26 27 36 Cau a: 49 Cau b: 17 19 Cau c: 127 169 147 214 132 146
File đính kèm:
- Final_KTLT_print16x235.pdf