【问题标题】:Segmentation Fault while appending and reading a binary file附加和读取二进制文件时出现分段错误
【发布时间】: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?为什么你似乎将凭证存储在普通的地方,而不是散列?

标签: c++ file-io


【解决方案1】:

实际上问题是:我使用的是非 POD 数据类型。即导致错误的字符串 所以我做的解决方案是用字符数组替换字符串。 另一种解决方案是将其写入txt文件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-02
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-17
    相关资源
    最近更新 更多