Форум программистов, компьютерный форум CyberForum.ru

Сохранение матриц больших размеров в типизированный файл - C++

Восстановить пароль Регистрация
 
Yuutsu
Сообщений: n/a
16.08.2011, 23:45     Сохранение матриц больших размеров в типизированный файл #1
Проблема: есть большой двумерный массив (double). Пытаюсь сохранить его в типизированный файл (а затем считать в другой массив). В файл сохраняется только некоторая часть (до 58 элемента, в частном случае), на оставшиеся места записываются максимальное и минимальное значения double (+-6.2 * 10^66). Причем иногда прерывается посередине строки. Как будто память под строку выделилась не в одном месте, а в разных. Однако все последующие строки изначально "повреждены". Что я делаю неправильно или как можно этого избежать?
Делаю в Visual Studio 2005 (или в 2010, разницы не заметил), win forms.
Значимый код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
    int X = 30, Y = 13; // Размер матрицы
 
    // Создаем и заполняем матрицу (формула наугад)
    int size = sizeof(double);               
    double **arr1;
    arr1 = new double* [Y];
    for (int i=0; i<Y; i++)
    {
        arr1[i] = new double [X];
        for (int j=0; j<X; j++)
            arr1[i][j] = (i-3)*17 / 10.0 / (j+5);
    }        
    // Сохраняем матрицу
    FILE *f1;
    f1 = fopen("test.dat", "w");
    for (int i=0; i<Y; i++)
        fwrite(arr1[i], size, X, f1);
    fclose(f1);
 
    // Открываем файл для чтения
    FILE *f2;
    f2 = fopen("test.dat", "r");
    // Сохраняем данные из файла в массив mas
    double **mas;
    mas = new double* [Y];
    for (int i=0; i<Y; i++)
    {
        mas[i] = new double [X];                     
        fread(mas[i], size, X, f2);
    }
    fclose(f2);
 
    // Вывод обоих матриц
    richTextBox1->Clear();
    for (int i=0; i<Y; i++)
    {
        for (int j=0; j<X; j++)
            richTextBox1->Text += Convert::ToString(Math::Round(arr1[i][j]*100)/100.0) + "\t";
        richTextBox1->Text += "\n";
    }
    richTextBox1->Text += "\n#######################\n\n";
    for (int i=0; i<Y; i++)
    {
        for (int j=0; j<X; j++)
            richTextBox1->Text += Convert::ToString(Math::Round(mas[i][j]*100)/100.0) + "\t";
        richTextBox1->Text += "\n";
    }
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
accept
4838 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
17.08.2011, 06:20     Сохранение матриц больших размеров в типизированный файл #2
C++
1
f1 = fopen("test.dat", "w");
C++
1
f1 = fopen("test.dat", "wb");
-=ЮрА=-
Заблокирован
Автор FAQ
17.08.2011, 11:32     Сохранение матриц больших размеров в типизированный файл #3
Цитата Сообщение от Yuutsu Посмотреть сообщение
f2 = fopen("test.dat", "r");
- читать тогда тоже в двоичном "rb"

Добавлено через 1 минуту
Цитата Сообщение от Yuutsu Посмотреть сообщение
fwrite(arr1[i], size, X, f1);
думаю что размер блока в байтах X*size
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
17.08.2011, 14:40     Сохранение матриц больших размеров в типизированный файл #4
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
думаю что размер блока в байтах X*size
Не думаю.

size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream )

ptr - буфер, из которого читаем
size - размер одного элемента в байтах
count - количество элементов
stream - поток, в который пишем

fwrite [reference]

Таким образом, размер элемента указывается в байтах, а в count указывается количество элементов каждый размером size байт.
Yuutsu
Сообщений: n/a
17.08.2011, 18:42     Сохранение матриц больших размеров в типизированный файл #5
Спасибо, добавление "b" помогло. Почему-то думал, что компилятор сам это поймет и даже не смотрел в эту сторону. При чтении тоже добавил на всякий случай.
И да, там просто количество элементов надо писать, не умножая на размер.
Yandex
Объявления
17.08.2011, 18:42     Сохранение матриц больших размеров в типизированный файл
Ответ Создать тему
Опции темы

Текущее время: 22:37. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru