Cファイルの終わりまで読み取ります

私は現在、4行を読み込むコードを持っていて、EOFまたはMAXのconst int値まで変更できるようにしたい。 !EOFが正しく機能するようにすることができず、これを達成するためにコードをどのように変更するのだろうと思っていましたか?

前もって感謝します

#include 

struct record{
    char name[2];
    int arrival_time;
    int job_length;
    int job_priority;
};

const int MAX = 40;

int main(void)
{
    struct record jobs[MAX];
    int i = 0;
    int j;
    FILE *f = fopen("data.dat","rb");

    while (fscanf(f, "%s %d %d %d", &jobs[i].name, &jobs[i].arrival_time,
                  &jobs[i].job_length, &jobs[i].job_priority) == 4 && i < MAX)
      i++;

    for (j = 0; j < i; j++)
        printf("%s %d %d %d\n", jobs[j].name, jobs[j].arrival_time,
               jobs[j].job_length, jobs[j].job_priority);

    fclose(f);

    return(0);
}
3
バイナリモードで開いたファイルで fscanf を使用するのは奇妙なことです。あなたが入力ファイルの内容を完全に制御できない限り、 "%s" 形式の fscanf は本質的に安全ではありません。配列をオーバーフローする可能性のある任意の長さの空白で区切られた単語を読み取ります。 fscanf によって返された値をチェックする終了条件は正しいと思われます。各入力行に4つのデータフィールドがある場合、それは機能するはずです。 data.dat がどのように見えるか教えてください。
追加された 著者 Keith Thompson,
EOFまで読んで、 data.dat ファイルの行数を事前に把握していない場合は、構造体 jobs の動的記憶域を考慮する必要があります。ファイルの終わりに達するまで( malloc といくつかの realloc )。
追加された 著者 Nicolás,
私のdata.datはA1 3 3 3のように1行で表示され、次にB1 4 4 4と表示されます
追加された 著者 Intelwalk,

3 答え

何かのようなもの

while (fscanf(f, "   %s   ", &etc) != EOF) {

}

次に、 feof(f)を使用して、 fscanf エラーか実際には EOF かどうかを確認します。

5
追加された
彼はすでに fscanf が4(要求された項目の数)を返すかどうかをチェックしています。それは40セットまでのアイテムを読み込むはずです。
追加された 著者 Keith Thompson,

あなたのコードは、以下を除いて、あなたが望むことをするようです。

char name[2];

名前はおそらく1文字より長くなります。

FILE *f = fopen("data.dat","rb");

バイナリ( "rb" )ではなく、テキスト( "r" )ファイルを読んでいるようです。

&jobs[i].name should be jobs[i].name

2
追加された

You need to change the order of the tests in your while() loop - you must test i < MAX before calling fscanf(), or else you'll potentially call it one too many times (you should also be passing jobs[i].name without the & to fscanf):

while (i < MAX && fscanf(f, "%s %d %d %d", jobs[i].name, &jobs[i].arrival_time,
              &jobs[i].job_length, &jobs[i].job_priority) == 4)
1
追加された