2017-02-02 8 views
0

こんにちはテキストファイルからメトリックをインポートしようとしています。当初、私は行列について何も知らないので、行列の行数を計算し、それにスペースを割り当てます。行列をインポートしようとすると、無限ループに陥ります。私は取得しない理由をマトリックスをCでインポートする

CODE:テキストファイルに

#include <stdio.h> 
#include <stdlib.h> 

int main(int argc, char* argv[]) 
{ 
    FILE *fp; 
    int i,j; 
    char ch; 
    fp = fopen(argv[1],"r"); 
    if (fp == NULL) 
    { 
     puts ("Cannot open source file"); 
    } 

    /*count the number of lines*/ 
    int lines=1; 
    char c,junk; 
    while((c = fgetc(fp)) != EOF) 
    { 
     if(c == '\n') 
      lines++; 
    } 
    printf("lines= %i\n",lines); 

    double matrix[lines][100]; 
    for(i = 0 ; i < lines ; i++) 
    { 
     j = 0; 
     do{ 
      fscanf(fp, "%lf", &matrix[lines][j]); 
      j++; 
     }while((junk = fgetc(fp)) != '\n'); 
    } 
} 

マトリックス:

0.5000 0.4600 0.6400 0.3600 0.5000   0 0.4900 0.2200 1 
    0.5300 0.5600 0.4900 0.4600 0.5000   0 0.5200 0.2200 1 
    0.5200 0.5300 0.5800 0.6900 0.5000   0 0.5000 0.2200 1 
    0.6700 0.6200 0.5400 0.4300 0.5000   0 0.5300 0.2200 1 
    0.4500 0.5700 0.3000 0.1700 0.5000   0 0.5100 0.2200 3 
    0.6800 0.5300 0.4400 0.3100 0.5000   0 0.5100 0.2200 1 
    0.3800 0.4200 0.3100 0.3500 0.5000   0 0.5200 0.2200 3 
    0.4800 0.4600 0.5800 0.2600 0.5000   0 0.4400 0.2200 2 
    0.4500 0.3900 0.4600 0.2900 0.5000   0 0.4200 0.2200 1 
    0.7800 0.7500 0.4000 0.2800 0.5000   0 0.5300 0.2200 1 
    0.7400 0.8900 0.3200 0.2400 0.5000   0 0.5400 0.3200 4 
    0.2100 0.4100 0.5500 0.1100 0.5000   0 0.5000 0.2700 7 
    0.3500 0.5600 0.3600 0.3000 0.5000   0 0.5300 0.2500 3 
    0.8000 0.7300 0.4700 0.1900 0.5000   0 0.4900 0.2200 4 
    0.7600 0.7600 0.3500 0.2700 0.5000   0 0.4400 0.2200 4 
    0.3800 0.4000 0.5300 0.1200 0.5000   0 0.5500 0.2200 7 
    0.6500 0.6300 0.4700 0.2200 0.5000   0 0.5200 0.2700 7 
    0.4100 0.4900 0.5500 0.1300 0.5000   0 0.5500 0.2200 7 
    0.5300 0.5100 0.5100 0.1100 0.5000   0 0.4900 0.4100 2 
    0.8500 0.8500 0.3000 0.3100 0.5000   0 0.5500 0.4200 4 
    0.6100 0.4800 0.5600 0.1900 0.5000   0 0.5300 0.3100 7 
    0.5500 0.6900 0.5100 0.1200 0.5000   0 0.5100 0.2200 7 
    0.4900 0.4000 0.5800 0.2300 0.5000   0 0.4700 0.2700 7 
    0.5600 0.5700 0.6300 0.3900 1   0 0.5900 0.4000 2 
    0.4500 0.5000 0.5700 0.2900 0.5000   0 0.4400 0.1100 7 
    0.3200 0.4400 0.5400 0.2100 0.5000   0 0.4000 0.1900 7 
    0.7500 0.6700 0.5100 0.2900 0.5000   0 0.5200 0.3600 1 
    0.6300 0.5400 0.5300 0.2700 0.5000   0 0.4900 0.2200 7 
+1

あなたはint型のC ' 'に変更する必要があります。ここでは

は修正版です。 'char'は' EOF'を保持することはできませんが、 'int'は保持します。 –

+0

また、私のプログラムを使用してデータをインポートする方法。そのデータをインポートしようとすると、無限ループになります。 – Kobe00992

+2

'while((c = fgetc(fp))!= EOF)'はファイル全体を読み込み、 'fp'はファイルの最後を指します。したがって、後続の 'fscanf'が読むことはありません。 'rewind'を呼び出してファイルの先頭に戻ります。 'fscanf'と' fgetc'を混在させないことをお勧めします。あなたが非常に慎重でなければ、彼らはお互いに干渉するので、災害のレシピです。 – kaylum

答えて

0

あなたは全体のラインを読むためにfgets()を使用して、あなたがの形式を知っているときにsscanf()を使用することができます個々の行。この場合、1行あたりのエントリ数は不明なので、strtok()を使用して各行をトークンに分割することができます。各行のトークンの数を数えることができます。これが変化すると、警告やその他のエラー処理を行うことができます。

このコードは完璧ではありませんが、動作させるために適応しています。 atof()関数を使用して、文字列トークンをdoubleの値に解析します。エラーチェックが可能なので、strtod()を使用する方が良いでしょうが、atof()は使いやすく、ここでは使用されています。

元のコードはcharとしてcがあったが、EOFを保持することが期待されるので、それは、intなければなりません。また、ファイルの最初のパスの後に行数をカウントするには、fprewind(fp)のファイルの先頭にリセットする必要があります。また、プログラムの最後にmatrixの内容を表示するコードを追加しました。

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(int argc, char* argv[]) 
{ 
    FILE *fp; 
    int i,j; 

    if (argc < 2) { 
     printf("Usage: %s filename\n", argv[0]); 
     exit(EXIT_FAILURE); 
    } 

    fp = fopen(argv[1],"r"); 
    if (fp == NULL) 
    { 
     puts ("Cannot open source file"); 
    } 

    /*count the number of lines*/ 
    int c, lines=1;     // changed c to int 
    while((c = fgetc(fp)) != EOF) 
    { 
     if(c == '\n') 
      lines++; 
    } 
    printf("lines= %i\n",lines); 

    rewind(fp);      // back to start of file 

    /* Read file in a line at a time */ 
    char buffer[1000]; 
    char *token; 
    double matrix[lines][100]; 
    int columns = 0; 
    i = 0; 
    while (fgets(buffer, sizeof(buffer), fp) != NULL) { 
     j = 0; 
     /* Parse each line with strtok() and atof() */ 
     token = strtok(buffer, " \n"); 
     while (token) { 
      matrix[i][j] = atof(token); 
      ++j; 
      token = strtok(NULL, " \n"); 
     } 
     if (columns == 0) { 
      columns = j; 
     } else if (columns != j) { 
      fprintf(stderr, "Inconsistent column dimension in row %d\n", i); 
     } 
     ++i; 
    } 

    /* Display results */ 
    for (i = 0; i < lines; i++) { 
     for (j = 0; j < columns; j++) { 
      printf("%8.5g", matrix[i][j]); 
     } 
     putchar('\n'); 
    } 
    putchar('\n'); 

    return 0; 
} 
関連する問題