gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 08:28:57 25 4
gpt4 key购买 nike

首先,我只是想确定你知道我还在学习 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)(将其作为参数传输给函数)。

关于c - 当我尝试从文件加载数据时程序停止工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29241434/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com