2017-12-04 11 views
-1

私はこれのために私が持っているhttps://drive.google.com/open?id=18olXBhRgpGyY0bhpjDSwla2XcBnWoFGMこのセグメンテーションフォルトを修正する方法に関する提案はありますか?

命令があり、ここで見つけることができるファイル「animals.dat」から入力データを読んでいます: ユーザーが3に入った場合は、入力ファイルの動物と仮定しています。レコードは動物タイプのレコード(下に定義されている )で構成され、レコード番号を示す整数 で示される、検索して画面に表示する動物レコードをユーザに尋ねる必要があります。構造のメモリレイアウトは異なるマシン上で異なるので、プラグマパックディレクティブが同じアライメント/パディングを使用して(動物型の変数を同じ方法で格納するコンパイラ を強制

#pragma pack(1) 
struct animal { 
    short int id; 
    char name[20]; 
    char species[35]; 
    char size; 
    short int age; 
}; 

:動物型構造は次のように定義され)プラットフォームに関係なく。 このタイプの検索はランダムファイルアクセスを使用することであり、動物のレコード番号とIDは同じエンティティ であることに注意してください。

1、アレグラ、Pseudoisのnayaur、S、5

2、未知、Ailurusのfulgens、X、10

3、アテナ、Moschus fuscus、たとえば、ファイルなどのエントリで構成されている場合そのファイル上の第三 レコードが

3であるX、2

、アテナ、Moschus fuscus、Xは、2匹の

すべての動物は、内に記載されています値1で始まるID番号で順序を折り目づけする。ID番号に穴がある場合は、 など。 2の場合、空のレコードを示す文字列「 」が名前コンポーネントに含まれていることを除き、構造情報はファイル内に残ります。検索でランダムなファイル処理が使用されていることを確認してください。 無効なIDが入力された場合(この例では1または3以外の値)、プログラムはエラーメッセージを表示します。 それ以外の場合は、動物の記録が表示されます。どちらの場合でも、プログラムは最初のメニューに戻ります。

最初の2つのオプションはうまくいきました。 、

#pragma pack(1) 
struct animal { 
    short int id; 
    char name[20]; 
    char species[35]; 
    char size; 
    short int age; 
}; 
typedef struct animal* Animal; 

void choice3(FILE *infile) { 
    Animal tempAnimal; 
    int id; 
    printf("Enter ID "); 
    scanf(" %d", &id); 
    //fseek(infile,id * sizeof(struct animal),SEEK_SET); 
    while(fread(&tempAnimal,sizeof(struct animal) - 1,1,infile) == 1) { 
     printf("%d -- %s\n",tempAnimal->id,tempAnimal->name); 
    }  
} 

何らかの理由で私は私の変数tempAnimalに何を保存することができませんし、それがセグメンテーションフォールトを投げています:オプション3のために私はこのコードを使用している11

+1

これをデバッグするための素晴らしい方法は、それを実行するために、次のようになります。fread()

fread()への最初の引数はマニュアルに従って最初の引数として単一のポインタを取るようしたがって、あなたはAnimalに、二重のポインタを渡していますGDBやLLDBのようなデバッガの下で実行されます。 –

+0

私はどこに問題が発生しているのか知っていますが、何らかの理由で解決策を見つけることができません。それはfread()ステートメントで起こります。 – kbreezy

+1

構造体全体を読みたいときは、なぜ 'sizeof(struct animal) - 1'だけを読んでいますか? –

答えて

2

おそらく、あなたの問題は起きていますtempAnimalAnimalタイプへのポインタです。 whileステートメントでは、の前に&を置き、そのメモリアドレスを取得しています。 https://www.tutorialspoint.com/c_standard_library/c_function_fread.htm

+3

それだけでなく、彼はtempAnimalのためにメモリを割り当てることに失敗しましたが、彼はそこにデータを読み込んでいます。 –

+0

ああ。しかし、今ではtempAnimalをtempAnimalに、sizeof(struct animal)をsizeof(struct animal)に切り替えました。それでも何とか私に同じセグメンテーションフォールトが与えられます:11. – kbreezy

+0

David Hoelzerが述べたように、tempAnimalにもメモリを割り当てる必要があります。 malloc()を呼び出すと、これはおそらくセグメンテーション違反の原因になります。 – Vltava

関連する問題