1

我的程序首先询问用户是否要导入文件,如果用户选择是,则要求他们提供他们要使用的文件的名称。我似乎无法从文件中获取输入以相应地工作和显示。基本上,我试图从文件中获取姓名和号码,并将它们输入到我的应用程序的显示电话簿部分。截至目前,它似乎只是接收文件,但什么也不存储。这是处理我的问题的 3 个主要功能。

#include <stdio.h> 
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#define BUFFSIZE 500
//Structure for contacts. These are now pointers.
typedef struct friends_contact{

 char *First_Name;
 char *Last_Name;
 char *home;
 char *cell;
}fr;
//Function declarations 
void menu(fr*friends ,int* counter,int i,char buffer[]);
void setFirst(fr*,int *,int i,char buffer[]);
char getFirst(fr*,int i);
void setLast(fr*friends, int* counter, int i,char buffer[]);
char getLast(fr*friends , int i);
void setHome(fr*friends, int* counter, int i,char buffer[]);
char getHome(fr*friends, int i);
void setCell(fr*friends, int* counter, int i,char buffer[]);
char getCell(fr*friends, int i);
void add_contact(fr*friends,int* counter,int i,char buffer[]);
void print_contact(fr*friends ,int* counter, int i,char user_entry3[50]);
char delete_contact(fr*friends ,int* counter, int i);
int show_contact(fr*friends ,int* counter, int i);
void file(fr*friends ,int* counter, int i,char user_entry3[50]);
char file2 (fr*friends ,int* counter, int i,char user_entry3[50]);

int main() {


 fr friends[5];
 char buffer[BUFFSIZE];
 int counter=0;
 int i=0;

 menu(friends, &counter,i,buffer);

getch();
return 0;
}

 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)
         {
         printf("please enter the name of the file");
         scanf("%s",user_entry3);  
         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);
        } 
 }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;
  read=fopen(user_entry3,"r");
  for( i = 0; i < *counter; i++)
        {
        fscanf(read,"%s",friends[i].First_Name);
        fscanf(read,"%s ",friends[i].Last_Name);
        fscanf(read,"%s",friends[i].home);
        fscanf(read,"%s",friends[i].cell);
        }

  fclose(read);

}

最后,这是我尝试将文件中的日期添加到电话簿的地方。

void print_contact(fr*friends ,int* counter, int i,char user_entry3[50]) 
 {

  for( i = 0; i < *counter; i++)
    if (strlen(friends[i].First_Name) && strlen(friends[i].Last_Name)&&strlen(friends[i].home)&& strlen(friends[i].cell ))
      {
        file2(friends,counter,i,user_entry3);
        getFirst(friends, i);
        getLast(friends, i);
        getHome(friends, i);
        getCell(friends, i);

       }
 }

我的逻辑可能有问题,但我似乎无法弄清楚这一点。如果需要,我可以发布其余的代码,但我希望我犯了一个简单的错误,有人可以通过查看我提供的内容来发现它。

4

2 回答 2

0

Andrew Cooke 是对的,你传递counter的是 0,所以 file2 按照指示什么也不读。请注意,当它更改为 时counter=1,您的程序将失败,因为结构fr中充满了未分配内存的指针。您在一两天前在一个问题中询问如何分配内存,所以也许您应该先看一下。

您的代码还有许多其他问题,但至少您可以修复结构并停止传递counteri进入函数。但是你的朋友数组有一个固定大小的问题 - 你需要避免超出结尾......

于 2012-11-17T03:20:36.843 回答
0

有什么值counter,为什么两者都counter作为i参数传递?如果counter为零,则不会从文件中读取任何内容。

读到文件末尾不是更好吗?也许你会设置counter(或为它返回一个值)。

绝对没有理由i成为参数;它应该是一个局部变量。

并且如果您包含fr和a 的定义,main以便可以编译和运行示例,您可能会获得更详细的帮助...

于 2012-11-17T01:56:13.120 回答