|||
文件的读取是C++的一项基本功能,在是其他操作的基础,下面的代码实现了对文件的读取、查找、替换和显示等内容。
#include <fstream>
#include <stdlib.h>
#include <string>
using namespace std;
struct pupil {
char name[10];
int grade;
};
void Append(fstream& fio,int& n,const pupil& rec);
bool Find(fstream& fio,int n,pupil& rec);
bool Update(fstream& fio,int n, const pupil& rec);
void Print(fstream& fio,int n);
void main()
{
//文件的更新和查询
char *filepath = "C:\Users\linqy\Desktop\shf2.dat";//文件的路径
/*fstream fout(filepath,ios::out | ios::trunc | ios::binary);
if (!fout)
{
cerr<<"file open failed !"<<endl;
exit(1);
}*/
/*pupil xx;
cout<<"请输入若干条学生的记录,按ctrl + z 结束:"<<endl;
while (cin>>xx.name)
{
cin>>xx.grade;
fout.write((char*)&xx,sizeof(xx));
}
fout.close();
cout<<"输入结束。"<<endl;*/
fstream ff(filepath,ios::out | ios::in | ios::_Nocreate | ios::binary);
if (!ff)
{
cerr<<"file open failed !"<<endl;
exit(1);
}
pupil xx;
int i;
ff.seekg(0,ios::end);
int n = ff.tellg()/sizeof(xx);
while(1)
{
cout<<" 功能号列表:"<<endl;
cout<<"1--向文件追加一条记录"<<endl;//可以运行
cout<<"2--按姓名查找记录"<<endl;
cout<<"3--按姓名更新记录"<<endl;
cout<<"4--向屏幕输出文件所有记录"<<endl;//可以运行
cout<<"5--运行结束!"<<endl;//可以运行
cout<<"请输入选择(1-5):"<<endl;
cin>>i;
switch(i)
{
case(1):
cout<<"输入待追加学生的记录(name and grade):"<<endl;
cin>>xx.name>>xx.grade;
Append(ff,n,xx);
break;
case(2):
cout<<" 输入待查找学生的姓名:"<<endl;
cin>>xx.name;
Find(ff,n,xx);
break;
case(3):
cout<<"输入待更新学生的记录:"<<endl;
cin>>xx.name>>xx.grade;
Update(ff,n,xx);
break;
case(4):
cout<<"输入出文件的内容:"<<endl;
Print(ff,n);
break;
case(5):
cout<<"运行结束。"<<endl;
return ;
}
}
ff.close();
system("pause");
}
void Append(fstream& fio,int& n,const pupil& rec)
{
fio.seekg(0,ios::end);
fio.write((char*)&rec,sizeof(rec));
n++;
}
bool Find(fstream& fio,int n,pupil& rec)
{
fio.seekg(0);
pupil xx;
for (int i = 0; i < n; i++)
{
if (fio.read((char*)&xx,sizeof(xx)))
if (strcmp(xx.name,rec.name) == 0)
{
cout<<"记录被找到!"<<xx.name<<" "<<xx.grade<<endl;
rec = xx;
return true;
}
}
cout<<"没有找到姓名为: "<<rec.name<<"的记录!"<<endl;
return false;
}
bool Update(fstream& fio,int n, const pupil& rec)
{
fio.seekg(0);
pupil xx;
int m = sizeof(xx);
for (size_t i = 0; i < n; i++)
{
if (fio.read((char*)& xx,m))
if (strcmp(xx.name,rec.name) == 0)
{
fio.seekg(-m,ios::cur);
fio.write((char*)&rec,m);
cout<<rec.name<<" 的记录更新完成!"<<endl;
return true;
}
}
cout<<"没有找到姓名为"<<rec.name<<"的待更新记录!"<<endl;
return false;
}
void Print(fstream& fio,int n)
{
fio.seekg(0);
pupil xx;
for (size_t i = 0;i < n; i++)
{
fio.read((char*)& xx,sizeof(xx));
cout<<xx.name<<" "<<xx.grade<<endl;
}
}
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-9-27 15:20
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社