Как двоичный файл в моей программе может изменяться?

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

Вот код вывода матрицы, сделанной на основе списка:
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 - указатель на первый элемент матрицы, сделанной через список.
  • Вопрос задан
  • 88 просмотров
Решения вопроса 1
15432
@15432
Системный программист ^_^
Вы открываете бинарный файл с параметром "wb", что означает "стереть и открыть для записи". Возможно, стоит его открывать с параметром "rb" (открыть для чтения)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы