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

