2017-02-02 3 views
0

Hallo, ich versuche, eine Metrik aus einer Textdatei zu importieren. Anfangs weiß ich nichts über die Matrix, also berechne ich die Anzahl der Zeilen in der Matrix und weise dann Platz zu. Wenn ich versuche die Matrix zu importieren, laufe ich in eine Endlosschleife. Ich verstehe nicht, warumImportieren Sie eine Matrix in 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'); 
    } 
} 

Matrix in Textdatei:

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

Sie müssen 'int c 'ändern. Ein 'char' kann nicht' EOF' enthalten, aber 'int' wird es. –

+0

ok. Wie importiere ich die Daten mit meinem Programm? Wenn ich versuche, diese Daten zu importieren, geht es in eine Endlosschleife. – Kobe00992

+2

'while ((c = fgetc (fp))! = EOF)' das liest die ganze Datei und lässt 'fp' auf das Ende der Datei zeigen. Also gibt es nichts für das nachfolgende 'fscanf' zu lesen. Rufen Sie 'zurückspulen 'auf, um zum Anfang der Datei zurückzukehren. Und schlage vor, dass du 'fscanf' und' fgetc' nicht mischt ... das ist nur ein Rezept für eine Katastrophe, da sie sich gegenseitig stören, wenn du nicht sehr vorsichtig bist. – kaylum

Antwort

0

Sie fgets() verwenden können ganze Zeilen zu lesen, und dann sscanf() verwenden, wenn Sie das Format der wissen einzelne Zeilen. In diesem Fall ist die Anzahl der Einträge pro Zeile unbekannt, so dass strtok() verwendet werden kann, um jede Zeile in Token zu teilen. Die Anzahl der Tokens in jeder Zeile kann gezählt werden, und wenn dies variiert, kann eine Warnung gedruckt oder eine andere Fehlerbehandlung durchgeführt werden.

Dieser Code ist nicht perfekt, aber er passt an, was Sie tun mussten, damit es funktioniert. Die atof()-Funktion wird verwendet, um ein Zeichenfolgen-Token in einen double-Wert zu analysieren. Es wäre besser, strtod() für diesen Zweck zu verwenden, da es eine Fehlerprüfung ermöglicht, aber atof() ist einfacher zu verwenden und wird daher hier verwendet.

Der ursprüngliche Code hatte c als char, aber es sollte ein int sein, da erwartet wird, EOF zu halten. Nach dem ersten Durchlauf der Datei zum Zählen der Zeilenanzahl muss fp mit rewind(fp) auf den Anfang der Datei zurückgesetzt werden. Ich fügte auch etwas Code hinzu, um den Inhalt von matrix am Ende des Programms anzuzeigen. Hier

ist die modifizierte Version:

#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; 
}