2

私が持っているプログラムはファイルを読み取り、それに応じて表示しますが、内容を再度表示しようとすると、それらはなくなります。

構造:

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;
} 

ファイルを開くために使用されるメニュー関数の If ステートメント:

if (user_entry1 == 1) {
  printf("Please enter a file name");
  scanf("%s", user_entry3); 

  read = fopen(user_entry3, "r");
}

ユーザーがアドレス帳の連絡先を見ることを選択できるようにする if ステートメント。

if (user_entry == 4 ) {
  print_contact(friends, counter, i, user_entry3);
  if (user_entry1 == 1) {
    file2(friends, counter, i, buffer, read);
  }
} 

読み取り機能:

char file2(fr *friends, int *counter, int i, char buffer[], FILE *read) {
  while (fscanf(read, "%s", buffer) != EOF) {
    friends[i].First_Name = malloc(BUFFSIZE * strlen(buffer));
    strcpy(friends[i].First_Name, buffer);
    return printf("\n""%s ", friends[i].First_Name);       
  }  
  fclose(read);
}

さらにコードを提供する必要がある場合。ファイルから連絡先リストにコンテンツを読み取らせて、表示、検索、または削除できるようにしようとしています。

PS他のコードのいくつかは完璧ではないかもしれないことを理解していますが、今はこれを理解することだけが心配です:)。

4

3 に答える 3

2

このfile2関数は、ファイルの各行を に読み込みますがfriends[i]、インクリメントはしませんi。したがって、新しいレコードごとに前のレコードが上書きされます... ただし、ループの最初の反復中に関数が返されます。この場合ifよりも使用することをお勧めします。while

その他の提案:

を使用する代わりに、 でブロックを}else;閉じることができます。の後に を付ける必要はありません。if}ifelse

イディオムの代わりに

if (foo == 1) {
  // do stuff
} else if (foo == 2) {
  // do other stuff
} else {
  // do default stuff
}

あなたが使用することができます

switch (foo)  {
case 1:
  // do stuff
  break;
case 2:
  // do other stuff
  break;
default:
  // do default stuff
}

それ以外の

printf("\n""%s ",friends[i].First_Name);

最後に改行を付けて、単一の文字列を使用するのがより一般的です。

printf("%s\n", friends[i].First_Name);
于 2012-11-17T20:30:14.703 に答える
1

ファイルの先頭に再度使用して、ファイル ポインタをリセットする必要がfseekあります。read 関数は次のように開始する必要があります。

fseek(read, 0, SEEK_SET); // set file pointer to the beginning of the file
于 2012-11-17T20:26:23.027 に答える
0

ファイルを開くことができるかどうかをテストすることを忘れないでください。

if ( user_entry1==1 ){

    printf( "Please enter a file name" );
    scanf( "%s", user_entry3 ); 

    if ( ( read = fopen( user_entry3, "r" ) ) != NULL ){
        printf( "The file couldn't be opened" );
    }
    else{
       .
       .
       .
    }
}
于 2012-11-17T20:40:47.193 に答える