Kiểm tra sự tồn tại của tệp, kiểm tra cuối tệp

Một phần của tài liệu Các dòng tin (Trang 38 - 45)

Khi mở một tệp ựể ựọc mà tệp không tồn tại thì sẽ phát sinh lỗi, khi ựó phương thức bad trả về giá trị khác không. Vắ dụ ựể kiểm tra xem tệp DSTS (Danh sách thắ sinh) ựã tồn tại hay không có thể dùng ựoạn chương trình:

ifstream fin(ỘDSTSỢ); if (fin.bad())

{

cout << Ộ\nTep DSTS không tồn taiỢ; exit(1);

}

Trong quá trình ựọc, con trỏ tệp sẽ chuyển dần về cuối tệp. Khi con trỏ tệp ựã ở cuối tệp (hết dữ liệu) mà vẫn thực hiện một lệnh ựọc thì phương thức eof sẽ cho giá trị khác không. Chương trình dưới ựây dùng phương thức eof ựể xác ựịnh ựộ dài (số byte) của tệp TC.EXE (chú ý cần dùng kiểu ựọc nhị phân):

// Do dai tep #include <iostream.h> #include <fstream.h> #include <conio.h> #include <stdlib.h> void main() { clrscr(); long dd=0; char ch;

ifstream f("TC.EXE",ios::in | ios::binary); if (f.bad())

{

cout << "\nTep TC.EXE khong ton tai"; getch();

exit(1); }

while(f.get(ch),!f.eof()) ++dd;

cout << "\n Do dai TC.EXE: " << dd; getch();

}

12.4. Vắ dụ

Chương trình dưới ựây sẽ:

+ đọc danh sách thắ sinh từ tệp DS1.DL do chương trình trong muc ậ11 tạo ra. + In danh sách thắ sinh vừa ựọc.

+ Sắp xếp dẫy thắ sinh (vừa nhập từ tệp) theo thứ tự giảm của tổng ựiểm. + Ghi danh sách thắ sinh sau khi sắp xếp lên tệp DS3.DL

+ đọc danh sách thắ sinh từ tệp DS3.DL + In danh sách thắ sinh ựọc từ tệp DS3.DL

Chương trình sử dụng lớp TS (Thắ sinh) có 4 phương thức: void xuat();

void sapxep();

void ghitep(char *ttep); void doctep(char *ttep); // Doc tep #include <iostream.h> #include <iomanip.h> #include <fstream.h> #include <conio.h> #include <stdlib.h> #include <ctype.h> struct TSINH { char ht[25]; char ttinh[21]; int sobd; float dt,dl,dh,td; } ; class TS { private: int sots; TSINH *ts; public: TS() { sots=0; ts = NULL; } void xuat(); void sapxep();

void doctep(char *ttep); };

void TS::xuat() {

cout << "\n\nSo thi sinh: " << sots;

cout << setprecision(1) << setiosflags(ios::showpoint); for (int i=1; i<=sots; ++i)

{

cout << "\nThi sinh thu: " << i ; cout << "\nHo ten: " << ts[i].ht ;

cout << "\nTinh - thanh pho: " << ts[i].ttinh ; cout << "\nSo bao danh: " << ts[i].sobd ; cout << "\nCac diem toan, ly, hoa: "

<< setw(5) << ts[i].dt << setw(5) << ts[i].dl << setw(5) << ts[i].dh ;

cout << "\nTong diem: " << ts[i].td ; }

}

void TS::sapxep() {

int n = sots;

for (int i=1; i< n; ++i)

for (int j=i+1; j<= n; ++j) if (ts[i].td < ts[j].td)

{

TSINH tg = ts[i]; ts[i] = ts[j]; ts[j] = tg; }

}

void TS::ghitep(char *ttep) {

ofstream f;

f.open(ttep,ios::out|ios::noreplace); if (f.bad())

{

cout << "\nTep " << ttep << " da ton tai"; cout << "\nCo ghi de? - C/K";

int ch=getch(); if (toupper(ch)=='C') { f.close(); f.open(ttep) ; } else exit(1); } f << sots ; f << setprecision(1) << setiosflags(ios::showpoint); for (int i=1; i<=sots; ++i) {

f << endl << setw(24) << ts[i].ht << setw(20) << ts[i].ttinh ; f << endl << setw(6) << ts[i].sobd

<< setw(6) << ts[i].dt << setw(6) << ts[i].dl << setw(6) << ts[i].dh << setw(6) << ts[i].td ; } f.close(); }

