【发布时间】:2019-04-30 16:36:36
【问题描述】:
我正在制作一个登录系统,它将用户名和密码保存在二进制文件中 所以如果任何用户名或密码匹配,它应该显示“匹配!” 它适用于 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();
}
它没有给出预期的结果,而是给出了分段错误,有时根本没有输出。
【问题讨论】:
-
用
std::fstream::write/std::fstream::read写/读非POD类型会导致UB。 -
^^ 那么我该如何克服这个问题呢?
-
@MuhammadAhmed 你没有 POD 类型,涉及到
std::string。 -
我怎样才能克服这个问题?使用适当的序列化可能会摆脱二进制文件并使用文本。
-
为什么密码是
integers?为什么你似乎将凭证存储在普通的地方,而不是散列?