c++ - 附加和读取二进制文件时出现分段错误
问题描述
我正在制作一个登录系统,它将用户名和密码保存在一个二进制文件中,所以如果任何用户名或密码匹配,它应该显示“匹配!” 它适用于 txt 文件,但在二进制模式下会出现分段错误
我试图将 f.read() 放在循环之外并手动读取它。我也尝试在 !f.eof() 变为真时终止循环,但在所有情况下都会发生同样的问题
这是代码
#include<iostream>
#include<fstream>
using namespace std;
class Login {
public:
string username;
int pass;
Login() {
}
Login(string u,int p) {
username = u;
pass =p;
}
};
int main() {
fstream f("sarah.bin",ios::in|ios::app|ios::binary);
if(!f) cout<<"error"<<endl;
//adding data,take data from user
Login l("ahmed",123),k;
f.write((char*)&l,sizeof(l));
bool logged = false;
string s = "ahmed";
int p = 123;
f.seekg(0,ios::beg);
//verification
while(!f.eof() && f.read((char*)&k,sizeof(l))) {
if(k.pass==p && k.username == s) {
cout<<"logged";
logged = true;
break;
}
}
if(!logged)
cout<<"not matched";
f.close();
}
它没有给出预期的结果,而是给出了分段错误,有时根本没有输出。
解决方案
实际上问题是:我使用的是非 POD 数据类型 .ie 导致错误的字符串,所以我所做的解决方案是将字符串替换为字符数组。另一种解决方案是将其写入txt文件。
推荐阅读
- reactjs - 遇到:Hooks 只能在函数组件的主体内部调用。这可能是由于以下原因之一
- javascript - 当屏幕尺寸发生变化时,如何停止引导程序(reactstrap)下拉菜单重新定位?
- gradle - 如何忽略 Gradle 控制台输出中的特定消息?
- amazon-web-services - 在 s3 存储桶上编辑 Python 脚本
- java - 比较一个类的实例
- react-native - 反应导航 5 在嵌套导航中隐藏底部选项卡导航
- flutter - 如何强制显示文本选择控件?
- angular - Angular 2+ HTTP Request - 为成功和错误响应显示加载微调器的最短持续时间
- typescript - 创建具有名称和类型属性的类型值的对象
- reactjs - 通过 remember_token 进行身份验证