Бинарные файлы, стек вокруг переменной «paka1» был поврежден - C (СИ)

Узнай цену своей работы

Формулировка задачи:

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#pragma pack (show)
typedef struct DATA_NO_OP{
    char name[31]; // имя, фамилия
    short int age; // возраст, полных лет
    char gender; // пол, мужской, женский
    short int mean; // средний балл успеваемости
} st1;
 
#pragma pack (push)
#pragma pack (1)
#pragma pack (show)
typedef struct DATA_OP{
    char name[31]; // имя, фамилия
    short int age; // возраст, полных лет
    char gender; // пол, мужской, женский
    short int mean; // средний балл успеваемости
} st2;
#pragma pack (pop)
#pragma pack (show)
void createST1(st1* pak){
    pak->age = 0;
    pak->gender = 'M';
    pak->mean = 0;
    memset(&pak->name,'\0',31);
    strcpy(pak->name,"NAME_SURNAME");
}
 
void createST2(st2* pak){
    pak->age = 0;
    pak->gender = 'W';
    pak->mean = 0;
    memset(&pak->name,'\0',31);
    strcpy(pak->name,"NAME_SURNAME");
}
 
void zapisVfailst1 (st1* pak,FILE* f){
    rewind(f);
    fwrite(&pak,sizeof(struct DATA_NO_OP),1,f);
    rewind(f);
}
 
void zapisVfailst2 (st2* pak,FILE* f){
    rewind(f);
    fwrite(&pak,sizeof(struct DATA_OP),1,f);
    rewind(f);
}
void vivodIzfailIconst1(FILE* f){
    st1 *paka1 = (st1*) malloc(sizeof(st1));
    rewind(f);
    fread(&paka1,sizeof(st1),1,f);
    printf("\n\tВывод из файла st1:");
    printf("\n\t %s",paka1->name);
    printf("\n\t %d",paka1->age);
    printf("\n\t %c",paka1->gender);
    printf("\n\t %d",paka1->mean);
    //free(paka1);
    /*rewind(f);
    printf("\n\t_______");*/
}
void vivodIzfailIconst2(FILE* f){
    st2 *paka1 = (st2*) malloc(sizeof(st2));
    fread(&paka1,sizeof(st2),1,f);
    printf("\n\tВывод из файла st2:");
    printf("\n\t %s",paka1->name);
    printf("\n\t %d",paka1->age);
    printf("\n\t %c",paka1->gender);
    printf("\n\t %d",paka1->mean);
    //free(paka1);
    //rewind(f);
}
int main (){
    FILE *F1,*F2;
    st1 *massNoOp =(st1*) malloc(sizeof(st1));  
    st2 *massOp =(st2*) malloc(sizeof(st2));
    createST1(massNoOp);
    printf("\n\t %s , %d ,%c, %d",massNoOp->name,massNoOp->age,massNoOp->gender,massNoOp->mean);
    createST2(massOp);
    printf("\n\t %s , %d ,%c, %d",massOp->name,massOp->age,massOp->gender,massOp->mean);
    F1 = fopen("18_6NOOP.bin","wb+");
    F2 = fopen("18_6OP.bin","wb+");
    zapisVfailst1(massNoOp,F1);
    zapisVfailst2(massOp,F2);
    vivodIzfailIconst1(F1);
    vivodIzfailIconst2(F2);
    fclose(F1);
    fclose(F2);
    free(massNoOp);
    free(massOp);
    printf ("\t\nsizeof (struct st1) = %d\n", sizeof (struct DATA_NO_OP));
    printf ("\t\nsizeof (struct st2) = %d\n", sizeof (struct DATA_OP));
    printf("\n\t");
    system("pause");
    return 0;
}
Ошибка происходит при завершении функции vivodIzfailIconst1, данные считывает правильно.

Решение задачи: «Бинарные файлы, стек вокруг переменной «paka1» был поврежден»

textual
Листинг программы
st1 *paka1 = (st1*) malloc(sizeof(st1));
fread(&paka1,sizeof(st1),1,f);

Объяснение кода листинга программы

  1. paka1 - инициализируется как указатель на структуру st1
  2. st1 - структура, на которую указывает paka1
  3. f - файловый дескриптор, через который происходит чтение из файла
  4. sizeof(st1) - размер структуры st1 в байтах
  5. 1 - количество элементов, которые необходимо прочитать из файла

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4 из 5
Похожие ответы