2010-12-16 13 views
0

Ich habe eine Textdatei, die wie folgt aussieht:Lesen und Speichern von ints mit scanf in C

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

einer unbekannten Größe bis zu 50 Linien.

Ich versuche, die Ints in einem Array von struct zu speichern

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

ich das Array von stuct Spalte erstellt haben

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

ich eine Liste von Zahlen wie diese

-420921 -420924 -420927 
erhalten

Es scheint einige Speicheradressen zu sein, weil sie offensichtlich nicht die tatsächlichen Zahlen sind.

Mein Problem ist das Holen der INTS eher als einige ziemlich zufällige Zahlen, ich habe versucht & vor den Variablen in der printf, und das hat nicht funktioniert, und umgekehrt.

Ihre Hilfe würde sehr geschätzt werden.

+0

Argumente funktionieren und Bestellung: http://stackoverflow.com/questions/4401104/strange-printf-behaviour –

Antwort

2

... wird nie wahr sein.

Versuchen Sie, Ihre Schleife ein wenig zu ändern:

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

... wie es ist, werden Sie Ihre Zähler erhöht wird, während die Argumente zu scanf bestimmt werden, nebenbei wer-weiß-was.

+0

„Sie‘ den Zähler nach dem Lesen des ersten Wertes inkrementiert und den Rest nicht in den richtigen Index einliest. " Nicht wirklich. Nichts wird gelesen, bis die Funktion aufgerufen wird, und das nachdem die Argumente ausgewertet wurden. Es ist also nicht nachdem der erste Wert gelesen wurde. Aber die Reihenfolge der Auswertung ist nicht angegeben, so dass Sie richtig sind, dass die anderen zwei Ganzzahlen mit dem falschen Index –

+0

@Paul nicht gelesen werden dürfen oder dürfen: ja, natürlich. Ta. – sje397

+0

Danke! Es sind immer die einfachen Dinge! – user476145

0

Zahlreiche Dinge falsch hier - diese:

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

} 

nichts sinnvoll tun - es loszuwerden. und Ihr Loop-Code hat ein undefiniertes Verhalten. Inkrementieren Sie Ihren Index im Body des Loops, nachdem Sie die gelesenen Werte ausgedruckt haben.

0

scheint es einige Speicher Adressen zu sein, weil sie offensichtlich nicht die tatsächlichen Zahlen sind.

Das liegt daran, dass Sie die Adressen drucken!

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

(abgesehen von col_1, Sie/re Drucken der Adresse)

+0

Gut erhalten ....... – sje397