2016-08-09 4 views
2

を実行しませんでした。保存された場所にファイルの個々のコンポーネントが表示され、その実行が2回行われました。大学のプロジェクトには問題があります。オープン用とforループ用に書かれています。CファイルプログラムはターボC++でプログラムを保存した後に

#include<stdio.h> 
typedef struct 
{ 
     int select; 
     char lastname[25]; 
     char firstname[25]; 
     char address[25]; 
     char phonenumber[25]; 
} addressbook; 

#define ARRAYLEN 2 

addressbook a[ARRAYLEN]; 
FILE *fp; 

int main() 
{ 
    int i; 

    fp = fopen("addressbook.dat","a+"); 

    for(i=0; i<ARRAYLEN ; i++) 
    { 
     printf("enter details\n"); 
     printf("enter lastname:\n"); 
     scanf("%s", a[i].lastname); 
     printf("enter firstname:\n"); 
     scanf("%s", a[i].firstname); 
     printf("enter address:\n"); 
     scanf("%s", a[i].address); 
     printf("enter phone number:\n"); 
     scanf("%s", a[i].phonenumber); 
     fwrite(&a[i], sizeof(a), 1, fp); /* notice, array indexed */ 
    } 
    fclose(fp); 

    fopen("addressbook.dat", "r"); 
    for(i=0; i<ARRAYLEN; i++) 
    { 
     fread(&a[i], sizeof(a), 1, fp); 
     printf("lastname:%s\n", a[i].lastname); 
     printf("firstname:%s\n", a[i].firstname); 
     printf("address:%s\n", a[i].address); 
     printf("phonenumber:%s\n", a[i].phonenumber); 
    } 
    fclose(fp); 

    return 0; 
} 
+2

に1秒間に2回 'はfopen dがそれは言うまでもない変数

  • に与えられた許可のスペースを超えない、値がユーザーから受け取ったことを確認していますが、fcloseを(FP)を使用しています'は戻り値を使用しません。 'fp = fopen(" addressbook.dat "、" r ");'また、 'fp'をチェックしてNULLであるかどうかを確認し、そうであれば適切な処置をとるべきです。 –

  • +0

    @RishikeshRaje回答として投稿してください。それは正しい解決策です。これを追加すると、閉じた 'fp'で' fread'に[UB](https://en.wikipedia.org/wiki/Undefined_behavior)が追加されます。 – LPs

    +0

    トピック外のコメント...ユーザー入力を読み取るために 'scanf()'を使用することは非常に悪いことです。次のことを考慮してください。1)フィールドサイズを超える名前/住所をユーザーが入力するとどうなりますか? 2)ユーザーが複数のトークンを入力すると(複数のファーストネームが存在し、アドレスまたは電話番号のいずれかがスペースを含む*慣習的に*フォーマットされている)、どうなりますか? - 良い選択肢は、入力全体を読み込み( 'fgets()'を使用し、行全体を取得できなかった場合はバッファのサイズを変更する)、入力の量を確認し、メモリを動的に割り当て、入力バッファ – DevSolar

    答えて

    5

    問題は、 'fp' - ファイルポインタの使用にあります。

    fopenを最初に使用した後で閉じると、再びfopenを使用します。

    しかし今回は、fpに戻り値を設定しません。だから、あなたの次のactiond(フリーダのような)は、未確認の結果を作り出します。

    交換してください -

    fopen("addressbook.dat", "r"); 
    

    あなたのコード内の

    fp = fopen("addressbook.dat", "r"); 
    

    その他の問題で -

    1. いつもあなたが旧姓

    2. 戻り値をチェックしますあなたのcorrentソリューション

    +0

    答えのコードをどのように書式設定するのですか? ( '4-space'でコードをインデントしただけです。)' –

    +0

    ありがとう@David C. Rankin –

    +0

    これははるかに優れています。 –

    関連する問題