0

構造体の配列があり、ファイルに保存されます。現在、ファイルには次の 2 行があります。

a a 1
b b 2

ファイルを読み込んで、データを構造体に保存しようとしています:

typedef struct book{ 
    char number[11];//10 numbers 
    char first[21]; //20 char first/last name
    char last[21]; 
} info;

info info1[500]
into num = 0;

 pRead = fopen("phone_book.dat", "r");

 if ( pRead == NULL ){

        printf("\nFile cannot be opened\n");
}
 else{

      while ( !feof(pRead) ) {

            fscanf(pRead, "%s%s%s", info1[num].first, info1[num].last, info1[num].number);

            printf{"%s%s%s",info1[num].first, info1[num].last, info1[num].number); //this prints statement works fine

            num++;
     }

}
//if I add a print statement after all that I get windows directory and junk code.

これにより、アイテムが構造体に保存されていないと思います。どんな助けでも素晴らしいでしょう。ありがとう!

編集:それで問題なく保存されますが、それを関数に渡すと、ガベージコードが表示されます。

私がそれを呼び出すとき:

sho(num, book);

私のショー機能:

void sho (int nume, info* info2){
     printf("\n\n\nfirst after passed= %s\n\n\n", info2[0].first); //i put 0 to see the first entry
}
4

2 に答える 2

3
  1. int num = 0;の代わりにを意味していたと思いますinto

  2. printf{... は構文エラーprintf(です。代わりに ...。

  3. の結果を確認してくださいfscanf。3 でない場合は、3 つの文字列すべてを読み取っていません。

  4. ( f)scanfを使用して文字列を読み取らないでください。少なくとも、最大長を指定しない限り、次のようにします。

    fscanf(pRead, "%10s%20s%20s", ...);
    

    しかし、さらに良いのは、fgets代わりに次を使用することです。

    fgets(info1[num].first, sizeof info1[num].first, pRead);
    fgets(info1[num].last, sizeof info1[num].last, pRead);
    fgets(info1[num].number, sizeof info1[num].number, pRead);
    

    fgets(もちろん、の結果を確認してください)

  5. num499 を超えないように注意してください。オーバーフローしinfoます。

    while(num < 500 && !feof(pRead)){.
    
于 2013-10-30T14:53:26.200 に答える
0

1.-エラー処理を改善するには、 を使用することfgets()、 で幅を使用すること、結果sscanf()を検証することをお勧めしますsscanf()
2.-OP の使用法はfeof(pRead)誤用しやすい - 提案しfgets()ます。

char buffer[sizeof(info)*2];   
while ((n < 500) && (fgets(buffer, sizeof buffer, pRead) != NULL)) {
  char sentinel;  // look for extra trailing non-whitespace.
  if (sscanf(buffer, "%20s%20s%10s %c", info1[num].first, 
      info1[num].last, info1[num].number, &sentinel) != 3) {
    // Handle_Error
    printf("Error <%s>\n",buffer);
    continue;
  }
  printf("%s %s %s\n", info1[num].first, info1[num].last, info1[num].number);
  num++;
}

ところで:%s名または姓の中にスペースが存在する場合、使用はうまく機能しません。

于 2013-12-02T17:00:43.987 に答える