0

ファイルから読み取った構造へのポインターを返したい (基本的にデータを出力するだけの別の関数に移動する) 関数は int sem を介して (シリアル番号 -1) を取得し、設定するfseek で読み取りたい構造体の先頭へのファイル ポインターを取得し、単純に構造体全体を読み取ってポインターを返します。(例: ファイルに書かれている構造体の数が 5 で、4 番目の構造体を読みたい場合、関数が取得する sem 値は 3 であり、fseek ポインターを使用すると、最初の 3 つの構造体をスキップし、関数は最初の 3 つの構造体を読み込んで返します。構造 no.4)。sem 値が 0 の場合は正常に動作しますが、他の構造を探すとうまくいきません。何が悪いのかわからない!ヘルプ?:)

type_seminar *file_seminars_search(int sem) {
     type_seminar *temp_s = (type_seminar*) malloc(sizeof(type_seminar));
     FILE *f_sem;
     if ((f_sem = fopen("seminars.bin", "r")) != NULL ) {
          fseek(f_sem, sem * sizeof(type_seminar), SEEK_SET);
          fread(temp_s, sizeof(type_seminar), 1, f_sem);
          fclose(f_sem);
          return (temp_s);
     } else
          printf("Cannot access file. \n ");
     return 0;
}

構造の定義:

typedef struct {
     char s_title[A];
     char s_street[B];
     char s_town[C];
     int max_no_teachers;
     int no_applied_teachers;
} type_seminar;

そして、問題がここにある場合にデータを出力する関数:

void seminar_details(type_seminar *temp_s) {
      printf("   SEMINAR TITLE : %s", temp_s->s_title);
      printf("   Street: %s ", temp_s->s_street);
      printf("   Town: %s", temp_s->s_town);
      printf("   Max no of applied teachers: %d \n", temp_s->max_no_teachers);
      printf("   No of applied teachers: %d \n", temp_s->no_applied_teachers);
}
4

2 に答える 2

1

Seminars.bin の作成方法によって、ファイルの読み取り方法が決まると思います。ascii モードと比較して、バイナリ モードでファイルを開くことも役立つ場合があります。

次の関数を使用して、seminars.bin を作成しました。

void createData()
{
FILE    *fcre;
type_seminar element;
int counter;

fcre = fopen("seminars.bin", "wb");
for(counter = 0; counter < 5; counter++)
{
    printf("Enter type_seminar.s_title:");
    scanf("%s", element.s_title);
    printf("Enter type_seminar.s_street:");
    scanf("%s", element.s_street);
    printf("Enter type_seminar.s_town:");
    scanf("%s", element.s_town);
    printf("Enter type_seminar.max_no_teachers:");
    scanf("%d", &element.max_no_teachers);
    printf("Enter type_seminar.no_applied_teachers:");
    scanf("%d", &element.no_applied_teachers);

    fwrite(&element, sizeof(type_seminar), 1, fcre);
}
fclose(fcre);
}

元のファイルの数行を次のように変更しました

if ((f_sem = fopen("seminars.bin", "rb")) != NULL ) 

 fread(temp_s, sizeof(type_seminar), 1, f_sem);

これらの変更により、コードを期待どおりに動作させることができました!!

于 2013-02-07T23:44:26.723 に答える
-1

問題は

return 0;

ライン。あなたはintを返していないからです。

于 2013-02-07T23:01:01.340 に答える