2017-10-19 5 views
0

Ich habe eine Textdatei, die Zeichenfolge enthält, int und double. Wie folgt aus:So lesen Sie verschiedene Arten von Daten aus Datei

Asher 10 14.5

Julia 14 15,5

Ich brauche diese Daten 3 separate Arrays zu lesen. C hat kein String-Array, also brauche ich Char-Array, Int-Array und Double-Array. Mein Code:

const int num = 18; //number of data.txt lines 
char col_one[15]; 
int col_two; 
double col_three; 
int c; 
int numberArray[num]; 
char *nameArray[num]; 
double doubleArray[num]; 
int size = 0; 
FILE *file; 
file = fopen("data.txt", "r"); 
if (file) { 
    while ((c = getc(file)) != EOF) 
    { 
     fscanf(file, "%s %d %lf", &col_one, &col_two, &col_three); 
     nameArray[size] = col_one; 
     numberArray[size] = col_two; 
     doubleArray[size] = col_three; 
     size++; 
    } 
    fclose(file); 
} 


for (int i = 0; i < num; i++) 
{ 
    printf("%s \n" ,nameArray[i]); 
} 

Aber mein Code liest nur erstes Wort und druckt es 18 mal. Wie kann ich die String-Variable lesen und in das char-Array einfügen?

+0

Versuchen Sie, den Rückgabewert von 'fscanf' – izlin

+0

' while ((c = getc (Datei))! = EOF) { fscanf (Datei "% s% d% lf", & col_one & col_two & col_three zu überprüfen); nameArray [Größe] = col_one; '->' while (fscanf (Datei, "% 14s% d% lf", col_one, & col_two, & col_three) == 3 && Größe BLUEPIXY

+0

Und' i < num;' --> 'i BLUEPIXY

Antwort

2

Mit

nameArray[size] = col_one; 

Sie machen alle Elemente nameArray Punkt auf der gleichen Stelle. Das bedeutet, dass alle Zeichenfolgen gleich sind (und der letzten gelesenen Zeichenfolge entsprechen).

Es gibt ein paar verschiedene Lösungen zu diesem Zweck, aber die, die ich empfehle, ist eine Struktur für die Daten und dann ein einzelnes Array für diese Struktur. Dann lesen Sie direkt in die Struktur selbst, ohne temporäre Variablen oder Arrays von Zeigern zu verwenden.

Vielleicht so etwas wie:

struct data 
{ 
    char name[15]; 
    int int_value; 
    double float_value; 
}; 

struct data data_array[num]; 

... 

while (fscanf(file, "%14s, %d %lf", data_array[size].name, 
            &data_array[size].int_value, 
            &data_array[size].float_value) == 3) 
{ 
    ++size; 
} 

Mit dem obigen Code, Sie lösen auch ein anderes Problem, dass Sie das erste Zeichen der Datei lesen und entsorgen.

Verwandte Themen