C ++ лучший формат файла для хранения партии карты - PullRequest
2 голосов
/ 09 марта 2012

Я реализовал алгоритм ромбовидный квадрат , и я хотел бы сохранить данные карты в формате файла. Я в основном новичок в C ++ или, по крайней мере, в чтении и записи файлов, поэтому у меня есть проблема, где хранить много данных.

Например, если я создаю карту 65 * 65, то это 16384 треугольника, и каждый получил 3 координаты, 3 нормальные координаты. Конечно, я могу разделить это, например, на 4 32 * 32 карты, но это все еще много. Конечно, на самом деле важна скорость, нет проблем записать все данные в txt, но она очень медленная, особенно когда я увеличиваю размер карты.

Мне на самом деле не нужен источник, но что-то для чтения или изучения.

1 Ответ

5 голосов
/ 09 марта 2012

Вы можете попробовать записать свои координаты в виде необработанных двоичных данных. Проверьте ostream::write и istream::read. Кроме того, вы можете использовать C-способ чтения / записи файлов (с fopen, fread, fwrite, fclose), что позволит избежать большого количества приведения. Вам нужно будет открыть свои файлы в двоичном режиме, чтобы это работало.

Если ваш файл должен быть переносим на другие платформы, вам придется учитывать такие вещи, как порядковый номер , заполнение структуры , целочисленные размеры и т. Д.

Пример:

#include <cassert>
#include <fstream>

struct Point {float x; float y; float z;};

bool operator==(const Point& p1, const Point& p2)
{
    return (p1.x == p2.x) && (p1.y == p2.y) && (p1.z == p2.z);
}

int main()
{
    Point p1 = {1, 2, 3};
    Point p2 = {4, 5, 6};

    std::ofstream out("data.dat", std::ios::binary);

    // Write Point as a binary blob of bytes

    // Lazy, but less portable way (there could be extra padding)
    out.write(reinterpret_cast<const char*>(&p1), sizeof(p1));

    // More portable way
    out.write(reinterpret_cast<const char*>(&p2.x), sizeof(p2.x));
    out.write(reinterpret_cast<const char*>(&p2.y), sizeof(p2.y));
    out.write(reinterpret_cast<const char*>(&p2.z), sizeof(p2.z));

    out.close();


    Point p3;
    Point p4;
    std::ifstream in("data.dat", std::ios::binary);

    // Read Point as a binary blob of bytes

    // Lazy, but less portable way (there could be extra padding)
    in.read(reinterpret_cast<char*>(&p3), sizeof(p3));

    // More portable way
    in.read(reinterpret_cast<char*>(&p4.x), sizeof(p4.x));
    in.read(reinterpret_cast<char*>(&p4.y), sizeof(p4.y));
    in.read(reinterpret_cast<char*>(&p4.z), sizeof(p4.z));

    assert(p1 == p3);
    assert(p2 == p4);
}

Вас также может заинтересовать библиотека Boost.Serialization . Он поддерживает двоичные архивы , что может быть значительно быстрее, чем текстовые архивы. Он также знает, как сериализовать контейнеры стандартной библиотеки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...