Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用fstream编写类型的向量_C++_Vector_Sfml_Fstream - Fatal编程技术网

C++ 使用fstream编写类型的向量

C++ 使用fstream编写类型的向量,c++,vector,sfml,fstream,C++,Vector,Sfml,Fstream,我正在尝试写我的块向量,它包含分片向量。写正确的值似乎有问题。虽然它应该有25000个平铺对象,但文件的大小是4字节 world.cpp Tile tile; for (int x = 0; x < 500; x++) { for (int y = 0; y < 500; y++) { tile.setCoord(sf::Vector2i(x, y)); tile.setBiome(0); chunk.push_bac

我正在尝试写我的块向量,它包含分片向量。写正确的值似乎有问题。虽然它应该有25000个平铺对象,但文件的大小是4字节

world.cpp

Tile tile;

for (int x = 0; x < 500; x++)
{
    for (int y = 0; y < 500; y++)
    {
        tile.setCoord(sf::Vector2i(x, y));
        tile.setBiome(0);
        chunk.push_back(tile);
    }
}
world.push_back(chunk);

ofstream file("saves/map.dat", ios::binary | ios::out);
size_t s = world.size() * (chunk.size() * sizeof(Tile));
file.write((char *) &world, sizeof(s));
file.close();
class World {
public:
    // World getters
    int getTileSize() { return tileSize; };
    int getWorldSize() { return (width * tileSize) * (height * tileSize); };

    void load(const sf::String& filename);
    void save(const sf::String& filename);
    void draw(sf::RenderWindow& window, float dt);

    World(sf::Clock clock); // new
    World(const sf::String& filename, sf::Clock clock); // load

    ~World();

private:
    const int chunkSize = 64;

    int tileSize = 32; //default 32
    int width, height;
    std::vector<Tile> chunk;
    std::vector<std::vector<Tile>> world;

    sf::Clock clock;
};
我已经检查了写入的变量是否确实填充了所有对象。所以问题是在写作过程中,但我不知道在哪里

file.write((char *) &world, sizeof(s));
这行不通,有几个原因

首先,
sizeof(s)
通常只有4或8个字节(取决于编译器和目标位)。我想你的意思是把它变成
s

即使对要写入的数据长度使用
s
而不是
sizeof(s)
sizeof(std::vector)
通常只有12或24个字节(大小、容量和指向数据的指针)。那里根本没有可写的
s
字节

您的数据不是一个平面结构,因此您不可能一次编写完所有数据。研究序列化。有很多库可以帮助解决这个问题,比如or,但您不一定要使用库。您只需要提出一种结构,可以用来编写数据并保留足够的信息,以便以后重新创建数据结构

这行不通,有几个原因

首先,
sizeof(s)
通常只有4或8个字节(取决于编译器和目标位)。我想你的意思是把它变成
s

即使对要写入的数据长度使用
s
而不是
sizeof(s)
sizeof(std::vector)
通常只有12或24个字节(大小、容量和指向数据的指针)。那里根本没有可写的
s
字节


您的数据不是一个平面结构,因此您不可能一次编写完所有数据。研究序列化。有很多库可以帮助解决这个问题,比如or,但您不一定要使用库。你只需要想出一个结构,你可以用它来写你的数据,并保留足够的信息,以便以后重新创建你的数据结构。

从地址
&world
写会把向量对象的内容以及它后面的很多内容写进内存中。您不能一次写入所有向量,因为每个向量都有单独的分配,并且您有一个向量向量。从地址
&world
写入将写入向量对象的内容以及它后面的许多内容到内存中。您不能一次完成所有操作,因为每个向量都有一个单独的分配,并且您有一个向量向量。例如,如果我选择不传递
&world
变量,而是循环通过它。然后,我可以使用
sizeof(int)
sizeof(sf::Vector2i)
(始终包含2个int),而不是将
size\t设置为非工作值?还是必须研究序列化,因为我以前从未使用过它?
file.write((char*)&coord,sizeof(sf::Vector2i))&world
变量,而是循环传递它。然后,我可以使用
sizeof(int)
sizeof(sf::Vector2i)
(始终包含2个int),而不是将
size\t设置为非工作值?还是必须研究序列化,因为我以前从未使用过它?
file.write((char*)&coord,sizeof(sf::Vector2i))
file.write((char *) &world, sizeof(s));