0

void display_a_student()2 つのバイナリ ファイルを使用する関数 があります。まず、binary1.dat と、binary1.dat に追加された各生徒のオフセットを含む index.dat。

インデックスを使用して、ユーザーが入力した学生のオフセット値を見つけようとしています。strcmp() 関数を使用して、入力された値を index.dat ファイルに保持されている値と比較するのに問題があります。

これまでのコードはここにあります。

void display_a_student()
{
        struct student aStudent;

        char studentNumSearch[11];
        int index=0;
        int found = false;

        fp = fopen("binary1.dat", "a+b");
        fp1 = fopen("index.dat", "a+b");

        printf("\n\nWhich student are you searching for?");
        scanf("%s", studentNumSearch);
        fflush(stdin);

    while(!found && index < 10)
    {
        if(strcmp(studentNumSearch,fp1[index].studentNum)==0)
        {
            found = true;
        }
        index++;
    }

    if (found)
    {
        fseek(fp, fp1[index].offset, SEEK_SET);
        fread(&aStudent,sizeof(struct student),1,fp);
        printf("\n\nThe student name is %s\n",aStudent.firstName);
    }
    else
    {
        printf("\n\nNo such student\n");

    }

    fclose( fp ); /* fclose closes file */
    fclose (fp1);
    getchar();

}

次の行は確かです: if(strcmp(studentNumSearch,fp1[index].studentNum)==0) strcmp() 関数の使用中にファイルを指す方法がわからないため、間違っている場所です。- 関連性のためにコードを編集しました。

4

2 に答える 2

5

strcmp文字列比較用です。memcmpバイナリ比較に使用します。

主な問題は、へのアクセスfp1[index]です。割り当てられていない FILE 要素にアクセスするため、これは機能しません。fp1 は配列ではなく、FILE ポインターです。

ファイルを使用するfscanffread、ファイルから読み取り、fseek各エントリのインデックスとサイズに基づいてファイル内に正しく配置する必要があります。

于 2011-03-31T12:32:19.730 に答える
-1

strcmp を使用する必要はないと思います。fread を使用して構造体にコピーしてから、必要なものを strcmp を使用する必要があります。あなたがした方法を使用しなければならない場合.. strcmpの代わりにmemcmpを使用していますが、Benoitが言ったように、cmpを実行する前に長さを知る必要があります.

于 2011-03-31T15:52:49.120 に答える