Đọc ghi đồng thời theo kiểu nhị phân
Chương trình dưới đây minh hoạ cách đọc ghi đồng thời trên tệp theo kiểu nhị phân.
Chương trình sử dụng các phương thức write, read, các phương thức di chuyển con trỏ tệp và
các phương thức kiểm tra lỗi. Chương trình gồm 3 chức năng:
1. Nhập một danh sách thí sinh mới và ghi vào tệp TS.DL
2. Bổ sung thí sinh vào tệp TS.DL
3. Xem sửa thí sinh trên tệp TS.DL
//CT7_18.CPP
// Doc tep
#include <iostream.h>
#include <iomanip.h>
#include <fstream.h>
#include <conio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <stdio.h>
struct TSINH
{
char ht[25];
int sobd;
float td;
};
class TS
{
private:
TSINH ts;
char ten_tep[40];
int sots;
static int size;
public:
TS(char *ttep);
void tao_ds();
void bo_sung();
void xem_sua();
};
int TS::size = sizeof(TSINH);
TS::TS(char *ttep)
{
strcpy(ten_tep,ttep);
fstream f;
f.open(ten_tep,ios::binary|ios::in|ios::ate);
if (!f.good())
sots = 0 ;
else
{
sots=f.tellg()/size ;
}
}
void TS::tao_ds()
{
fstream f;
f.open(ten_tep,ios::binary|ios::out|ios::noreplace);
if (!f.good())
{
cout << "\nDanh sach da ton tai" ;
cout << "\nCo tao lai khong? - C/K" ;
char ch=getch();
if (toupper(ch) != 'C')
return;
else
{
f.close();
f.open(ten_tep,ios::binary|ios::out|ios::trunc);
}
}
sots=0;
while(1)
{
cout << "\nThi sinh thu: " << (sots+1) ;
cout << "\nHo ten (Bam Enter de ket thuc): ";
fflush(stdin);
gets(ts.ht);
if (ts.ht[0]==0) break;
cout << "\nSo bao danh: ";
cin >> ts.sobd;
cout << "\nTong diem: ";
cin >> ts.td;
f.write((char*)(&ts),size) ;
sots++ ;
432
}
f.close();
}
void TS::bo_sung()
{
fstream f;
f.open(ten_tep,ios::binary|ios::app|ios::nocreate);
if (!f.good())
{
cout << "\nDanh sach chua tao" ;
cout << "\nCo tao moi khong? - C/K" ;
char ch=getch();
if (toupper(ch) != 'C')
return;
else
{
f.close();
f.open(ten_tep,ios::binary|ios::out);
}
}
int stt=0;
while(1)
{
cout << "\nBo sung thi sinh thu: " << (stt+1);
cout << "\nHo ten (Bam Enter de ket thuc): ";
fflush(stdin);
gets(ts.ht);
if (ts.ht[0]==0) break;
cout << "\nSo bao danh: ";
cin >> ts.sobd;
cout << "\nTong diem: ";
cin >> ts.td;
f.write((char*)(&ts),size) ;
++stt;
}
sots += stt ;
f.close();
}
void TS::xem_sua()
434
{
fstream f; int ch;
f.open(ten_tep,ios::binary|ios::out|ios::in|ios::nocreate);
if (!f.good())
{
cout << "\nDanh sach chua tao" ;
getch();
return ;
}
cout << "\nDanh sach gom: " << sots << "thi sinh" ;
int stt;
while(1)
{
cout << "\nCan xem-sua thi sinh thu (Bam 0 de ket thuc): " ;
cin >> stt ;
if (stt<1 || stt > sots) break;
f.seekg((stt-1)*size,ios::beg);
f.read((char*)(&ts),size);
cout << "\nHo ten : " << ts.ht;
cout << "\nSo ba danh: " << ts.sobd ;
cout << "\nTong diem: " << ts.td ;
cout << "\nCo sua khong? - C/K" ;
ch=getch();
if (toupper(ch)=='C')
{
f.seekg(-size,ios::cur) ;
cout << "\nHo ten: ";
fflush(stdin);
gets(ts.ht);
cout << "\nSo bao danh: ";
cin >> ts.sobd;
cout << "\nTong diem: ";
cin >> ts.td;
f.write((char*)(&ts),size) ;
}
}
f.close();
}
void main()
{
int chon;
clrscr();
TS t("TS.DL");
while(1)
{
clrscr();
cout << "\n1. Tao danh sach thi sinh moi" ;
cout << "\n2. Bo sung danh sach thi sinh" ;
cout << "\n3. Xem-sua danh sach thi sinh" ;
cout << "\n4. Ket thuc chuong trinh " ;
chon = getch();
chon = chon - 48;
clrscr();
if (chon==1) t.tao_ds();
else if(chon==2) t.bo_sung();
else if(chon==3) t.xem_sua();
else break;
}
clrscr();
cout << "\n Hoan thanh";
getch();
}
436