0 / 0 / 0
Регистрация: 20.12.2019
Сообщений: 10
1

Двумерный массив в бинарный файл

05.02.2020, 17:43. Показов 6774. Ответов 7
Метки нет (Все метки)

Как можно осуществить запись двумерного массива в бинарный файл без данного цикла? Помогите пожалуйста
C
1
2
3
4
5
for (i = 0; i < n; i++)
{
  for (j = 0; j < m; j++)
     {...}
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.02.2020, 17:43
Ответы с готовыми решениями:

Массив байтов записать в нетипизированый бинарный файл
Скажите как работать с бинарными файлами в си, а именно есть массив байтов: char; //в нем...

Записать в бинарный файл массив объектов Student (бинарный файловый ввод/вывод)
Здравствуйте. Стоит задача записать в бинарный файл массив объектов student: class student {...

Сконвертировать текстовый файл в бинарный, переписать только положительные числа в другой бинарный файл
Бинарные файлы!! Помогите пожалуйста. Дано бинарный файл ( данные сначала в текстовом, конвертирую...

Не записывается массив в бинарный файл
Проблема не записывает элементы в бинарный файл. Может что-то не так прописал? FILE *an1; ...

7
Модератор
Эксперт функциональных языков программированияЭксперт Python
34211 / 19105 / 4018
Регистрация: 12.02.2012
Сообщений: 32,002
Записей в блоге: 13
05.02.2020, 17:49 2
Если есть указатель на начало, а массив занимает смежный участок памяти, то вот так:

C
1
  fwrite(arr,sizeof(int), n*m, f);
arr - указатель на первый элемент; f - указатель на правильно открытый файл
2
0 / 0 / 0
Регистрация: 20.12.2019
Сообщений: 10
06.02.2020, 17:09  [ТС] 3
Проблема в том, что он записывает так же и мусор, и при считывании неправильно заполняет массив, что приводит к неправильному результату. Что делать со считыванием?
0
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
06.02.2020, 18:25 4
Цитата Сообщение от wolfity50 Посмотреть сообщение
Проблема в том, что он записывает так же и мусор
Он - это кто? Если ваш код, то покажите его.
0
0 / 0 / 0
Регистрация: 20.12.2019
Сообщений: 10
07.02.2020, 09:04  [ТС] 5
Цитата Сообщение от likehood Посмотреть сообщение
Он - это кто? Если ваш код, то покажите его.
Я имела в виду функцию считывания. Хотя да, вполне вероятно что у меня она неправильно написана

Чтение бинарного файла:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void readBin(char filename[], double mass[100][100], unsigned k, unsigned l)
{
    FILE* f;
    if (fopen_s(&f, filename, "rb") != 0)
    {
        printf("Ошибка ввода - вывода\n");
        system("pause");
        exit(0);
    }
    else
    {
        int i, j;
        fread(&k, sizeof(int), 1, f);
        fread(&l, sizeof(int), 2, f);
        fread(&mass[i][j], sizeof(double), k * l, f);
    }
    min(mass, k, l);
    fclose(f);
}
Запись бинарного файла:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void writeToBin(char filename[], double mass[100][100], unsigned k, unsigned l)
{
    int i = 0, j = 0;
    FILE* f;
    if ((fopen_s(&f, filename, "wb")) != 0)
    {
        printf_s("Ошибка при открытии файла\n");
        system("pause");
        exit(2);
    }
    rewind(f);
    fwrite(&k, sizeof(unsigned), 1, f);
    fwrite(&l, sizeof(unsigned), 2, f);
    fwrite(mass, sizeof(double), k*l, f);
    fclose(f);
}
0
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
07.02.2020, 10:32 6
Лучший ответ Сообщение было отмечено wolfity50 как решение

Решение

---

Добавлено через 6 минут
Цитата Сообщение от wolfity50 Посмотреть сообщение
fwrite(&l, sizeof(unsigned), 2, f);
Почему третий параметр равен 2? Ведь это же число записываемых в файл переменных, а вы записываете только одну переменную - l. Значит, он должен быть равен 1. То, что перед этим была записана переменная k, не имеет никакого значения. Важен только текущий вызов fwrite.

А вообще, причина ошибки понятна. Сохранять двумерные массив таким способом - с помощью одного вызова fwrite - можно лишь тогда, когда сохраняется весь массив целиком (все 100x100 элементов). Если же, как в вашем случае, реально используется только часть массива (размером l на k), то тут без цикла никак не обойтись. Не обязательно использовать двойной цикл, хватит и одного:
C
1
2
3
4
for (int i=0; i<k; k++)
{
    fwrite(&mass[i][0], sizeof(mass[0][0]), l, f);
}
Чтение из файла - аналогично.
2
0 / 0 / 0
Регистрация: 20.12.2019
Сообщений: 10
07.02.2020, 15:30  [ТС] 7
Цитата Сообщение от likehood Посмотреть сообщение
for (int i=0; i<k; k++)
Здесь ведь не k++, иначе программа просто зациклится. А так - спасибо огромное, теперь все правильно показывает и считывает тоже.
0
1272 / 1029 / 470
Регистрация: 25.12.2016
Сообщений: 3,333
07.02.2020, 17:14 8
Цитата Сообщение от wolfity50 Посмотреть сообщение
Здесь ведь не k++, иначе программа просто зациклится.
Да, это досадная ошибка. Должно быть конечно же i++.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.02.2020, 17:14
Помогаю со студенческими работами здесь

Считать файл в бинарный массив
Доброго времени суток, такой вопрос, вообще, в vb.net реально считать некий файл, в массив ...

Записать массив в бинарный файл
Привет, есть такой код, отсортировал массив, и вроде по идее все норм должно быть - нифига, почему...

Записать массив структур в бинарный файл
Собственно программа, которая записывает\считывает масс структур в бинарный файл... проблема...

Как конвертировать бинарный файл в массив?
Пишу параллельную на программу на CUDA C, в процессе появилась такая задачка: есть бинарный файл,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru