首先,我只想确保你知道我还在学习语言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();
}
}
答案 0 :(得分:2)
fread
使用得很糟糕。第二个参数应该是第一个参数指向的数据大小。第三个应该是您想要阅读的数据,因此您的调用应该如下:fread(&user1.first_name,sizeof(user1.first_name),1,fp);
。
所有这些都可以通过一次通话阅读:fread(&user1,sizeof(user1),1,fp);
。
您确定您的数据是二进制格式吗?
show_reg()
无法显示您读取的数据,因为user1
结构是在函数本地声明的。请注意,局部变量未初始化,因此随机填充垃圾。
在主广告中声明user1
并修改show_reg
和load_reg
,以便将其称为:load_reg(&user1)
和show_reg(&user1)
(将其作为参数传输到功能)。