2010-12-04 2 views
1

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

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

Спасибо, товарищи программисты! :)

#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; 
} 
+0

Это не отвечает на ваш вопрос, но я просто хотел бы отметить, что если вы инициализировать объект с помощью `new []`, вы должны уничтожить его с помощью `delete []`. Кроме того, просто быстрый вопрос: вы посмотрели `test.dat`, чтобы узнать, правильно ли он выписал все массивы? – 2010-12-04 05:48:58

ответ

1

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

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

+0

Вы имеете в виду, что он отлично работает на вашем компьютере? Вы получаете тот же массив данных, что и он? – 2010-12-04 03:47:39

1

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

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

и

ifstream in; 
in.open ("test.dat", ios::in | ios::binary);