1

私のプログラムは、ユーザーがファイルをインポートするかどうかを尋ねることから始まります。ユーザーが「はい」を選択した場合、使用したいファイルの名前を指定するように求められます。ファイルからの入力を取得して、それに応じて表示することができないようです。基本的に、ファイルから名前と番号を取得して、アプリケーションの show phonebook 部分に入力しようとしています。現時点では、ファイルを取り込んでいるように見えますが、何も保存していません。これが私の問題に対処する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

にはどのような値があり、なぜとcounterの両方が引数として渡されるのですか? ゼロの場合、ファイルから何も読み取られません。countericounter

ファイルの最後まで読んだほうがいいのではないですか?counterおそらく、設定する(または値を返す)でしょう。

iがパラメーターになる理由はまったくありません。それはローカル変数でなければなりません。

と の定義を含めて、例をコンパイルして実行できるようにすると、より詳細なヘルプが得られる可能性がありますfr...main

于 2012-11-17T01:56:13.120 に答える
0

アンドリュー・クックは正しいです。あなたはcounter0 として渡しているので、指示どおり file2 は何も読み取りません。これを に変更すると、メモリが割り当てられていないポインターでcounter=1構造体がいっぱいになるため、プログラムが失敗することに注意してください。fr1、2 日前の質問でメモリの割り当て方法について尋ねていたので、最初にそれを確認する必要があるかもしれません。

コードには他にも多くの問題がありますが、少なくとも構造を修正して関数への受け渡しを停止できcounterますi。しかし、あなたの友達の配列が固定サイズであるという問題があります - 最後にオーバーランしないようにする必要があります...

于 2012-11-17T03:20:36.843 に答える