C Dosyanın sonuna kadar oku

Şu anda 4 satır okuyan bir kodum var ve bunu EOF veya MAX const int değerime kadar değiştirebilmek istiyorum. ! EOF'un doğru çalışmasını sağlayamıyorum ve bunu gerçekleştirmek için kodumu nasıl değiştirebilirim diye merak ediyordum?

Şimdiden teşekkürler

#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
İkili modda açılan bir dosyada fscanf kullanımı garip görünüyor. fscanf niteliksiz bir "% s" formatı ile giriş dosyasındakiler üzerinde tam kontrol sahibi olmadığınız sürece güvenli değildir; dizinizin taşabileceği, isteğe bağlı uzunlukta bir beyaz boşlukla sınırlandırılmış kelimesini okur. fscanf tarafından döndürülen değeri kontrol ederek sonlandırma durumunuz doğru görünüyor; Her giriş satırında 4 veri alanınız varsa, çalışması gerekir. data.dat 'ın nasıl göründüğünü bize gösterir misiniz?
katma yazar Keith Thompson, kaynak
EOF'a kadar okumak istiyorsanız ve data.dat dosyasının toplam satır sayısını önceden bilmiyorsanız, struct jobs için dinamik depolamayı göz önünde bulundurmalısınız. (dosya sonuna ulaşana kadar bir malloc ve bazı realloc ).
katma yazar Nicolás, kaynak
Benim data.dat bir satırda bu A1 3 3 3 gibi görünecek ve sonra B1 4 4 4 vb
katma yazar Intelwalk, kaynak

3 cevap

Gibi bir şey

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

}

Ardından, fscanf hatası mı yoksa gerçekten EOF olup olmadığını kontrol etmek için feof (f) öğesini kullanın.

5
katma
fscanf öğesinin 4 döndürüp döndürmeyeceğini kontrol ediyor (istenen öğe sayısı); 40 adede kadar öğe okuyor olmalıdır.
katma yazar Keith Thompson, kaynak

Kodunuz dışında ne istersen yapıyor gibi görünüyorsun:

char name[2];

İsimler muhtemelen 1 karakterden uzun olacaktır.

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

İkili değil ( "rb" ) metin ( "r" ) dosyasını okuyor gibisiniz.

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

2
katma

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
katma