2015-07-09 15 views
5

Desidero rendere il progetto della console che legge il file in base ai numeri. Esempio: scoperta dai numeri e IT solo stampe a righe console di testo da cartella che contiene i numeriC++, lettura righe file in base ai numeri

bibi    ceki  1  2 
hasesh    cekiii  1  3 
    krki     cko  1  2 

In questo caso sarebbe solo stampare "bibi ceki" e "Krki CKO". Nel mio codice ci sono molte cose mancanti. Non ho un ciclo che controlla se ci sono numeri giusti, ma qui è meglio che potessi fare e che cosa ho provato:

#include <fstream> 
#include <iostream> 
#include <string> 
#include <stdio.h> 
#include <stdlib.h> 
using namespace std; 

int main() { 
    char str1[10], str2[10]; 
    int raz, ode; 
    ifstream infile("file.txt"); 
    while (infile.good()) { 
     fscanf(infile, "%s %s %d %d", str1, str2, &raz, &ode); //this thing cant be used lik this 
     while(raz==1 && ode==2) { 
      string sLine; 
      getline(infile, sLine); 
      cout << sLine << endl; 
     } 
    } 
    infile.close(); 
    return 0; 
} 

Come si può vedere la linea con fscanf non funziona e non lo faccio sapere cosa fare lì.

Ho bisogno di aiuto e suggerimenti se c'è un modo migliore per farlo, e per favore sii specifico il più possibile, sono nuovo in C++/c.

risposta

7

Si sta mescolando la funzione C fscanf e C++ ifstream.

avrei suggets utilizzando C++ e in questo caso è possibile utilizzare operatore >> come questo:

std::string str1, str2 ; 
... 
//substitute the following line with the one below 
//fscanf(infile, "%s %s %d %d", str1, str2,&raz,&ode); 
infile >> str1 >> str2 >> raz >> ode ; 
+1

Quando si parla di C++ è bello vedere effettiva C++ in uso . Bello! – tadman

+0

sì, hai ragione, stavo usando C prima di iniziare con C++. Non chiama più l'errore, ma non stampa linee. Grazie – kuki

+0

Stampa qualcosa? Riesci a vedere cosa ottieni con un debugger? Oppure basta aggiungere uno std :: cout << str1 << "" << str2 << "" << raz << "" << ode << std :: endl; per vedere cosa ottieni ... – marom

4

Si può leggere riga per riga usando std::getline fino partite di codice e quando lo fa, si può push_back i nomi in un std::vector. È inoltre possibile strutturare il file con un delimitatore, ad esempio '|' in modo da leggere fino a quel carattere per i nomi e il resto per i codici. file di esempio potrebbe essere:

bibi ceki|1 2 
hasesh cekiii|1 3 
krki cko|1 2 

Ecco un esempio di come si potrebbe raggiungere questo obiettivo:

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

using namespace std; 

int main() 
{ 
    ifstream in_file("file.txt", ios::in); 
    vector<string> vec; 
    string names; // store names like: "bibi ceki" 
    string codes; // store codes like: "1 2" 

    while (getline(in_file, names, '|')) { 
     getline(in_file, codes, '\n'); 
     if (codes == "1 2") 
      vec.push_back(names); 
    } 

    for (unsigned int i = 0; i != vec.size(); ++i) 
     cout << vec[i] << endl; 

    in_file.close(); 
} 

uscita:

bibi ceki 
krki cko 
+0

Ho qualche strano errore. ** errore: i cicli 'for' basati su intervallo non sono consentiti in modalità C++ 98 | **. Penso che funzionerà, ho solo bisogno di correggere questo errore. – kuki

+0

@kuki, puoi usare un normale ciclo for, ho modificato la risposta per usarlo. L'intervallo basato sul ciclo funziona quando compilato con '-std = C++ 11' –

+0

Grazie per il tuo impegno, sembra che ho scoperto un'altra soluzione che funziona bene con il mio tipo di file txt. – kuki