Нужно написать матрицу на основе списка и бинарного файла. Возникла такая проблема – инициализируются матрицы корректно, то есть и там и там всё забито ноликами. Но когда я вывожу сначала матрицу, сделанную через список, а потом матрицу, сделанную через бинарный файл, данные в бинарном файле заменяются на какой-то мусор. Указатель на бинарный файл не меняется, это я проверил. В функции вывода матрицы, сделанной через список, не участвуют никакие переменные, имеющие отношение к реализации второй матрицы, там не выделяется и не отчищается память, - ничего подобного. Поэтому у меня возникает вопрос, из-за чего это происходит и как такое вообще возможно?
Вот код вывода матрицы, сделанной на основе списка:
void Verbose (matrix* m1)
{
printf("Матрица в списке:\n");
matrix* m2 = NULL;
matrix* m_plus = NULL;
while (m1 -> down != NULL)
{
m2 = m1 -> down;
while (m1 -> right != NULL)
{
printf("%d ", m1 -> data);
m1 = m1 -> right;
}
printf("%d\n", m1 -> data);
m1 = m2;
}
while (m1 -> right != NULL)
{
m_plus = m1 -> right;
printf("%d ", m1 -> data);
m1 = m_plus;
}
printf("%d ", m1 -> data);
printf("\n");
}
Вот код вывода матрицы, сделанной через бинарный файл:
void Verbose_b (FILE* f, int n, int m)
{
printf("Матрица в двоичном файле:\n");
matrix_b elem;
long position;
position = ftell(f);
fseek(f, 0, SEEK_SET);
for (int i = 0; i < n * m; i++)
{
fread(&elem, sizeof(matrix_b), 1, f);
printf("%d ", elem.data);
fseek(f, sizeof(matrix_b), SEEK_CUR);
if ((i + 1) % m == 0)
printf("\n");
}
fseek(f, position, SEEK_SET);
}
Вот мои структуры:
struct matrix_b
{
int data;
};
struct matrix
{
matrix* right;
matrix* down;
int data;
};
Вот функция, из которой я вызываю всё это:
void matrix_input(FILE* f, const int n, const int m, matrix* M1, FILE* M2)
{
CreateMatrix(M1, n, m);
CreateMatrix_b(M2, n, m);
//вывожу матрицу, сделанную через бинарный файл, выводится корректно
Verbose_b(M2, n, m);
//вывожу матрицу, сделанную через список
Verbose(M1);
//опять вывожу матрицу, сделанную через бинарный файл, данные неправильные
Verbose_b(M2, n, m);
}
Вот так я открываю файлы:
else if (ch == 'B')
{
f = fopen("/Users/vladimirkorsunov/Desktop/университет/2 семестр/Программирование/TR1.1/matrix.txt", "r");
bin_f = fopen("bin_file", "wb");
printf("Введите n: ");
scanf("%d", &n);
printf("Введите m: ");
scanf("%d", &m);
matrix_input(f, n, m, M_0, bin_f);
}
тут f нужна, чтобы потом считать всё с текстового файла, а M_0 - указатель на первый элемент матрицы, сделанной через список.