2016-06-22 15 views
0

私はそのようなファイルを持っているとして保存:ファイルを読み込み、行列

1 100 
2 200 
3 300 
4 400 
1 

私は行列として保存したいと私は二番目の数字がない場合はNULL保存したいです!

プログラムを書き込もうとしましたが、正しく動作しません。

#include<stdio.h> 
int main() { 
int k=0 ,i,j , arr[100][100]; 
FILE *in= fopen("file.txt","r"); 
char line[1000]; 
while(fgets(line,1000,in) !=NULL) k++; 
fgets(line,1000,in); 
for (i=0;i<k;i++){ 
    for (j=0;j<2;j++){ 
     int tmp ; 
     fscanf(in ,"%d", &tmp) ; 
     arr[i][j] = tmp ; 
    } 
} 
fclose(in); 
return 0; } 
+2

「NULL」マクロを_store_整数にすることはできません。そして、その値を一般的な整数に格納すべきではありません。 – Olaf

+0

あなたは '巻き戻し 'が必要です。 – BLUEPIXY

+0

'int arr;' int arr [100] [100]; ' – BLUEPIXY

答えて

2

2つの大きな問題:

最初は、最初のループはすべてライン、ライン上の単一の番号でも、1を読むことです。つまり、孤独なfgetsコールは何もしません。さらに重要なことに、kの値が間違っていることを意味します。

2番目の問題は、ファイルからすべてのデータを読み込んだら、ファイルの先頭に戻ってこないことです。代わりに、ファイルの最後から読み込みを試みます。

第1の問題は、第2のfgetsコールをスキップし、kを1減らすことで解決できます。

2番目の問題は、行数を数えた後にrewindを呼び出すことで解決できます。


数字を実際に読み取ったときに、内部ループは必要ありません。

scanf("%d %d", &arr[i][0], &arr[i][1]); 

実は、あなたがfgetssscanfを使用して、sscanfの戻り値をチェックすることで、単一のループでそれをすべて行うことができ、全く最初の行カウントループを必要としません。だからあなたのプログラムは何かのように見えるかもしれません

#include <stdio.h> 

int main(void) 
{ 
    int values[100][2]; 
    FILE *input = fopen("file.txt", "r"); 
    size_t entries = 0; 

    if (input != NULL) 
    { 
     char buffer[40]; 
     while (fgets(buffer, sizeof(buffer), input) != NULL && entries < 100) 
     { 
      int res = sscanf(buffer, "%d %d", &values[entries][0], &values[entries][1]); 
      if (res <= 1 || res == EOF) 
      { 
       // Read the last line with only one number, or an error happened 
       values[entries][0] = 0; 
       values[entries][1] = 0; 
       break; 
      } 

      ++entries; 
     } 

     if (ferror(input)) 
     { 
      printf("Error reading file\n"); 
     } 

     fclose(input); 
    } 

    // All done, the number of "records" or "entries" is in the variable entries 

    // Example code: print the values 
    for (size_t i = 0; i < entries; ++i) 
     printf("Line %d: %d %d\n", i + 1, values[i][0], values[i][1]); 

    return 0; 
} 
+0

@ instiffs 'を使用して、' sscanf'が '2'を別々に返さないようにコードを更新しました。しかし、あなたは "あなたが" NULLを使って1を記録する "ということを詳しく述べなければなりません。"ヌル "はヌル***ポインタです***、整数変数に割り当てるべきではありません。そしてあなたは本当に少し自分自身を考えようと思うべきです、私は本当にあなたのコードを書くのが好きではありません。コピー&ペースト以外何も実際に学ぶことはありません。 –

+0

私はそのような出力行列を得ることを望む: [1 100; 2 200; 3 300; 4 400; 1 NULL]; しかし、とにかく私はしようとします –

+0

良い答え:軽微な質問:なぜ ''(res <= 1 || res == EOF) 'vs' if(res <= 1) 'または' if(res!= 2 ) 'または...?明快さのいくつかの並べ替えを強調する?注意: 'printf(" Line%zu:%d%d \ n "、...' – chux

関連する問題