关于无法将容器里的数据写入文件的问题

C++语言 码拜 8年前 (2017-04-15) 904次浏览
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里指定值成功修改了,不是空的。
解决方案

4

本人猜你读取的时候多循环了一次,是原因是你的文件最后多了一个空行

17

第一个问题,你去百度while(!iofile.eof())   这个,这个是默认多执行一次的,所以你要退出循环要在while循环体内一开始做一个判断,符合条件之后break,而不是完全依赖while条件的。
第二个问题,每一次调用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;
 //...
}
相似的例子还可以举很多。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明关于无法将容器里的数据写入文件的问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)