2010-12-14 9 views
0

J'utilise getline lire jusqu'à la fin de saut de ligne, mais C++ getline me fait des choses jusqu'à ce que l'espace,getline en C++ - Besoin d'aide

J'ai txt les données du fichier en tant que

adresse (onglet char) 1420 Heureux Lane

Quand je

getline (lecteur, ss, '\ t') Je reçois l'adresse dans la chaîne de l'art. quand je fais getline (lecteur, ss, '\ n') je viens d'obtenir 1420.

Je veux complet "1420 Happy Lane", Comment l'obtenir?

Merci.

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

using namespace std; 
int main(int argc, char *argv[]) 
{ 
     if(argc < 2) 
     { 
       cout << "Missing filename as first argument" << "\n"; 
       exit(2); 
     } 

     vector<string> myvector; 
     string ss; 
     int i=0, j=0; 

     ifstream reader(argv[1]); 

     if (! reader) 
     { 
       cout << "Error opening input file : " << " " << argv[1] << '\n'; 
       return -1; 
     } 

     while(!reader.eof()) 
     { 
       if ((i+1) % 2 == 0) 
         getline(reader, ss, '\n'); 
       else 
         getline(reader, ss, '\t'); 
       if (ss[0] == '#') 
       { 
         //Skip 
         getline(reader,ss, '\n');i=0; 
         continue; 
       } 

       i++; 
       myvector.push_back(ss); 
     } 

     reader.close(); 

     vector<string>::iterator it; 
     stringstream stream; 
     int vecloc=1; 
     string tag; 
     string sData; 

     cout << "myvector contains: \n"; 

     for (it=myvector.begin() ; it < myvector.end(); it++) 
     { 
       switch (vecloc) 
       { 
       case 1: stream << *it; stream >> tag; vecloc++;break; 
       case 2: 
           stream << *it; stream >> sData; 
           // Do job 
           cout << tag << " " << sData << "\n"; 
           // Reset. 
           vecloc=1;  break; 
       default :  break; 
       } 
       // Clear String stream 
     stream.str(""); stream.clear(); 
     } 

     return(0); 
} 

sortie

/home/sr/UTL

chat abc.txt

hey C++ me faire des noix.

/home/sr/UTL

a.out abc.txt

myVector contient:

hey C++

Répondre

0

Je suis une fonction split() vous pouvez utiliser pour cette. Utilisez \t comme délimiteur:

void split(std::string &string, std::vector<std::string> &tokens, const char &delim) { 
    std::string ea; 
    std::stringstream stream(string); 
    while(getline(stream, ea, delim)) 
     tokens.push_back(ea); 
} 
3

Collez le code réel de votre éditeur et vérifiez qu'il n'y a pas un saut de ligne (ou peut-être d'autres inattendus caractères non-impression) dans votre fichier de données.

Cela fonctionne comme prévu ici:

#include <iostream> 
#include <sstream> 

using namespace std; 

int main() 
{ 
    stringstream reader("address\t1420 Happy Lane\n"); 

    string ss; 

    getline(reader, ss, '\t'); 
    cout << "1: " << ss << endl; 

    getline(reader, ss, '\n'); 
    cout << "2: " << ss << endl; 
} 

Sortie:

1: address 
2: 1420 Happy Lane 
+0

Non ne fonctionne pas pour moi, j'ai utilisé xlC pour compiler, mon programme et utilisé l'éditeur vi pour entrer le fichier texte approprié. – user79292

+0

Nevermind Je pense que mon code bas de la ligne utilise stringstream et c'est le coupable. – user79292

+0

@ user79292: Correct, c'est 'stream >> sData;' en faute. –

0

Vous essayez d'alterner entre l'accaparement jusqu'à un \ t et saisissant jusqu'à \ n. Mais les fois où vous trouvez une ligne de commentaires «#», votre alternance est désactivée. De loin, la façon la plus simple et la plus robuste de gérer ce genre de chose est de lire chaque ligne en premier, puis de ré-analyser la ligne.