2009-05-04 6 views
1

Je dispose d'un fichier texte avec une ligne comme:du fichier txt aux tableaux

James Dean   10 Automotive  27010.43 

et je besoin de lire ce fichier et de mettre chacun des 4 ci-dessus dans des tableaux.

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

Le code est coupé juste pour vous donner une idée de ce que je suis en train de faire, mais quand je lance cela, je reçois quelque chose comme:

James Dean   -858993460 -92559631349317830000000000000000000000000000 
000000000000000000.00 

Merci pour l'aide.

==== Modifier ========================================= =

J'ai changé de getline pour obtenir, merci pour cela. Je dois utiliser get et non >> parce que certaines des lignes que je lis sont plus que juste "James Dean", elles ont jusqu'à 20 caractères de long ... ex: "William K. Woodward" en est une autre. Donc, si j'utilise simplement get, alors il lit la première ligne in fine, mais ensuite je reçois le même texte foiré pour la deuxième ligne.

Voici le code:

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

Vous devez utiliser un délimiteur ou utilisez-vous des onglets? Si vous utilisez des espaces, cela poserait des problèmes si vous autorisez des numéros pour le nom ou le département. – schnaader

Répondre

2

Les fonctions getline prend un flux d'entrée et une chaîne à écrire. Ainsi, deux appels getline sont lus sur deux lignes. Votre mécanisme d'entrée est cassé. Soit, utilisez getline ou l'opérateur d'extraction de flux (c'est-à-dire >>) mais pas les deux.

Si vous prévoyez d'utiliser getline, vous devez analyser la chaîne (qui est en fait une ligne d'entrée) dans tokes, puis les stocker dans des tableaux typés de manière appropriée. Les deuxième et quatrième jetons sont des nombres, vous devrez donc les convertir de la chaîne à int ou double.

L'approche operator >>:

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

L'approche getline:

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

Je ne vois pas où vous définissez infile, mais je suppose qu'il est un iFile. Dans ce cas, vous devriez l'utiliser de la même façon que vous utilisez cin pour obtenir des informations.

Pourquoi faites-vous un getline()? Cette fonction s'arrêtera uniquement sur un caractère '\ n' ou sur un caractère EOF. Cela signifie donc que vous commencez à lire l'int après la fin de la ligne, des données aléatoires.

Corrigez-moi si je me trompe, mais y a-t-il 20 ou 19 caractères dans cette première chaîne (James Dean) avant le numéro (10)?

Questions connexes