在计算文件中的行后,该文件为空(在他的末尾)

时间:2016-12-10 17:12:36

标签: c

我是C的新手(很久没用过了)我的代码有点问题。我尝试读取文件,计算行数,并将数字存储在2D整数数组中。在对文件中的行进行计数之后,我必须再次打开该文件,因为在do while周期后我无法从文件中读取任何内容。有没有选项可以避免再次打开文件来存储值?

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int disk[10][10];
    int i, j, num, row=0, col=4;
    int ch;

    FILE *diskfile1;
    diskfile1 = popen("grep 'sda' /proc/diskstats | awk '{print $4,$6,$8,$10}'", "r");  

    do {
        ch=fgetc(diskfile1);
        if(ch=='\n')
            row++;
    }while(ch != EOF);

    FILE *diskfile;
    diskfile = popen("grep 'sda' /proc/diskstats | awk '{print $4,$6,$8,$10}'", "r");

    for(i = 0; i < row; i++) {
        for(j = 0; j < col; j++) {
            fscanf(diskfile, "%d ", &num);
            disk[i][j] = num;
        }
    }

    for (i = 0; i < row; i++) {
        for (j = 0; j < col; j++) {
            printf("%d ", disk[i][j]);
            if(j==col-1)
                printf("\n");
        }
    }
}

1 个答案:

答案 0 :(得分:2)

您发现了读取管道进程(popen())而非文件(fopen())的一个限制。它只是一个数据流,而不是一个整个内容已知且持久的文件。对于一个流,你唯一知道的是接下来的事情,如果你最后还是没有。如果它是一个真实的文件,你可以在任何你想要的地方,向前或向后寻找。使用流,您只能向前阅读。

因此,如果您想要阅读到最后,再次阅读内容,您必须在两次传递中完成(如您的示例)。但是第二次运行命令时,它可能会也可能不会给出完全相同的结果。

我建议只读一遍就读取数据并存储。您可以读取数据并逐行存储,并根据需要动态重新分配缓冲区。