c++ 将对象向量写入文件,然后阅读它

3htmauhk  于 2022-11-19  发布在  其他
关注(0)|答案(1)|浏览(146)

我是C++和stackoverflow的新手,所以请原谅我帖子中的任何错误;)。我需要创建一个代码,它允许我用std::cin中的数据填充新对象,并在以后将这些对象导出到二进制文件。另外,我需要在某个时候导入导出到文件中的对象。对象用标准用户信息(如用户名、ID、lvl等)表示用户。

#include <vector>
#include <string>
#include <iostream>
class User {

    std::string username;
    unsigned int ID, lvl;
public:

    User(std::string un, int uID, int ulvl) {

        username = un;
        ID = uID;
        lvl = ulvl;
    }
};
int main() {
    std::string u_name;
    int u_ID,u_lvl;
    bool finish = false;
    char choice;
    std::vector<User> test_user_vec;
    do {

        std::cout << "Enter username: ";
        std::cin >> u_name;
        std::cout << "Enter ID: ";
        std::cin >> u_ID;
        std::cout << "Enter lvl: ";
        std::cin >> u_lvl;
        test_user_vec.push_back(User(u_name, u_ID, u_lvl));
        std::cout << "Do you want to add another user? (y/n)?";
        choice = getch();
        if (choice == 'y') finish = true;
    } while (!finish);

return 0;
}

我假设test_user_vec存储了我在程序运行时创建的每个对象。当我想将向量导出到文件时,问题就出现了。这个操作的目的是在程序终止后存储对象的数据,并在我再次运行程序时导入所有数据。
我试着自己解决这个问题,没有什么真正来到我的脑海。当我在寻找一些信息时,我发现了这样的东西:

#include <fstream>
#include <vector>
#include <string>

int main()
{
    std::vector<std::string> v{ "one", "two", "three" };
    std::ofstream outFile("my_file.txt");
    // the important part
    for (const auto &e : v) outFile << e << "\n";
}

我已经用向量和变量测试过了。在我尝试导出向量之前,它一直很好。另外,我发现了另一个解决方案,并尝试在另一个测试代码中用它做一些事情:
第一次
再次,它的工作,我可以读取test1.number,直到我想使用对象的向量,而不是一个单一的对象。与对象的向量我的cout打印一些随机值如11314123 e-03。我试图以某种方式合并这两个解决方案,但没有工作出来。我想有一个二进制文件,因为我听说它的速度更快,并有任何数据保护(我不能只是打开它在记事本和读取数据)我是新的c++,有一个很大的机会,我试图这样做reeeealy效率低下的方式,所以请帮助:D。

elcex8rz

elcex8rz1#

数据成员getter函数可以添加到User类中,并用于fstream输出操作。这应该提供了一般的思路:

std::string userName;

for (const auto &u : v)
{
   outFile.write(u.GetID(), sizeof(int));
   outFile.write(u.GetLvl(), sizeof(int));

   userName = u.GetName();
   outFile.write(username.length(), sizeof(size_t));
   outFile.write(userName.data(), username.length());
}

对于userName,长度被写入文件中的userName字符串数据之前,以便在读取时可以解析该文件。二进制编码/约定由设计者决定,因为有几个选项。另一个选项是将整个对象编码为以空结尾的字符串,尽管除了userName字符串本身之外,这通常会降低大小效率。
注意:test_user_vec.push_back(User(u_name, u_ID, u_lvl));正在堆栈上创建临时User对象。正如@drescherjm和@RaymondChen指出的,这是可以的,但这是一个更好的选择:test_user_vec.emplace_back(...);

相关问题