我是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");
}
}
}
答案 0 :(得分:2)
您发现了读取管道进程(popen()
)而非文件(fopen()
)的一个限制。它只是一个数据流,而不是一个整个内容已知且持久的文件。对于一个流,你唯一知道的是接下来的事情,如果你最后还是没有。如果它是一个真实的文件,你可以在任何你想要的地方,向前或向后寻找。使用流,您只能向前阅读。
因此,如果您想要阅读到最后,再次阅读内容,您必须在两次传递中完成(如您的示例)。但是第二次运行命令时,它可能会也可能不会给出完全相同的结果。
我建议只读一遍就读取数据并存储。您可以读取数据并逐行存储,并根据需要动态重新分配缓冲区。