我是 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/