मैं एक txt फ़ाइल से ints पढ़ने की कोशिश कर रहा हूं और पहली पंक्ति को तीन चर में और बाकी को एक सरणी में संग्रहीत करता हूं।

 while(fgets(lineBuf, sizeof(lineBuf), inputFile) != NULL){

   fscanf(inputFile, "%d %d %d", &pages, &frames, &requests);
   printf("\n\nin loop to get first line variables:\n Pages: %d\n frames: %d\n requests: %d", pages, frames, requests);
 }

इनपुट फ़ाइल: पहली पंक्ति वाली संख्याएँ पहली तीन हैं और प्रत्येक पंक्ति बाद में केवल एक ही संख्या है।

8 12 4 
4
3
4
...

जब मैं प्रोग्राम चलाता हूं, तो यह 12 और 4 को छोड़ देता है।

c
1
Alek MIller 18 अप्रैल 2018, 23:24

1 उत्तर

सबसे बढ़िया उत्तर

यह स्किप हो जाता है क्योंकि आप फ़ाइल को fgets के साथ भी पढ़ रहे हैं, इसलिए fgets प्राप्त करें पहली पंक्ति, fscanf दूसरी पंक्ति लेकिन इनपुट में नई पंक्ति छोड़ती है बफर, इसलिए fgets केवल एक खाली लाइन, आदि पढ़ेगा। मिश्रण करना एक बुरा विचार है दोनों पठन समारोह।

सबसे अच्छी बात यह होगी कि सभी पंक्तियों को fgets के साथ पढ़ें और प्रत्येक पंक्ति को पार्स करें sscanf. आपके पास कितने पूर्णांक हैं, यह निर्धारित करने के लिए sscanf के वापसी मान का उपयोग करें पढ़ना। आपके इनपुट से ऐसा लगता है कि एक पंक्ति में 1, 2 या 3 पूर्णांक हो सकते हैं। तो यह करेंगे:

char line[1024];
while(fgets(line, sizeof line, inputFile))
{
    int pages, frames, requests, ret;

    ret = sscanf(line, "%d %d %d", &pages, &frames, &requests);

    if(ret < 1)
    {
        fprintf(stderr, "Error parsing the line, no numbers\n");
        continue;
    }

    if(ret == 1)
    {
        // do something with pages
    } else if(ret == 2) {
        // do something with pages & frames
    } else if(ret == 3) {
        // do something with pages, frames and requests
    }
}

संपादित करें

आपकी टिप्पणियों के आधार पर, केवल पहली पंक्ति में 3 मान हैं और शेष पंक्तियों में प्रत्येक का एक मान है, तो आप इस तरह कोड को सरल बना सकते हैं:

#include <stdio.h>

int parse_file(const char *fname, int *pages, int *frames, int *request, int *vals, size_t size)
{
    size_t idx = 0;

    if(fname == NULL || pages == NULL || frames == NULL
            || request == NULL || vals == NULL)
        return -1;

    FILE *fp = fopen(fname, "r");
    if(fp == NULL)
    {
        fprintf(stderr, "Cannot open %s\n", fname);
        return -1;
    }

    if(fscanf(fp, "%d %d %d", pages, frames, request) != 3)
    {
        fprintf(stderr, "Wrong format, expecting pages, frames and requests\n");
        fclose(fp);
        return -1;
    }

    // reading all other values and storing them in an array
    while((idx < size) && (fscanf(fp, "%d", vals + idx) == 1)); // <-- note the semicolon

    fclose(fp);
    return idx; // returning the number of values of the array
}

int main(void)
{
    int pages, frames, request, vals[100];

    int num = parse_file("/your/file.txt", &pages, &frames, &request,
                vals, sizeof vals / sizeof vals[0]);

    if(num == -1)
    {
        fprintf(stderr, "Cannot parse file\n");
        return 1;
    }

    // your code

    return 0;
}
2
Pablo 19 अप्रैल 2018, 00:13