C Чытаць да канца файла

Я ў цяперашні час ёсць код, які чытае 4 радкі, і я хачу, каб быць у стане змяніць, што да канца файла ці мой MAX канстантнасцю значэнне 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 на файл адчынены ў двайковым рэжыме. <�Код> fscanf з некваліфікаваным "% S" фармат па сутнасці з'яўляецца небяспечным, калі вы не маеце поўны кантроль над тым, што знаходзіцца ў файле ўводу; ён чытае бел-прастору, абмежаваную слова адвольнай даўжыні, якія могуць перапаўненне вашага масіва. Ваша ўмова завяршэння, праверка вяртае значэнне fscanf , здаецца правільным; калі ў вас ёсць 4 поля дадзеных на кожнай уваходнай лініі, ён павінен працаваць. Ці можаце вы паказаць нам, што data.dat выглядае як?
дададзена аўтар Keith Thompson, крыніца
Калі вы хочаце, каб чытаць да канца файла, і ня загадзя агульнай лік радкоў не ведаеце data.dat файл мае, то вам варта разгледзець дынамічную памяць для <�структуры коды> работы (а Таноса і некаторыя пераразмеркаваць да канца файла не будзе дасягнуты).
дададзена аўтар Nicolás, крыніца
Мой data.dat будзе выглядаць наступным чынам A1 3 3 3 на адным радку, а затым 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");

Вы, здаецца, чытанне тэксту ( "г" ) файл, а не бінарны ( "Р.Б." ).

&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
дададзена