2010-12-05 12 views
0

あなたのフォーラムに参加してうれしく思います。 今、下に行くことができます。私は 'セグメンテーションフォールト'エラーに問題があります。 Imは構造体に格納しようとしているバイナリファイルからデータを読み込みます。私は何をやっているのか、何をしようとしているのかをコード化しています。ハハハ構造のヘルプ(セグメンテーションフォールト)

struct Medico //users are medics 
{ 
    int Id_Doctor; //Id User 
    int Estado; //status of the user 
    char Nombre[60]; //name of the user 
    char Clave_Acceso[20]; //password of the user 
    char Especialidad[40]; //especialty of the user 
    struct Medico *next; 
}; 

void Cargar_Datos() //load files 
{ 
    FILE *Archivaldo; ///file- Archivo means file 
    struct Medico * head = NULL; 
    struct Medico * prev, *current; 
    char especialida[40], password[20]; ///locals for specialty and password 
    char nombre_doc[60]; ///local for name 
    int estado_doc, id_doc; // local for status 

    if((Archivaldo=fopen("md.dat", "a+b"))==NULL) 
    { 
     printf("No se pudo abrir el archivo de Medicos\n"); 
     exit(1); 
    } 
    rewind(Archivaldo); 
    current = (struct Medico *) malloc (sizeof(struct Medico)); 

    fread(&id_doc, sizeof(int), 1, Archivaldo); 
    fread(nombre_doc, sizeof(char), sizeof(nombre_doc), Archivaldo); 
    fread(password, sizeof(char), 20 , Archivaldo); 
    fread(especialida, sizeof(char), 40, Archivaldo); 
    fread(&estado_doc, sizeof(int), 1, Archivaldo); 

    printf("ID: %d\n", id_doc); 
    printf("\nDoctor: "); 
    puts(nombre_doc); 
    printf("\nPassword: "); 
    puts(password); 
    printf("\nEspecialidad: "); 
    puts(especialida); 
    printf("\nEstado: "); 
    if(estado_doc==1) 
    puts("Activo\n"); 
    else 
    puts("Inactivo\n"); 
    current->Id_Doctor=id_doc; 
    strcpy(current->Nombre, nombre_doc); 
    strcpy(current->Clave_Acceso, password); 
    strcpy(current->Especialidad, especialida); 
    current->Estado=estado_doc; 
    current=current->next; 

    fclose(Archivaldo); 

} 

ありがとうございます。素敵な一日をお過ごしください

+0

コードに適切な字下げができるようにメッセージを再フォーマットしてください。今は読めません。 – thkala

+0

また、バグを再現する最小のコードにサンプルを切り抜いてみてください(これはどんな場合でも良いデバッグ手法です)。 segfaultがどこで起きているのかを正確に指定します(デバッガで実行することでこれを見つけることができます)。 –

+0

@Reese:ありがとう。さて、私たちが見逃しているのは、プログラムの残りの部分です。 – thkala

答えて

0

セグメンテーションフォールトをデバッグするための最良の方法は、このようなGDBなどのデバッガやメモリ・アナライザを使用することですValgrind。

使用できない場合は、通常、番号付きのprintf()ステートメントをコードに追加すると便利です。エラーの前に最後に実行されたprintf()が見つかったら、さらにprintf()ステートメントを追加し、テストを繰り返して絞り込むことができます。

Cプログラムでセグメンテーションフォールトのいくつかの一般的な原因:NULLポインタデリファレンスしようとして

  • 。このポインタが、malloc()やfopen()のような関数呼び出しの結果である場合には、そのエラーがチェックされずにエラーが発生していないことがよくあります。

  • アレイまたは割り当てられたブロックのエッジを超えています。正しく終端されていない文字列は、これの一般的な原因です。文字列を印刷すると画面にゴミが出る場合は、その原因になる可能性があります。

  • すでにfree()で解放されているメモリブロックを使用しようとしています。

3

nombre_doc,especialidaと他のすべての文字列はfreadです。これは問題ありませんが、文字列は'\0'で終了しません。これらの文字列がヌルターミネータで終わることを期待しているputsstrcpyを使用します。

まず、それはあなたの文字列を終了した後、1と文字列のサイズを大きく:

nombre_doc[60] = '\0'; 
+0

これは配列の最後を通過するでしょう。あなたは60ではなく59を望んでいました。 –

+0

なぜ私は彼が1つの文字列のサイズを大きくしなければならないと言ったのですか?私は彼がファイル内の固定幅のフィールドを持っていると仮定します。 – terminus

+0

そうでした。私はあまりにも早く読んでいた。 –

関連する問題