【问题标题】:How do i read data from binary file and push back to a vector?如何从二进制文件中读取数据并推回向量?
【发布时间】:2021-04-18 06:25:31
【问题描述】:

由于我不擅长英语,我提前为我缺乏解释表示歉意。 我创建了一个存储这些对象的二进制文件。我想阅读它并推回矢量,但我不知道该怎么做。

class Player
{
    string name;
    int score;
    int id;
    size_t num; 
    char* p;
};

这些函数在写入二进制文件时使用。

void write(ostream& os) 
{
        os.write((char*)this, sizeof(Player));
        os.write((char*)p, num);
}

这是类的运算符重载函数。 下面是main函数,就是这样写的,用来读取文件的,但是效果不好。

istream& operator>> (istream& is, Player& p)
{
    getline(is, p.name, '\0');
    is.read((char*)&p.score, sizeof(int));
    is.read((char*)&p.id, sizeof(int));
    is.read((char*)&p.num, sizeof(size_t));

    return is;
}

int main()
{
    ifstream in{ "Myfile", ios::binary };
    vector<Player> players(istream_iterator<Player>(in), {});
}

我应该怎么做才能读取文件? 我想读取每个对象的数据,但我认为正在读取的数据比我想要的要多。

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

using namespace std;

class Player
{
    string name;
    int score;
    int id;
    size_t num;
    char* p;

public:
    Player(): name{NULL}, score{0}, id{0}, num{0}, p{nullptr}
    {}

    Player(string name, int score, int id, size_t num) :
        name{ name }, score{ score }, id{ id }, num{ num }, p{ new char[num] }
    {}
    
    ~Player() 
    { 
        delete[] p; 
    }

    /*Player(const Player& other) : name{ other.name }, score{ other.score }, id{ other.id }, num{ other.num }, p{ new char[num] }
    {
        memcpy(p, other.p, num);
    }*/

    void write(ostream& os) {
        os.write((char*)this, sizeof(Player));
        os.write((char*)p, num);
    }

    friend istream& operator>> (istream& is, Player& p);
};

istream& operator>> (istream& is, Player& p)
{
    getline(is, p.name, '\0');
    is.read((char*)&p.score, sizeof(int));
    is.read((char*)&p.id, sizeof(int));
    is.read((char*)&p.num, sizeof(size_t));

    return is;
}

int main()
{
    ifstream in{ "Myfile", ios::binary };
    vector<Player> players(istream_iterator<Player>(in), {});

    in.close();
}

【问题讨论】:

  • 工作不差表示工作正常。可能你的意思是别的。作为一般建议,您可能只想使用std::copy
  • 顺便说一下,您的代码不可编译也不可运行。请提供minimal reproducible example
  • 你的最后一个例子甚至没有编译。请调整一下。

标签: c++ fstream stdvector ifstream


【解决方案1】:

鉴于您提供的信息很少,我相信这可能是您正在寻找的:

    std::copy(
            std::istream_iterator<int>(in),
            std::istream_iterator<int>(),
            players.begin()
            );

您可以#include &lt;iterator&gt; 获得std::istream_iterators 可用。

【讨论】:

  • 我认为是因为你没有要读取的文件,我也没有详细的代码,因为写入文件是由另一个程序提供的。所以我只贴了阅读部分的代码。如果你这样读,p.score、p.id 和 p.num 会有奇怪的值。还有其他的阅读方式吗?
  • @109, “这是因为”? “它”是什么?
  • 这意味着代码不会被编译。本来是想解决问题的,所以看了下其他的东西,stackoverflow.com/questions/14545120/…我以为我的情况和这里的问题差不多。但是,如果您阅读此内容并编写类似的代码,则不会读取该文件。
  • @109 我没看懂你写的什么,抱歉。
  • 我想是因为我缺乏解释的能力。对不起。之前,您说过代码没有编译。我认为那是因为我没有创建文件,而是使用了收到的文件。 stackoverflow.com/questions/14545120/…我认为提问者在此链接上提出的问题与我的相似。我想从二进制文件中获取对象的信息并将其保存到向量中。但是,当我运行我的代码时,'name' 会存储值,而不是其他变量。
猜你喜欢
  • 2013-01-10
  • 1970-01-01
  • 1970-01-01
  • 2015-06-27
  • 2015-04-23
  • 2018-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多