Запись нескольких указателей массива в файл с ofstream? - PullRequest
1 голос
/ 04 декабря 2010

У меня возникла довольно странная проблема с записью нескольких массивов данных в файл. По сути, я хочу сохранить все размеры массива в верхней части файла, а затем следующие данные массива. Таким образом, я могу просто прочитать размеры и использовать их для построения массивов для хранения данных при импорте, и я точно буду знать, где начинается и заканчивается каждый массив.

Вот проблема: я записываю данные, но они отличаются при импорте. Пожалуйста, посмотрите на мой маленький тестовый код. Внизу есть комментарии о значениях.

Большое спасибо, коллеги программисты! :)

#include <iostream>
#include <fstream>

int main()
{
    int     jcount = 100, // First item in file
            kcount = 200, 
            in_jcount,    // Third item in file. jcount is used to find where this ends.
            in_kcount;

    float   *j = new float[jcount],
            *k = new float[kcount],
            *in_j,
            *in_k;

    for(int i = 0; i < jcount; ++i) // Write bologna data...
        j[i] = (float)i;
    for(int i = 0; i < kcount; ++i)
        k[i] = (float)i;

    std::ofstream outfile("test.dat");

    outfile.write((char*)&jcount, sizeof(int)); // Good
    outfile.tellp();

    outfile.write((char*)&kcount, sizeof(int)); // Good
    outfile.tellp();

    outfile.write((char*)j, sizeof(float) * jcount); // I don't know if this works!
    outfile.tellp();

    outfile.write((char*)k, sizeof(float) * kcount); // I don't know if this works!
    outfile.tellp();

    outfile.close();


    std::ifstream in("test.dat");

    in.read((char*)&in_jcount, sizeof(int));    // == jcount == 100, good.
    in.read((char*)&in_kcount, sizeof(int));    // == kcount == 200, good.

    in_j = new float[in_jcount],
    in_k = new float[in_kcount];    // Allocate arrays the exact size of what it should be

    in.read((char*)in_j, sizeof(float) * in_jcount);    // This is where it goes bad!
    in.read((char*)in_k, sizeof(float) * in_kcount);

    float   jtest_min = j[0],   // 0.0
            jtest_max = j[jcount - 1],  // this is 99.

            ktest_min = k[0],   // 0.0
            ktest_max = k[kcount - 1],  // this is 200. Why? It should be 199!

            in_jtest_min = in_j[0], // 0.0
            in_jtest_max = in_j[in_jcount - 1], // 99

            in_ktest_min = in_k[0], // 0.0
            in_ktest_max = in_k[in_kcount - 1]; // MIN_FLOAT, should be 199. What is going on here?

    in.close();

    delete k;
    delete j;
    delete in_j;
    delete in_k;
}

Ответы [ 2 ]

1 голос
/ 16 марта 2012

У меня та же ошибка, я исправляю ее с помощью двоичного файла:

ofstream outfile;
outfile.open ("test.dat", ios::out | ios::binary);

и

ifstream in;
in.open ("test.dat", ios::in | ios::binary);
1 голос
/ 04 декабря 2010

Нет ничего плохого в этом коде (на самом деле, я не вижу ошибок, с которыми вы сталкиваетесь при попытке его запустить), за исключением того факта, что вы не проверяете ошибки при открытии файлов ввода-вывода. 1001 *

Например, если у вас нет разрешения на запись в «test.dat», открытие молча завершится ошибкой, и вы вернётесь обратно к тому, что раньше было в файле.

...