0

ユーザーからいくつかの情報(名前、住所、連絡先番号)を取得し、それを構造体に格納しています。次に、これを「r+」モードで開いたファイルに保存します。行ごとに読んで、入力しようとしているエントリがすでに存在するかどうかを確認します。存在する場合は終了します。それ以外の場合は、ファイルの最後にこのエントリを追加します。問題は、ファイルを「r +」モードで開くと、セグメンテーション違反が発生することです。

コードは次のとおりです。

struct cust{
    char *frstnam;
    char *lastnam;
    char *cntact;
    char *add;
};

ここで、この関数について考えてみましょう。この関数で情報の構造体を渡します。その仕事は、この構造体がすでに存在するかどうかを確認することです。そうでない場合は、ファイルの終わりに追加します。

void check(struct cust c)
{
    struct cust cpy;
    FILE *f;    
    f=fopen("Customer.txt","r+"); 
    int num=0;

    if (f!= NULL){
        while (!feof(f)) {
            num++;
            fread(&cpy,sizeof(struct cust),1,f);

            if ((cpy.frstnam==c.frstnam)&(cpy.lastnam==c.lastnam)&(cpy.cntact==c.cntact)&(cpy.add==c.add))
            {
                printf("Hi %s %s. Nice to meet you again. You live at %s and your contact number is %s\n", cpy.frstnam,cpy.lastnam,cpy.add,cpy.cntact);
                return;
            }
        }
        fwrite(&c,sizeof(struct cust),1,f);
        fclose (f);
    }
    printf("number of lines read is %d\n",num);
}
4

3 に答える 3

4

問題は、構造体に文字列自体ではなく、文字列へのポインターが含まれていることです。そのため、ポインタ値は読み書きされますが、アプリケーションの実行間で有効ではないため、freading と fwriting は機能しません。

簡単な修正は、構造を次のように変更することです。

struct cust{
char frstnam[25];
char lastnam[25];
char cntact[25];
char add[25];
};

それは素晴らしい修正ではありませんが、修正であり、あなたにとってはうまくいくかもしれません.

于 2012-10-27T04:10:36.433 に答える
2

また、文字列をそのように比較しても機能しません。ポインターを比較するだけです。

次のようなものが必要になる場合があります。

if ( strcmp(cpy.frstnam,c.frstnam) == 0 && strcmp(cpy.lastnam,c.lastnam) == 0 ...
{
    printf("Hi ...
    return;
}

これは、ポインターではなく、文字列配列の実際の内容を比較します。

また、「&」はビットごとの AND であり、「&&」はここで必要な論理 AND です。

于 2012-10-27T04:16:40.910 に答える
0

一致する連絡先が見つかった場合、最初にファイルを閉じずに現在のコードが返されます。最終的に、使用可能なファイル記述子が不足し、fopen の呼び出しが失敗する可能性があります。

于 2012-10-27T04:39:51.573 に答える