从c中的变量中的文件存储第一行读取int

时间:2018-04-18 20:24:41

标签: c

我试图从txt文件中读取整数并将第一行存储到三个变量中,其余的存储到一个数组中。

 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。

1 个答案:

答案 0 :(得分:2)

它会跳过,因为您正在使用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;
}