2010-12-16 5 views
0

Je dispose d'un fichier texte qui ressemble à ceci:lecture et le stockage ints avec scanf en C

1 2 4 
3 5 2 
9 7 6 
4 2 6 

d'une taille inconnue jusqu'à 50 lignes.

Je suis en train de stocker les ints dans un tableau de struct

typedef struct column{ 
int col_1; 
int col_2; 
int col_3; 
} column; 

J'ai créé le tableau de la colonne de stuct

column column[50]; 

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


FILE * myfile; 
int i = 0; 

if ((myfile = fopen("/home/numbers.txt","r"))==NULL) 
{ 
    printf("File %s not found\n", "/home/numbers.txt"); 
    exit(0); 
} 
if ("/home/numbers.txt" == NULL) 
{ 
    printf("There was an error reading %s", "/home/numbers.txt"); 

} 

while(fscanf(myfile,"%d %d %d", &column[i++].col_1, &column[i].col_2, &column[i].col_3) == 3) 
{ 
    printf("\n%d %d %d", column[i].col_1, &column[i].col_2, &column[i].col_3); 
} 

Je reçois une liste de numéros comme celui-ci

-420921 -420924 -420927 

Il semble qu'il y ait des adresses de mémoire, car ce ne sont évidemment pas les numéros réels.

Mon problème est le get les ints plutôt que certains nombres plutôt aléatoires, j'ai essayé & avant les variables dans le printf, et cela n'a pas fonctionné, et l'inverse.

Votre aide serait grandement appréciée.

+0

liés à la fonction des arguments et commande: http://stackoverflow.com/questions/4401104/strange-printf-behaviour –

Répondre

2
if ("/home/numbers.txt" == NULL) 

... ne sera jamais vraie.

Essayez de changer votre boucle un peu:

while(i < 50 && fscanf(myfile,"%d %d %d", &column[i].col_1, &column[i].col_2, &column[i].col_3) == 3) 
{ 
    printf("\n%d %d %d", column[i].col_1, column[i].col_2, column[i].col_3); 
    i++; 
} 

... comme il est, vous incrémentez votre comptoir tandis que les arguments à scanf sont déterminés, en passant, qui sait quoi.

+0

« vous » re incrémenter votre compteur après la lecture de la première valeur, et ne pas lire dans le bon index pour le reste. " Pas vraiment. Rien ne sera lu avant l'appel de la fonction, et c'est après que les arguments ont été évalués. Ce n'est donc pas après la lecture de la première valeur. Mais l'ordre d'évaluation n'est pas spécifié, donc vous avez raison de dire que les deux autres entiers ne peuvent pas être lus en utilisant l'index incorrect –

+0

@Paul: oui, bien sûr. Ta. – sje397

+0

Merci! C'est toujours les choses simples! – user476145

0

choses nombreuses mal ici - ce:

if ("/home/numbers.txt" == NULL) 
{ 
    printf("There was an error reading %s", "/home/numbers.txt"); 

} 

ne se font pas quelque chose de sensé - se débarrasser de celui-ci. et votre code de boucle a un comportement indéfini. Incrémentez votre index dans le corps de la boucle après avoir imprimé les valeurs que vous avez lues.

0

il semble être un peu de mémoire adresses, car ils ne sont évidemment pas les chiffres réels.

C'est parce que vous imprimez les adresses!

printf("\n%d %d %d", column[i].col_1, &column[i].col_2, &column[i].col_3); 

(en dehors de col_1, vous/re imprimer l'adresse)

+0

Bon obtenir ....... – sje397