2016-06-20 1 views
-4

Actuellement, je suis en utilisant le code ci-dessous pour lire une variable d'un fichier texte comme celui-ci:obtenir une ligne jusqu'à | dans iostream

12345 | 54321 | TAN Ah Kow | M | 12 Jalan 3/45 KL | Wilayah P | 012 -3456789 | 5000,00

Le code est

getline(infile,id,'|'); 
getline(infile,pw,'|'); 
getline(infile,name,'|'); 
getline(infile,gender,'|'); 
getline(infile,address,'|'); 
getline(infile,state,'|'); 
getline(infile,phone,'|'); 
getline(infile,balance,'|'); 

est-il une meilleure façon de le faire?

+1

Que voulez-vous dire par mieux? – NathanOliver

+1

Question basée sur l'opinion primaire et pas clair ce que vous demandez. –

+2

S'il vous plaît clarifier "mieux": efficacité, lisibilité, robuste, portable, etc. –

Répondre

1

Jetez un oeil à Boost tokenizer. Ils ont une section dédiée qui explique comment lire les jetons séparés par des délimiteurs: char_separator.

La classe char_separator rompt une séquence de caractères en jetons basés sur le caractère délimiteurs beaucoup de la même manière que strtok() ne (mais sans tous les maux de non-réentrée et la destruction de la séquence d'entrée ) .

La classe char_separator est utilisée conjointement avec le token_iterator ou tokenizer pour effectuer la segmentation.

L'exemple ci-dessous à partir de la documentation que vous montre comment lire des données délimitées par ,, - ou |. Vous pouvez facilement l'adapter pour utiliser vos délimiteurs et vos entrées.

// char_sep_example_1.cpp 
#include <iostream> 
#include <boost/tokenizer.hpp> 
#include <string> 

int main() 
{ 
    std::string str = ";;Hello|world||-foo--bar;yow;baz|"; 
    typedef boost::tokenizer<boost::char_separator<char> > 
    tokenizer; 
    boost::char_separator<char> sep("-;|"); 
    tokenizer tokens(str, sep); 
    for (tokenizer::iterator tok_iter = tokens.begin(); 
     tok_iter != tokens.end(); ++tok_iter) 
    std::cout << "<" << *tok_iter << "> "; 
    std::cout << "\n"; 
    return EXIT_SUCCESS; 
} 

La sortie est: <Hello> <world> <foo> <bar> <yow> <baz>

+0

Haha. Je l'ai juste raté. – Quirk

1

Avez-vous rencontré ..... Boost.Tokenizer? La classe Boost Tokenizer vous facilitera la vie en segmentant la chaîne en fonction d'un ensemble spécifique de délimiteurs. Si vos données sont bien définies , vous savez exactement ce que chaque jeton représente.

Par exemple (11 C++):

#include <iostream> 
#include <string> 
#include <boost/tokenizer.hpp> 

using namespace std; 
using namespace boost; 

int main(int, char**) 
{ 
    string text = "12345|54321|TAN Ah Kow |M|12 Jalan 3/45 KL |Wilayah P|012-3456789|5000.00"; 

    char_separator<char> sep("|"); 
    tokenizer<char_separator<char>> tokens(text, sep); 
    for (const auto& t : tokens) { 
     // do your thing 
    } 
} 

Vos données sont bien définie si:

  1. Vos données maintient la même structure pour la gamme considérable d'entrée .
  2. Vous pouvez définir la structure correctement.