linqy的个人博客分享 http://blog.sciencenet.cn/u/linqy

博文

文件的内容的读取、查找、替换、输出等基本功能的实现

已有 2531 次阅读 2017-7-3 19:48 |个人分类:C++|系统分类:科研笔记| 文件基本操作

文件的读取是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;
   }

}



https://blog.sciencenet.cn/blog-3134052-1064391.html

上一篇:无法访问private成员(在“std::basic_ios<_Elem,_Traits>”)
下一篇:友元函数以及插入操作符重载函数的声明和应用
收藏 IP: 124.207.244.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...
扫一扫,分享此博文

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-9-27 15:20

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部