struct staff
{
char name[10]; //姓名兼登录名
char loadCode[7]; //登陆密码
};
#include<iostream>
#include<vector>
#include<fstream>
using namespace std;
void sellerChangecode();
void openSellerdata1();
void openSellerdata2();
vector<staff> seller;
staff seller1;
fstream iofile;
int main()
{
openSellerdata1();
cin>>seller1.name>>seller1.loadCode;
iofile.write((char*)&seller1,sizeof(staff));
cin>>seller1.name>>seller1.loadCode;
iofile.write((char*)&seller1,sizeof(staff));
iofile.close();
sellerChangecode();
return 0;
}
void sellerChangecode()
{
struct staff seller2;
cout<<“请输入原用户名”<<endl;
cin>>seller2.name;
cout<<“请输入原密码”<<endl;
cin>>seller2.loadCode;
openSellerdata1(); //打开不清空
cout<<seller.size()<<“of sellers”<<endl;
while(!iofile.eof())
{
iofile.read((char*)&seller1,sizeof(staff));
cout<<seller1.name<<seller1.loadCode<<endl;
seller.push_back(seller1);
}
seller.pop_back();
iofile.close(); //关闭
cout<<seller.size()<<“of sellers”<<endl;
vector<staff>::iterator it;
for(it=seller.begin();it!=seller.end();++it)
{
if(strcmp(seller2.name,it->name)==0)
if(strcmp(seller2.name,it->name)==0&&strcmp(seller2.loadCode,it->loadCode)==0)
{
cin>>seller2.loadCode;
strcpy_s(it->loadCode,seller2.loadCode);
break;
}
}
cout<<seller.size()<<“of sellers”<<endl; //成功进入seller中
openSellerdata2(); //打开文件并清空
it=seller.begin();
for(it=seller.begin();it!=seller.end();++it) //本人已经试过iofile.write((char*)&seller[0],sizeof(staff)*2);还是写不进文件
{ //虽然这样写很蠢。不要吐槽本人。
strcpy_s(seller2.name,it->name);
strcpy_s(seller2.loadCode,it->loadCode);
iofile.write((char*)&seller2,sizeof(staff));
}
iofile.close();
}
//–打开并清空售货员文件–
void openSellerdata2()
{
iofile.open(“Seller informations.dat”,ios::out|ios::binary|ios::trunc);
if(!iofile.is_open())
{
cout<<“Seller informations.dat can”t open for write.”<<endl;
exit(1);
}
}
//–打开并清空售货员文件–
//–打开不清空售货员文件–
void openSellerdata1()
{
iofile.open(“Seller informations.dat”,ios::in|ios::out|ios::binary|ios::app);
if(!iofile.is_open())
{
cout<<“Seller informations.dat can”t open for write.”<<endl;
exit(1);
}
}
//–打开不清空售货员文件–
这里是部分代码,主要本人是想实现修改密码的功能,主函数里是往文件里输入两个用户的信息。主要就是拿来做个测试,有两个问题,一个是从文件里将数据读到seller里的时候,循环会多执行一次。第二个问题是,为啥写不进文件啊。本人调试过了。seller里指定值成功修改了,不是空的。
{
char name[10]; //姓名兼登录名
char loadCode[7]; //登陆密码
};
#include<iostream>
#include<vector>
#include<fstream>
using namespace std;
void sellerChangecode();
void openSellerdata1();
void openSellerdata2();
vector<staff> seller;
staff seller1;
fstream iofile;
int main()
{
openSellerdata1();
cin>>seller1.name>>seller1.loadCode;
iofile.write((char*)&seller1,sizeof(staff));
cin>>seller1.name>>seller1.loadCode;
iofile.write((char*)&seller1,sizeof(staff));
iofile.close();
sellerChangecode();
return 0;
}
void sellerChangecode()
{
struct staff seller2;
cout<<“请输入原用户名”<<endl;
cin>>seller2.name;
cout<<“请输入原密码”<<endl;
cin>>seller2.loadCode;
openSellerdata1(); //打开不清空
cout<<seller.size()<<“of sellers”<<endl;
while(!iofile.eof())
{
iofile.read((char*)&seller1,sizeof(staff));
cout<<seller1.name<<seller1.loadCode<<endl;
seller.push_back(seller1);
}
seller.pop_back();
iofile.close(); //关闭
cout<<seller.size()<<“of sellers”<<endl;
vector<staff>::iterator it;
for(it=seller.begin();it!=seller.end();++it)
{
if(strcmp(seller2.name,it->name)==0)
if(strcmp(seller2.name,it->name)==0&&strcmp(seller2.loadCode,it->loadCode)==0)
{
cin>>seller2.loadCode;
strcpy_s(it->loadCode,seller2.loadCode);
break;
}
}
cout<<seller.size()<<“of sellers”<<endl; //成功进入seller中
openSellerdata2(); //打开文件并清空
it=seller.begin();
for(it=seller.begin();it!=seller.end();++it) //本人已经试过iofile.write((char*)&seller[0],sizeof(staff)*2);还是写不进文件
{ //虽然这样写很蠢。不要吐槽本人。
strcpy_s(seller2.name,it->name);
strcpy_s(seller2.loadCode,it->loadCode);
iofile.write((char*)&seller2,sizeof(staff));
}
iofile.close();
}
//–打开并清空售货员文件–
void openSellerdata2()
{
iofile.open(“Seller informations.dat”,ios::out|ios::binary|ios::trunc);
if(!iofile.is_open())
{
cout<<“Seller informations.dat can”t open for write.”<<endl;
exit(1);
}
}
//–打开并清空售货员文件–
//–打开不清空售货员文件–
void openSellerdata1()
{
iofile.open(“Seller informations.dat”,ios::in|ios::out|ios::binary|ios::app);
if(!iofile.is_open())
{
cout<<“Seller informations.dat can”t open for write.”<<endl;
exit(1);
}
}
//–打开不清空售货员文件–
这里是部分代码,主要本人是想实现修改密码的功能,主函数里是往文件里输入两个用户的信息。主要就是拿来做个测试,有两个问题,一个是从文件里将数据读到seller里的时候,循环会多执行一次。第二个问题是,为啥写不进文件啊。本人调试过了。seller里指定值成功修改了,不是空的。
解决方案
4
本人猜你读取的时候多循环了一次,是原因是你的文件最后多了一个空行
17
第一个问题,你去百度while(!iofile.eof()) 这个,这个是默认多执行一次的,所以你要退出循环要在while循环体内一开始做一个判断,符合条件之后break,而不是完全依赖while条件的。
第二个问题,每一次调用C++读写类完成一次预期目标后,最后要做清理,调用成员函数.clear()
以上两个经验,供参考。
第二个问题,每一次调用C++读写类完成一次预期目标后,最后要做清理,调用成员函数.clear()
以上两个经验,供参考。
1
虽然,没看,但是还是同意楼上的
10
不要使用 while (条件) 更不要使用 while (组合条件) 要使用 while (1) { if (条件1) break; //... if (条件2) continue; //... if (条件3) return; //... } 原因是前两种写法在语言表达意思的层面上有二义性,只有第三种才忠实反映了程序流的实际情况。 典型如: 下面两段的语义都是当文件未结束时读字符 while (!feof(f)) { a=fgetc(f); //... b=fgetc(f);//可能此时已经feof了! //... } 而这样写就没有问题: while (1) { a=fgetc(f); if (feof(f)) break; //... b=fgetc(f); if (feof(f)) break; //... } 相似的例子还可以举很多。