2016-12-10 9 views
0

私はまったく新しいCです(長い間使用していません)。私はファイルを読み込み、行を数え、整数を2次元配列に格納しようとします。ファイル内の行を数えた後、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

お待ちください、これらはファイルではなくパイプ処理です。あなたはそれらから一度しか読むことができません。それは魔法のようにあなたのためにストリーム全体を格納しません。あなたはそれらを巻き戻すことはできません。 – e0k

+1

アレイのメモリを割り当てて、フルになったときに再割り当てして、1回のパスでデータを取得することができます。 –

答えて

2

あなたはファイルの代わりにパイプで連結されたプロセス(popen())(fopen())を読んでの1つの制限が発見しました。これは単なるデータストリームであり、内容全体がわかっていて永続的なファイルではありません。ストリームについては、あなたが知っている唯一のものは、次に何があり、最後にいるかどうかです。それが真のファイルだった場合は、どこにいても、前方にも後方にでも、どこでも探し求めることができます。ストリームでは、転送を読み取ることしかできません。

最後まで読んでから内容をもう一度読みたい場合は、2つのパス(例のように)で行う必要があります。しかし、2回目にコマンドを実行すると、まったく同じ結果が得られる場合とされない場合があります。

データを読み取り、1回のパスで保存することをお勧めします。データを読み込んで行ごとに格納し、必要に応じてバッファを動的に再割り当てすることができます。

関連する問題