/*文件内容
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;
}
C++二进制文件读写
最新推荐文章于 2023-01-29 15:01:08 发布