2017-10-19 16 views
0

J'ai un fichier texte contenant string, int et double. Comme ceci:Comment lire différents types de données à partir du fichier

Asher 10 14,5

Julia 14 15,5

Je dois lire ces données à 3 tableaux distincts. C n'a pas de tableau de chaînes, j'ai donc besoin de char array, int array et double array. Mon 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]); 
} 

Mais mon code lit seulement le premier mot et l'imprime 18 fois. Comment est-ce que je peux lire la variable de chaîne et la mettre dans le tableau de caractères?

+0

Essayez de vérifier la valeur de retour de 'fscanf' – izlin

+0

' while ((c = getc (fichier))! = EOF) { fscanf (fichier, "% s% d% lf", & col_one, & col_two, & col_three) NameArray [taille] = col_one; '->' while (fscanf (fichier, "% 14s% d% lf", col_one, & col_two, & col_three) == 3 && taille BLUEPIXY

+0

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

Répondre

2

Avec

nameArray[size] = col_one; 

vous faire tous éléments de nameArray points au même endroit. Ce qui signifie qu'il semblera que toutes les chaînes sont les mêmes (et égales à la dernière chaîne que vous avez lue).

Il existe quelques solutions différentes à cela, mais celle que je recommande est d'utiliser une structure pour les données, puis un seul tableau pour cette structure. Ensuite, lisez directement dans la structure elle-même, sans utiliser de variables temporaires ou de tableaux de pointeurs.

Peut-être quelque chose comme:

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

Avec le code ci-dessus, vous aussi résoudre un autre problème, que vous avez lu et jeter le premier caractère du fichier.