2016-11-27 2 views
0

J'essaye de classer les informations d'entrée d'un fichier .txt qui a trois entrées i.e (Mike Jones 60) et les insérant dans une structure C++ à utiliser pour ma sortie à l'écran.Pourriez-vous s'il vous plaît vérifier si mon code est correct pour enregistrer la chaîne à struct?

struct Person { 
    string name; 
    int age; 
}; 
void addData() 
{ 
    Person aPerson; 
    char fileName[80]; 
    cout << "Please enter the file name: "; 
    cin.getline(fileName, 80); 
    //string fullName; 
    ifstream fin(fileName); 
    string tmp; 
    stringstream ss; 
    while (!fin.eof()) { 
     getline(fin, aPerson.name); 
     aPerson.name = tmp; 
     getline(fin, tmp); 
     ss << tmp; 
     ss >> aPerson.age; 
     ss.clear(); 
     getline(fin, tmp); 
     ss.clear(); 
     cout << aPerson.name << aPerson.age << endl; 
    } 
} 
+0

Vous ne faites rien avec la structure 'Person' - allez-vous étendre cela pour stocker un conteneur de' Person's à un moment donné? Sinon, vous pouvez éliminer le 'struct' et simplifier un peu le code. –

+2

L'outil correct pour une telle tâche est un débogueur, ne demandant pas aux gens au hasard de vérifier l'exactitude de votre code. Il vous sera utile de lire [Comment déboguer de petits programmes] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). – StoryTeller

Répondre

1

Ce code lire les données dans ce format:

Joe Bloggs 
42 

Franziska von Karma 
23 

Jeff Jefferson 
84 

Est-ce que vos données d'entrée ressemble?

Si c'est une ligne par personne, et chaque personne a exactement deux mots en leur nom, vous pouvez utiliser le third parameter of getline to set a custom delimiter - au lieu de lire la ligne, il va lire jusqu'à ce qu'il atteigne un espace.

Joe Bloggs 42 
Jeff Jefferson 84 
Amy Anderson 57 

Pour traiter ces données:

… 
while (!fin.eof()) { 
    string firstname; 
    getline(fin, firstname, ' '); 
    string surname; 
    getline(fin, surname, ' '); 
    aPerson.name = firstname + " " + surname; 
    string age; 
    getline(fin, age); 
    ss << age; 
    ss >> aPerson.age; 
    cout << aPerson.name << aPerson.age << endl; 
    ss.clear(); 
} 

Si vous pouvez obtenir les données au format de données séparées par des virgules ou des tabulations séparés, ou quoi que ce soit-thats-not-a-espace séparé, vous pouvez utiliser ce délimiteur et extraire les données en deux étapes, pas trois.

+0

Cela fonctionne comme un charme. THank you, question Si je voulais appeler simplement le nom de famille et l'âge dans une fonction, je devrais convertir int en chaîne? Si oui, comment ferais-je cela? C++ 5.1. Je vous remercie. – fsfh60

+0

Je ne comprends pas complètement ... si vous avez l'âge dans votre programme en tant que «int», il pourrait aussi bien rester comme un «int»! –

+0

nvm Je l'ai appelé dans une autre fonction en tant que aPerson.age Cela provoquerait une erreur. Mais il n'a pas encore remercié. – fsfh60