C++二进制文件读写

/*文件内容
name grade
a 50
b 60
c 80
d 100
e 120
f 30
*/
#include<iostream>
#include<algorithm>
#include<string>
#include<fstream>
#include<sstream>
using namespace std;
#define MaxSize 10
struct Grade{
	string name;
	int num;
	bool operator<(struct Grade &person) const{
		return num>person.num;
	}
};
class manager{
	private:
		Grade grade[MaxSize];
		int n=0;
		string headline;
	public:
		manager(string file){
			ifstream infile;
			infile.open(file);
			if(!infile.is_open())	cout<<"open read_1 file failure."<<endl;
			getline(infile,headline);
			while(!infile.eof()){
				string temp; getline(infile,temp);
				istringstream is(temp);
				is>>grade[n].name>>grade[n].num;
				n++;
			}
			infile.close();
		}
		void sort_self(){
			sort(grade,grade+n);
		}
		void print(){
			for(int i=0;i<n;i++){
				cout<<grade[i].name<<" "<<grade[i].num<<endl;
			}
		} 
		void write_self(string file){//写进二进制文件 
			ofstream outfile;
			outfile.open(file,ios::out|ios_base::binary);
			if(!outfile.is_open())	cout<<"open write_1 file failure."<<endl;
//			outfile.write(headline.c_str(),sizeof(char)*(headline.size()));
			for(int i=0;i<n;i++){
				outfile.write((char*)&grade[i],sizeof(Grade));
			}
			outfile.close();
		}
		void read_self(string file){//读取文本文件 
			string headline_new;
			ifstream infile;
			infile.open(file);
			if(!infile.is_open())	cout<<"open read_2 file failure."<<endl;
			getline(infile,headline_new); cout<<headline_new<<endl;
			for(int i=0;i<n;i++){
				string temp; getline(infile,temp);
				istringstream is(temp);
				string name; int num;
				is>>name>>num;cout<<name<<" "<<num<<endl;
			}
		}

		void read_new_self(string file){
			string headline_new;
			ifstream infile;
			infile.open(file,ios::in|ios_base::binary);
			if(!infile.is_open())	cout<<"open read_2 file failure."<<endl;
//			infile.read((char*)&headline_new,sizeof(headline_new));
//			cout<<headline_new;
			cout<<headline<<endl;
			for(int i=0;i<n;i++){
				Grade temp;
				infile.read((char*)&temp,sizeof(Grade));
				cout<<temp.name<<" "<<temp.num<<endl;
			}
			infile.close();
		}
		void change(string file,int line){//第line行 
			ofstream outfile;
			outfile.open(file,ios::out | ios::in|ios_base::binary);///out的默认模式会清空文件内容,达不到修改的目的
//			outfile.clear();//改变锁定eof指针(即到文件末尾
			Grade temp;temp.name=grade[line-1].name;temp.num=grade[line-1].num+20;
			outfile.seekp((line-1)*sizeof(temp), ios::beg);//若是到末尾,tell会返回-1,这里调试的时候费了好大的劲
			outfile.write((char*)&temp,sizeof(Grade));//写这一步的时候出现过结构体的字节对称问题,都使用数组里的sizeof或许比较安全,例如sizeof(grade[0]),领悟之后懒得改
			outfile.close();
		}
};
int main(void){
	manager object("C:\\Users\\招摇\\Desktop\\a.txt");
	object.sort_self();
//	object.print();
	object.write_self("C:\\Users\\招摇\\Desktop\\a_plus.dat");
	object.change("C:\\Users\\招摇\\Desktop\\a_plus.dat",3);
	object.read_new_self("C:\\Users\\招摇\\Desktop\\a_plus.dat");
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值