У меня возникла серьезная странная проблема с записью нескольких массивов данных в файл. В принципе, я хочу сохранить все размеры массива в верхней части файла, а затем данные массива, следующие за ним. Таким образом, я могу просто прочитать размеры и использовать их для построения массивов для хранения данных при импорте, и я точно знаю, где каждый массив начинается и заканчивается.Написание нескольких указателей массива в файл с потоком?
В этом проблема: я пишу данные, но она отличается от импорта. Пожалуйста, взгляните на мой маленький тестовый код. Внизу есть комментарии о значениях.
Спасибо, товарищи программисты! :)
#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;
}
Это не отвечает на ваш вопрос, но я просто хотел бы отметить, что если вы инициализировать объект с помощью `new []`, вы должны уничтожить его с помощью `delete []`. Кроме того, просто быстрый вопрос: вы посмотрели `test.dat`, чтобы узнать, правильно ли он выписал все массивы? – 2010-12-04 05:48:58