我有一个电话本应用程序,我试图提供能够读取和写入文件的功能。我很容易理解如何编写文件,但阅读它们确实让我陷入困境。我认为我的主要问题是无法使文件循环(一旦遇到循环就会崩溃)。以下是我受影响的功能。
以下是结构,主要和菜单功能。
typedef struct friends_contact{
char *First_Name;
char *Last_Name;
char *home;
char *cell;
}fr;
int main() {
fr friends[5];
char buffer[BUFFSIZE];
int counter=0;
int i=0;
menu(friends, &counter,i,buffer);
getch();
return 0;
}
//Menu function
void menu(fr*friends,int* counter, int i,char buffer[]) {
int user_entry=0;
int user_entry2=0;
char user_entry3[50]={'\0'};
printf("Welcome! Would you like to import a file? (1)Yes or (2) No");
scanf("%d",&user_entry);
if(user_entry==1)
{
file2(friends,counter,i,user_entry3);
}else;
do{
int result;
printf("\nPhone Book Application\n");
printf("1) Add friend\n2) Delete friend\n3) Show a friend\n4) Show phonebook\n5)Exit\n");
scanf("%d", &user_entry);
if(user_entry==1)
{
add_contact(friends,counter,i,buffer);
}
if(user_entry==2)
{
delete_contact(friends ,counter,i);
}
if(user_entry==3)
{
result=show_contact(friends ,counter,i);
if(result==0){
printf("\nName not Found\n");
}else{
result;
}
}
if(user_entry==4)
{
print_contact(friends, counter,i,user_entry3);
file2(friends ,counter,i,user_entry3);
}
}while(user_entry!=5);
if(user_entry==5)
{
printf("Would you like to save entries to a file? (1)yes or (2) no");
scanf("%d",&user_entry2);
if(user_entry2 == 1)
{
printf("Please name your file");
scanf("%s",user_entry3);
file(friends, counter,i,user_entry3);
printf("Goodbye!");
}else if(user_entry2 == 2){
printf("Goodbye!");
}
}
}
这是处理文件读取的函数。
void file2(fr*friends ,int* counter, int i, char user_entry3[50])
{
FILE *read;
printf("Please enter a file name");
scanf("%s",user_entry3);
read=fopen(user_entry3,"r");
//This is where the crash is taking place!!**
while(!feof(read)){
fscanf(read,"%s %s %s %s",friends[i].First_Name,friends[i].Last_Name,friends[i].home,friends[i].cell);
printf("\n""%s ""%s ""\n""<Home>""%s""\n""<Cell>""%s""\n",friends[i].First_Name,friends[i].Last_Name,friends[i].home,friends[i].cell);
}
现在我明白这个程序可能还有其他与我问的问题无关的问题,但我是C的新手,所以这是一项正在进行中的工作。我需要弄清楚如何阻止它崩溃,以及如何将其添加到我的其他联系人(我想我可能有一个想法),它让我疯了!提前致谢。
答案 0 :(得分:1)
您正在将数据读入未定义的内存区域(您永远不会为结构中的4个字符串指针赋值)。我没有看到您为friends[i].First_Name
,.Last_Name
,.home
和.cell
分配内存。
您可能希望像这样更改结构:
typedef struct friends_contact{
char First_Name[50+1]; // +1 for the '\0' terminating character
char Last_Name[50+1];
char home[50+1];
char cell[50+1];
}fr;
当然,如果文件包含超过50个字符的部分(包括'\ 0'终止),则代码将再次崩溃,因为fscanf
将不会检查长度,除非您指定最大长度每个字符串都是这样的:
fscanf(read,"%50s %50s %50s %50s",friends[i].First_Name,friends[i].Last_Name,friends[i].home,friends[i].cell);
如果要在结构中使用指针,则应在读取之前使用malloc()
为每个结构成员分配内存,并在不再需要时使用free()
释放已分配的内存