2009-05-04 2 views
1

Ich habe eine Textdatei mit einer Zeile wie:Eingabe von TXT-Datei auf Arrays

James Dean   10 Automotive  27010.43 

und ich brauche diese Datei zu lesen und zu jedem der vier oben in Arrays setzen.

char nameArray[MAX][NAME_MAX]; 
int yearArray[MAX]; 
char departmentArray[MAX][DEP_MAX]; 
double payArray[MAX]; 


while(i < MAX && infile) { 

     infile.getline(nameArray[i], 20); 
     infile >> yearArray[i]; 
     infile.getline(departmentArray[i], 15); 
     infile >> payArray[i]; 

     cout << nameArray[i] << " " << yearArray[i] << " " << departmentArray[i] << " " << fixed << setprecision(2) << payArray[i] << endl; 
     i++; 
    } 

Der Code wird nur abgeholzt Sie eine Vorstellung davon zu geben, was ich zu tun versucht, aber wenn ich diese laufen, bekomme ich so etwas wie:

James Dean   -858993460 -92559631349317830000000000000000000000000000 
000000000000000000.00 

Danke für die Hilfe.

==== bearbeiten ========================================= =

Ich wechselte von getline zu bekommen, danke dafür. Ich muss verwenden und nicht >> weil einige der Zeilen, die ich lese, mehr sind als nur "James Dean", sie sind bis zu 20 char lang ... ex: "William K. Woodward" ist ein anderer.

Also, wenn ich nur get, dann liest es die erste Zeile in Ordnung, aber dann bekomme ich den gleichen verpatzten Text für die zweite Zeile. Hier

ist der Code:

infile.get(nameArray[i], 20); 
    infile >> yearArray[i]; 
    infile.get(departmentArray[i], 15); 
    infile >> payArray[i]; 
+0

Sie sollten ein Trennzeichen verwenden, oder verwenden Sie Tabs? Wenn Sie Leerzeichen verwenden, würde dies zu Problemen führen, wenn Sie auch Nummern für den Namen oder die Abteilung zulassen. – schnaader

Antwort

2

Die getline Funktionen nimmt einen Eingangsstrom und einen String zu schreiben. Also, zwei getline Anrufe in zwei Zeilen gelesen. Dein Eingabemechanismus ist kaputt. Verwenden Sie entweder getline oder den Stream-Extraktionsoperator (d. H. >>), aber nicht beide.

Wenn Sie planen, getline zu verwenden, müssen Sie die Zeichenfolge (die effektiv eine Zeile der Eingabe ist) in Tokes analysieren und sie dann in entsprechend typisierten Arrays speichern. Das zweite und vierte Token sind Zahlen, daher müssen Sie diese von String in int oder double konvertieren.

Der operator >> Ansatz:

string name, surname; 
int year; 
double pay; 
while (infile) { 
    infile >> name >> surname >> year >> department >> pay; 
    namearray[ i ] = name + " " + surname; 
    // ... 
    payarray[ i ] = pay; 
    ++i; 
} 

Der getline Ansatz:

string line; 
while (getline(infile, line)) { 
    parse(line, tokens); 
    namearray[ i ] = token[ 0 ] + " " + token[ 1 ]; 
    // ... 
    payarray[ i ] = strTodouble(token[ 4 ]); 
    ++i; 
} 

// parse definition 
void parse(string line, vector<string>& token) { 
    // roll your own 
} 

double strToDouble(string s) { 
    // ... 
} 
0

ich nicht sehen, wo Sie infile definieren, aber ich davon aus, dass es sich um eine ifile ist. In diesem Fall sollten Sie es genauso verwenden wie Sie cin verwenden, um Eingaben zu erhalten.

Warum machst du eine getline()? Diese Funktion wird nur bei einem '\ n' char oder einem EOF-Zeichen anhalten. Es bedeutet also, du beginnst nach dem Ende der Zeile das Int zu lesen, einige zufällige Daten.

Korrigieren Sie mich, wenn ich falsch liege, aber gibt es 20 oder 19 Zeichen in der ersten Zeichenfolge (James Dean) vor der Zahl (10)?