c - 在计算文件中的行数后,文件为空(在他这边)

标签 c

我是 C 的新手(很久没用过),我的代码有点问题。我尝试读取一个文件,计算行数,并将数字存储在二维整数数组中。在计算文件中的行数之后,我必须再次打开文件,因为在 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");
        }
    }
}

最佳答案

您发现了读取管道进程 (popen()) 而不是文件 (fopen()) 的一个局限性。它只是一个数据流,而不是一个所有内容都已知且持久的文件。对于流,您唯一知道的是下一步是什么,以及您是否在最后。如果它是一个真实的文件,你可以四处寻找,向前或向后。对于流,您只能向前阅读。

所以如果你想读到最后,然后再读一遍内容,你必须分两次完成(就像你的例子)。但是第二次运行该命令时,它可能会或可能不会给出完全相同的结果。

我建议只使用一次读取数据并存储它。您可以读取数据并将其逐行存储,并根据需要动态重新分配缓冲区。

关于c - 在计算文件中的行数后,文件为空(在他这边),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41078125/

相关文章:

c - 确定质数或合数

c - 错误 : invalid operands to binary + (have 'float *' and 'float *' )

c - 数组指针到数组的转换 - C/C++ 初学者

c - 来自创建线程问题的 Enif_send 函数

c - C 中的静态函数

c - 对 'display' 的 undefined reference

c - 如何在换行符 "\t"之前将字符 "\n"添加到字符串中

c - 从 C 程序中保存大量数值数据 (GB) 的最佳格式是什么?

python - 如何分析组合的 python 和 c 代码

c - 如何向现有 C 代码添加新参数?