2010-08-24 11 views
14

dati che ho formattato come la seguente:Come leggere i dati formattati in C++?

Words   5 
AnotherWord 4 
SomeWord  6

E 'in un file di testo e sto usando ifstream di leggerlo, ma come faccio a separare il numero e la parola? La parola sarà composta solo da alfabeti e ci saranno alcuni spazi o tabulazioni tra la parola e il numero, non sicuri di quanti.

+0

io non so se si tratta di spazi o tabulazioni tra le parole e il numero, non ci saranno spazi all'interno della parola. – TheOnly92

+0

se il tuo formato di file diventa più complicato, potresti voler provare espressioni regolari per ogni linea. Boost fornisce una lib per quello. –

risposta

19

Supponendo che non ci sarà alcun spazio bianco all'interno della "parola" (allora non sarà in realtà 1 parola), ecco un esempio di come leggere fino alla fine del file :

std::ifstream file("file.txt"); 
std::string str; 
int i; 

while(file >> str >> i) 
    std::cout << str << ' ' << i << std::endl; 
+0

Cosa succede se le schede separano la parola e il numero intero? – TheOnly92

+0

@ TheOnly92 funziona solo - il separatore è uno spazio vuoto – Mark

+0

Cool, questa è la soluzione che volevo. – TheOnly92

2

In realtà è molto semplice, è possibile trovare il riferimento here
Se si utilizza schede come delimitatori, è possibile utilizzare getline invece e impostare l'argomento delim a '\ t'. Un esempio più lungo sarebbe:

#include <vector> 
#include <fstream> 
#include <string> 

struct Line { 
    string text; 
    int number; 
}; 

int main(){ 
    std::ifstream is("myfile.txt"); 
    std::vector<Line> lines; 
    while (is){ 
     Line line; 
     std::getline(is, line.text, '\t'); 
     is >> line.number; 
     if (is){ 
      lines.push_back(line); 
     } 
    } 
    for (std::size_type i = 0 ; i < lines.size() ; ++i){ 
     std::cout << "Line " << i << " text: \"" << lines[i].text 
        << "\", number: " << lines[i].number << std::endl; 
    } 
} 
+1

L'operatore '' '' legge 'std :: string'. – Donotalo

+0

@Donatalo: se si include sì. Anche se è necessario includere una stringa se si desidera utilizzare anche getline, in modo da avere un punto valido :) Modificato la mia risposta – Default

+0

In realtà, in questo caso, si leggeranno anche le stringhe con spazi bianchi (diversi da ''\ t''). Ho alcuni problemi con questo, però: 1. Devi controllare 'is' immediatamente prima di premere sul vettore. 2. Il controllo degli errori prima del ciclo deve restituire un 'int' (ed è comunque non necessario). Supponendo che li sistemerai, ho votato la tua risposta nonostante loro. – sbi

4

L'operatore >> viene sovrascritto per std::string e utilizza spazi bianchi come separatore

così

ifstream f("file.txt"); 

string str; 
int i; 
while (!f.eof()) 
{ 
    f >> str; 
    f >> i; 
    // do work 
} 
+0

Ho aggiunto 'printf ("% s =% d \ n ", str.c_str(), i);' dopo '// do work'. Stampa l'ultima riga ** due volte **. Utilizzo di MSVC9. –

+0

@AOI Karasu - sì, mi dispiace di aver letto solo la variabile in variabili funzionanti – Mark

+0

uso 'f' come una condizione di ciclo invece di'! F.eof() ' – rubenvb

2

sscanf è buono per questo:

#include <cstdio> 
#include <cstdlib> 

int main() 
{ 
    char sentence []="Words   5"; 
    char str [100]; 
    int i; 

    sscanf (sentence,"%s %*s %d",str,&i); 
    printf ("%s -> %d\n",str,i); 

    return EXIT_SUCCESS; 
}