当我尝试从文件加载数据时程序停止工作

The program stops working when I'm trying to load data from a file

首先,我只是想确定你知道我还在学习 C 语言。 我正在尝试创建一个程序来管理文件中的数据,但无法从中检索数据。也许我的逻辑不正确,或者我没有正确使用函数。

-方案未完全实施

-当用户插入'2'时出现错误(程序停止)。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define FICH "dados.bin"

typedef struct data
{
    char first_name[15+1];
    char last_name[15+1];
    short int age;
    int phone_number;
    int ID_number;
} DADOS;

char *Main_menu[] = {       //MAIN MENU
    "1. Insert Data",
    "2. Change Data",
    "3. Delete Data",
    "4. List Data",
    "5. Search",
    "0. Leave",
    NULL
    };

    char *Sub_menu[] = {                    //Secundary menu
    "1. Search by age",
    "2. Search by name",
    "0. Back",
    NULL
    };

FILE *fp;       //FILE POINTER

/***********************************************************/
/*Opens the file, or creates it                            */
/*                                                         */
/***********************************************************/
void inic ()
{
    fp = fopen(FICH, "r+b");
    if (fp == NULL)
    {
        fp = fopen (FICH, "w+b");
        if( fp == NULL)
        {
            fprintf(stderr, "\nCould not create the file!\n\n");
            exit(1);
        }
    }
}

/********************************************/
/*Shows the main table and the secundary one*/
/********************************************/
void Display_table(int x)
{
    int i;
    if (x == 1)
    {
        for (i=0; i<6; i++)
            printf("%s\n", Main_menu[i]);
    }
    else
        for (i=0; i<3; i++)
            printf("%s\n", Sub_menu[i]);
}

/******************************************************/
/*Display, and insertion of the data                  */
/******************************************************/

void Insert_reg ()
{
    DADOS user1;
    printf("\nFirst name: ");
       scanf("%s", &user1.first_name);
            fwrite(user1.first_name, sizeof(user1), 15+1, fp);
    printf("\nLast name: ");
        scanf("%s", &user1.last_name);
            fwrite(user1.last_name, sizeof(user1), 15+1, fp);

    fflush(stdin);

    printf("\nAge: ");
        scanf("%sd", &user1.age);
            fwrite(&user1.age, sizeof(user1), 3, fp);

    printf("\nPhone number: ");
        scanf("%d", &user1.phone_number);
            fwrite(&user1.phone_number, sizeof(user1), 1, fp);

    printf("\nID number: ");
        scanf("%d", &user1.ID_number);
            fwrite(&user1.ID_number, sizeof(user1), 1, fp);
}

/**************************************************************/
/*Loads the binary file and saves it on the structure         */
/**************************************************************/

void load_reg()
{
    DADOS user1;
    fread(&user1.first_name, sizeof(user1), 15+1, fp);
    fread(&user1.last_name, sizeof(user1), 15+1, fp);
    fread(&user1.age, sizeof(user1), 1, fp);
    fread(&user1.phone_number, sizeof(user1), 1, fp);
    fread(&user1.ID_number, sizeof(user1), 1, fp);
}

void show_reg()
{
    DADOS user1;
    printf("\nName: %s %s\n", user1.first_name, user1.last_name);
    printf("Age: %d\n", user1.age);
    printf("Phone number: %d\n", user1.phone_number);
    printf("ID number: %d\n", user1.ID_number);

}
/*************/
/*FUNÇÃO MAIN*/
/*************/

int main (void)
{
    short Menu_num;
    inic();
    Display_table(1);       //Main table
    scanf("%d", &Menu_num);

    while (Menu_num < 0 || Menu_num >5)
        printf("\nInsert a valid menu!\n");

    switch (Menu_num)
    {
        case 1: Insert_reg (); break;
        case 2: load_reg(); show_reg();
    }

}

fread 不好用。第二个参数应该是第一个参数指向的数据的大小。第三个应该是你想要读取的数据的数量,所以你的调用应该是这样的:fread(&user1.first_name,sizeof(user1.first_name),1,fp);.

所有内容都可以通过一次调用读取:fread(&user1,sizeof(user1),1,fp);

您确定文件中的数据是二进制形式吗?

show_reg() 无法显示您读取的数据,因为 user1 结构是在函数本地声明的。注意局部变量没有初始化,所以它们是随机填充的垃圾。

在main中声明user1并修改show_regload_reg,这样它们就可以被称为:load_reg(&user1)show_reg(&user1)(传输为函数的参数)。