当我尝试从文件加载数据时程序停止工作
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_reg
和load_reg
,这样它们就可以被称为:load_reg(&user1)
和show_reg(&user1)
(传输为函数的参数)。
首先,我只是想确定你知道我还在学习 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_reg
和load_reg
,这样它们就可以被称为:load_reg(&user1)
和show_reg(&user1)
(传输为函数的参数)。