void TS::doctep(char *ttep) {

ifstream f; f.open(ttep); if (f.bad())

{

cout << "\nTep " << ttep << " khong ton tai"; getch();

exit(1); }

f >> sots ; f.ignore();

if (ts!=NULL) delete ts; ts = new TSINH[sots+1]; for (int i=1; i<=sots; ++i)

{

f.get(ts[i].ht,25).get(ts[i].ttinh,21); ; f >> ts[i].sobd >> ts[i].dt >> ts[i].dl

>> ts[i].dh >> ts[i].td ; f.ignore(); } f.close(); } void main() { clrscr(); TS t; t.doctep("DS1.DL"); t.xuat(); t.sapxep(); t.ghitep("DS3.DL"); t.doctep("DS3.DL"); t.xuat();

cout << "\n Hoan thanh"; getch();

}

ậ 13. đỌC GHI đỒNG THỜI TRÊN TỆP 13.1. Lớp fstream

để ựọc ghi ựồng thời trên tệp, chúng ta sử dụng lớp fstream. Lớp fstream thừa kế các phương thức của các lớp ofstream và ifstream. Ngoài ra lớp fstream có các hàm tạo và phương thức sau:

1. Hàm tạo: fstream() ; // Không ựối

dùng ựể tạo một ựối tượng fstream (dòng nhập-xuất), chưa gắn với tệp.

2. Hàm tạo: fstream(const char *fn, int mode, int prot = filebuf::openprot); dùng ựể tạo một ựối tượng fstream, mở tệp có tên fn và gắn ựối tượng vừa tạo với tệp ựược mở.

+ Tham số mode quy ựịnh các kiểu truy nhập và có thể là tổ hợp của các giá trị sau:

ios::binary ựọc-ghi theo kiểu nhị phân (mặc ựịnh theo kiểu văn bản).

ios::out ghi tệp, nếu tệp ựã có thì nó bị xoá ios::in ựọc tệp

ios::app ghi bổ sung vào cuối tệp

ios::ate chuyển con trỏ tệp về cuối sau khi mở ios::trunc xoá nội dung của tệp nếu nó tồn tại

ios::nocreate nếu tệp chưa có thì không làm gì (bỏ qua) ios::noreplace nếu tệp ựã có thì không làm gì (bỏ qua)

Chú ý:

+ Tham số mode không có giá trị mặc ựịnh.

+ Tham số thứ ba prot quy ựịnh cấp bảo vệ của dòng tin, tham số này có thể bỏ qua vì nó ựã ựược gán một giá trị mặc ựịnh.

3. Hàm tạo: fstream(int fd);

dùng ựể tạo một ựối tượng fstream và gắn nó với một tệp có chỉ số fd ựang mở. (để mở và lấy chỉ số (số hiệu) tệp có thể dùng hàm _open, xem cuốn Kỹ thuật Lập trình C của tác giả)

4. Hàm tạo: fstream(int fd, char *buf, int n);

dùng ựể tạo một ựối tượng fstream , gắn nó với một tệp có chỉ số fd ựang mở và sử dùng một vùng nhớ n byte do buf trỏ tới làm bộ ựệm.

5. Phương thức: void open(const char *fn, int mode, int prot = filebuf::openprot);

dùng ựể mở tệp có tên fn và gắn nó với ựối tượng fstream. Các tham số của phương thức có cùng ý nghĩa như trong hàm tạo thứ 2.

Chú ý: Tham số mode không có giá trị mặc ựịnh. 13.2. Các cách ựọc-ghi ựồng thời trên tệp

Có hai cách chắnh sau:

Cách 1: Dùng hàm tạo 2 ựể xây dựng một dòng nhập-xuất, mở một tệp ựể ựọc-

ghi và gắn tệp với dòng nhập-xuất. Sau ựó dùng toán tử nhập >> , toán tử xuất >> và các phương thức nhập, xuất ựể nhập, xuất dữ liệu ra dùng nhập-xuất vừa tạo (như ựối với các dòng chuẩn cin và cout).

Vắ dụ:

fstream f(ỘDU_LIEUỢ, ios::in | ios::out) ;

Cách 2: Dùng hàm tạo 1 ựể xây dựng một dòng nhập-xuất. Sau ựó dùng phương

thức open ựể mở một tệp cụ thể (ựể ựọc và ghi) và cho gắn với dòng nhập-xuất vừa xây dựng. Khi không cần làm việc với tệp này nữa, chúng ta có thể dùng phương

thức close ựể chấm dứt mọi ràng buộc giữa dòng nhập-xuất và tệp. Sau ựó có thể gắn dòng nhập-xuất với tệp khác. Theo cách này, có thể dùng một dòng nhập-xuất (ựối tượng fstream) ựể ựọc-ghi dữ liệu từ nhiều tệp khác nhau.

Vắ dụ:

fstream f;

f.open(ỘDU_LIEUỢ, ios::in | ios::out) ;

Một phần của tài liệu Các dòng tin (Trang 38 - 45)

Tải bản đầy đủ (PDF)

(65 trang)