2015-11-06 5 views
1

J'ai un fichier au format: FirstName, MiddleName, LastName, Major, Ville, État, GPAC++ lecture dans un fichier, en ignorant des virgules et la sortie de données à l'écran

Je suis en train de lire le fichier et sortir les données sans les virgules à l'écran. Voilà ce que j'ai jusqu'à présent, mais il ne conserve que GPA:

#include <fstream> 
#include <iostream> 
#include <string> 
#include <sstream> 

using namespace std; 
int main(){ 
    string fileline; 
    string word; 
    ifstream studentData; 
    studentData.open("studentData.csv"); 
    while(studentData){ 
     getline(studentData,fileline); 
     istringstream ss(fileline); 
     while(getline(ss, word,','));{ 
      cout << word << '\n'; 

     } 

    } 
    return(0); 
} 
+0

Utilisez 'getline' dans' while'. Vous l'avez fait pour la seconde (mais avec un séjour ';') mais pas la première boucle. –

Répondre

1

Je pense que le problème est cette ligne:

while(getline(ss, word,','));{ 

Essayez de supprimer le point-virgule. Ce serait la bonne façon:

while(getline(ss, word,',')){ 

Le fait virgule la boucle ne rien faire jusqu'à ce qu'il lit le dernier mot (que je suppose est le GPA), que vous pouvez ensuite imprimer. Faites-nous savoir si cela fonctionne!

+0

Cela a fait l'affaire. Actuellement, il imprime chaque mot sur sa propre ligne. J'essaye de comprendre comment imprimer seulement à une nouvelle ligne une fois que j'atteins la fin d'une ligne, ainsi elle imprimerait 7 mots alors commencerait une nouvelle ligne. Des conseils? –

+0

Oui. C'est l'impression d'une nouvelle ligne à cause du \ n à la fin de cout. Pour imprimer avec des espaces, vous pouvez faire quelque chose comme ceci: while (getline (ss, word, ',')) { cout << mot << ""; // Imprimer un espace au lieu d'une nouvelle ligne } cout << "\ n"; // Et seulement ensuite j'imprime la fin de la ligne –

+0

Je veux sortir les données dans le même format que celui dans lequel elles commencent, juste sans virgules. Si je fais '' au lieu de '\ n', il mettra tous les mots qu'il trouvera les uns à côté des autres. (J'aurais dû mentionner que le fichier d'entrée a environ 27 lignes). donc je veux imprimer 7 mots puis rincer et répéter –

0

Si vous voulez juste copier sans virgules, pourquoi ne pas simplement copier sans virgules?

ifstream studentData("StudentData.csv"); 

studentData >> noskipws; 

std::remove_copy(std::istream_iterator<char>(studentData), 
       std::istream_iterator<char>(), 
       std::ostream_iterator(std::cout) 
       ','); 

OTOH, si votre entrée n'a rien qui sépare les champs sauf les virgules, cela produira une sortie avec eux fonctionnent tous ensemble. Vous préférez peut-être d'écrire un espace entre les champs à la place:

std::transform(std::istream_iterator<char>(studentData), 
       std::istream_iterator<char>(), 
       std::ostream_iterator<char>(std::cout), 
       [](char ch) { return ch == ',' ? ' ' : ch; }); 

De cette façon, vous avez toujours quelque chose pour aider à garder une trace de où se termine sur le terrain et le suivant commence. Bien sûr, si vous préférez, disons, un onglet plutôt qu'un espace, vous pouvez changer l'espace en onglet.

0

Le point-virgule en while(getline(ss, word, ','); ne devrait pas être présent. Cela dit, les chaînes sont lentes, je préférerais faire comme suit.

while(std::getline(studentData, fileline)) { 
    std::erase(std::remove(fileline.begin(), fileline.end(), ','), fileline.end()); 
    std::cout << fileline << '\n'; 
}