c++ - 将对象写入文件和从文件读取对象

标签 c++ file object fstream stdstring

我有一个具有两个 std::string 属性的 User 类。当我尝试从文件中读取它时,我从第 222 行的 uxitility 中得到异常: (*_Pnext)->_Myproxy = nullptr; 它发生在函数 isUserInFile()

之后

我的代码的一些和平:

Class User {
protected:
    std::string login;
    std::string password;
public:
    friend std::istream&operator>>(std::istream&in, User &obj) {
        //std::cout << "Логин: "; //"Login: "
        in >> obj.login;
        //std::cout << "Пароль: "; //"Password: "
        in >> obj.password;
        return in;
    }
    friend std::ostream&operator<<(std::ostream&out, User&obj) {
        out << obj.login << " " << obj.password;
        return out;
    }
    void encrypt() {
        char key[3] = { 'K','E','Y' };
        std::string buf = password;
        for (int i = 0; i < buf.size(); i++)
            buf[i] = password[i] ^ key[i % (sizeof(key) / sizeof(char))];
        password = buf;
        //buf.clear();
    }
    bool isUserInFile() {
        User user;
        std::ifstream file;
        file.open("Users.txt");
        while (!file.eof() && file.read((char*)&user, sizeof(User)))
            if (login == user.login) {
                file.close();
                return true;
            }
        file.close();
        return false;
    }
};
bool registration() {
    User user;
    std::fstream file;
    file.open("Users.txt", std::ios::in | std::ios::out | std::ios::app);
    std::cout << "Регистрация:\n"; //"Registration:\n"
    std::cin >> user;
    user.encrypt();
    if (!user.isUserInFile()) {
            file.write((char*)&user, sizeof(User));
        file.close();
        return true;
    }
    std::cout << "Пользователь с данным логином уже существует\n"; //"User with this login already exists\n"
    file.close();
    system("pause");
    return false;
}

最佳答案

评论的方向正确,显示了问题所在。但解决方案要简单得多,您已经有了流操作符,所以只需使用它们即可!

要写入文件,您可以使用:

file << user << std::endl;

然后简单地读给你听:

file >> user;

为了继续工作,您需要一些东西:

  1. 用户永远不应在其密码中的任何位置输入空格。
  2. 您需要确保写作和阅读始终以相同的顺序完成。

或者,您可以按照以下行创建从字符串到字符串的转换:

static const char SEP1 = ' ', SEP2 = '\r';
friend std::string to_string(const User& u)
{
  std::string result = u.login + SEP1 + u.password + SEP2;
  return result;
}
explicit User(std::string line)
{
  size_t pos1 = s.find(SEP1);
  size_t pos2 = s.find(SEP2, pos1);
  login = s.substr(0, pos1);
  password = s.substr(pos1+1, pos2-pos1);
}

然后你可以在你的 main 中读取一个数据 block 并简单地从中构造一个用户,或者你可以在写入之前将用户转换为字符串。这种方法的优点在于您可以选择分隔符并且它们在函数之间是稳定的。

关于c++ - 将对象写入文件和从文件读取对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55752016/

相关文章:

c++ - 将指向堆栈变量的指针传递给 realloc() 是否有效?

c++ - 静态分析检查未能发现琐碎的 C++ 问题

c++ - 在 C++ 中将指向前向声明的类的指针转换为其真正的基类是否安全?

java - 如何将文件中的数据读取到数组中?

Javascript:拼接多维对象

javascript - For 循环不迭代每个语句

c++ - 处理使用 boost::interprocess STL 兼容共享内存分配器创建的 C++ 对象的正确方法是什么?

java - 使用 Java 提取 ISO 文件

c++ - 避免使用 "return"语句复制对象

jquery - 如何使用jquery发送文件输入?