2010-11-06 47 views
0

J'ai travaillé sur une affectation de classe pour C++ et nous devons acquérir des entrées à partir d'un fichier texte et affecter ces valeurs à un tableau .... l'une est une chaîne, la deuxième un int, et le troisième un double.Utilisation de plusieurs instances de getline en C++

Nous avons seulement été introduits dans les tableaux et je ne sais pas encore quoi que ce soit à propos des pointeurs ou des listes chaînées, ou des trucs haut de gamme, donc je me sens un peu limité dans mes options. J'ai travaillé toute la journée à essayer de trouver un moyen d'acquérir des entrées à partir du fichier texte et de l'assigner au tableau approprié. J'ai essayé d'utiliser getline pour lire le fichier d'entrée et définir un délimiteur pour séparer chaque élément de données, mais j'obtiens une erreur lorsque j'essaie de l'utiliser plus d'une fois. D'après ce que j'ai lu, cela a à voir avec la façon dont je surcharge la fonction, mais je n'arrive pas à la résoudre. Chaque explication que j'ai lu à ce sujet dépasse mon niveau actuel de familiarité. En ce moment, je suis concentré sur ce fragment de code:

for (int i = 0; i < EMP_NUM; i++) // Get input from text file for names. 
    getline(inFile, nameAr[i], '*'); 

for (int i = 0; i < EMP_NUM; i++) // Input for hours. 
    getline(inFile, hoursAr[i], '*'); 

for (int i=0; i < EMP_NUM; i++) // Input for hourly rate. 
    getline(inFile, hrateAr[i], '*'); 

Je suis en train d'utiliser getline trois fois et écrire les données sur trois tableaux distincts, puis faire une série de calculs avec eux plus tard et les sorties à un autre fichier texte. La première instance de getline ne produit aucune erreur de compilation mais les deux derniers le font. Je ne suis pas tout à fait sûr d'une autre solution pour obtenir les données dans mes tableaux, donc je suis à perte. Toute aide est la bienvenue!

+1

Comment regarder un fichier d'entrée? – wilhelmtell

+0

Nous sommes libres de construire le fichier d'entrée comme nous le souhaitons, à condition qu'il contienne toutes les données correctes. Je l'ai arrangé de sorte qu'il contienne trois lignes, une avec un ensemble de noms, l'autre avec des heures, et la troisième avec des taux horaires. Les noms ont une initiale et un nom de famille, suivis d'un astérisque qui sert de délimiteur. Par exemple: J. Doe * J. Doe * ..... Les deux dernières lignes sont simplement des nombres simples séparés par des espaces. J'ai choisi d'utiliser un délimiteur avec la première ligne puisque le premier nom et le premier nom incluent tous deux un caractère d'espace. – Strata

Répondre

0

1) Au lieu de trois différentes itérations, utilisez seulement un

2) objet chaîne passe en getline au lieu des pointeurs

string buf; 
for (int i = 0; i < EMP_NUM; i++) // Get input from text file for names. 
{ 
    getline(inFile, buf, '*'); 
    nameAr[i] = buf; 
    getline(inFile, buf, '*'); //assuming delimiter is again * 
    hoursAr[i] = atoi(buf.c_str()); //C way to doing it...however in c++ u have to use stringstreams.... 
    getline(inFile, buf); 
    hrateAr[i] = atof(buf.c_str());; 
} 
1

Si je comprends bien, vous avez simplement trois valeurs dans un fichier: une chaîne, un int et un double. Je suppose qu'ils sont délimités par des espaces.

Si tel est le cas, vous n'avez pas besoin de std::getline(). Au contraire, utiliser l'opérateur d'extraction:

std::ifstream file("input.txt"); 
std::string s; 
if(! (file >> s)) { // a single word extracted from the file 
    // failure 
} 
int n; 
// ... 
0

Que disent les erreurs du compilateur ? Êtes-vous sûr que l'erreur est causée par getline? Peut-être que ce n'est pas parce que les appels getline mais à cause de plusieurs déclarations de i.

+0

'i' est une variable de boucle dans le code affiché, et sa portée doit être limitée à la boucle for dans laquelle elle a été déclarée. Dans ce cas (sans accolades), la ligne en dessous à chaque fois. – rubenvb

+0

Oui, comme vous l'avez indiqué correctement: Il * devrait * être limité à la boucle 'for' dans laquelle il a été déclaré. Mais il existe des compilateurs qui ajoutent ces variables à la portée dans laquelle la boucle' for' se produit et non à 'boucle elle-même seulement. Comme nous ne connaissons pas le compilateur utilisé, nous ne pouvons pas exclure un tel comportement. – Flinsch

+0

Les deuxième et troisième tableaux sont 'int' et' double'. Ni 'hourAr [i]' ni 'hrateAr [i]' ne sont des arguments valides pour 'getline', donc je suppose que le problème est là. Cela fait assez longtemps que j'ai vu un compilateur avec la boucle cassée (VC6?) –