0

初めてここで質問しました。まず、コードは次のとおりです。

void displayCompanyInfo(STAFF  e[], int *s)
{
    FILE *payRoll;
    int i = 0;
    int rosterNumber [100];
    int count = 1;

    if ((payRoll = fopen("payRoll.txt", "r")) == NULL)
    {
        perror ("error");
        exit (0);
    }

    cls;

    while (fgets(e[i].name,  sizeof(e[i].name), payRoll) != NULL)
    {
        printf ("Record %i: ", count++);
        printf("%s\n", e[i].name);
    }

    fclose(payRoll);
    printf("\n\n");
    pause;
    cls;

} // end of display

基本的に、このコードは機能します。ただし、テキストファイルが表示されると、次のようになります。

レコード1:名前:何とか
レコード2:年齢:23
レコード3:時給:34

代わりに、私はそれを次のように読んでもらいたい:

レコード1:名前:Blah
年齢:23
時給:34

レコード2:名前:Blah2年齢
:24
時間料金:35

等々...

これを機能させる方法についてのアイデア。スレッドをやり過ぎたくなかったので、プログラム全体を投稿しませんでした。しかし、あなたがそれを必要とするならば、私に知らせてください。

4

2 に答える 2

2

この場合、バイナリファイルの処理を行う必要があります。テキストファイルでは不可能です。構造を取得するには、データのチャンクをバイト単位で読み取り、書き込み、それに応じて処理する必要があります。

言う

struct e {char name [20]、int age、int hourly_rate};

この構造には、20(name)+ 4(age)+ 4(hourly_rate)バイトが必要です。次に、バイナリファイルに一度に28バイトを書き込み、それに応じて28バイトを取得する必要があります。これは、テキストファイルの場合は不可能です。ファイルはすべてのものを文字と見なします。たとえば、age = 23は年齢フィールドを2バイトと見なし、age = 3の場合は1バイトと見なしますが、バイナリファイルは両方を実際の整数サイズである4バイトと見なします。

したがって、問題の解決策はバイナリファイルの処理です。

于 2013-02-25T04:41:00.423 に答える
1

問題は、ループが各行をレコードと見なすことです。代わりに、レコードは3行である必要があります。したがって、ループ内の3つのことを読んでください-printfの直前に欠​​落している2つを追加してください。

于 2013-02-25T01:08:42.083 に答える