2012-02-09 5 views
1

J'essaie de créer un programme C++ qui me permet de lire à partir d'un fichier et trouver une correspondance d'une entrée de chaque ligne. Notez que chaque ligne est un enregistrement unique délimité par une virgule. Si une correspondance a été trouvée, la sortie attendue sera une chaîne d'un enregistrement.C++ lu à partir des fichiers et des données tokenize

Par exemple: les données du fichier =>

andrew, andy, Andrew Anderson
jade, blasé, Jade Sonia Lame

entrée => jade

sortie => blasé

Comment est-ce que je peux faire ceci? J'essaye de mettre en application strtok, mais en vain. Jusqu'à présent, je n'obtiens pas de bons résultats. Quelqu'un pourrait m'aider avec ça?

EDIT

en ce qui concerne ce problème, je pense que je reçois quelque part ... mais encore les plantages d'écran de sortie lorsque je l'exécute. ceci est mon code

#include <iostream> 
#include <fstream> 
#include <string> 
using namespace std; 

main() { 
// string toks[]; 
    char oneline[80],*del; 
    string line, creds[4]; 
    int x = 0; 
    ifstream myfile; 
    myfile.open("jake.txt"); 
    if (myfile.is_open()) 
    { 

    while (!myfile.eof()) 
    { 
    getline(myfile,line); 
    strcpy(oneline,line.c_str()); 
    del = strtok(oneline,","); 
    while(del!=NULL) 
    { 
    creds[x] = del; 
    del = strtok(NULL,","); 
    x++; 
    } 
    } 
    myfile.close(); 
} 
    else 
    cout << "Unable to open file"; 

    system("pause"); 
} 

quelqu'un peut-il faire la lumière sur ceci pour moi s'il vous plaît?

EDIT ....

J'ai quelques progrès sur celui-ci ... le problème est maintenant que lorsque l'entrée est adaptée à la ligne suivante, il se bloque ...

#include <iostream> 
#include <fstream> 
#include <string> 
using namespace std; 

main() { 
// string toks[]; 
    char oneline[80],*del; 
    string line, creds[3], username, password; 
    int x = 0; 
    cout<<"Enter Username: "; 
    cin>>username; 
    cout<<"Enter Password: "; 
    cin>>password; 
    ifstream myfile; 
    myfile.open("jake.txt"); 
    if (myfile.is_open()) 
    { 

    while (!myfile.eof()) 
    { 
    getline(myfile,line); 
    strcpy(oneline,line.c_str()); 
    del = strtok(oneline,","); 
    while(del!=NULL) 
    { 
    creds[x] = del; 
    del = strtok(NULL,","); 
    ++x; 
    } 
    if((creds[0]==username)&&(creds[1]==password)) 
     { 
     cout<<creds[2]<<endl; 
     break; 
     } 
    } 
    myfile.close(); 
    } 
    else 
    cout << "Unable to open file"; 

    system("pause"); 
} 

Quelqu'un peut-il m'aider s'il vous plaît?

+1

Vous devriez accepter de bonnes réponses – zeller

+0

Avez-vous besoin d'être préoccupé par les virgules dans un champ lui-même? (Comme surnom, "nom, prénom", deuxième prénom) – Dan

+0

Ça me sent le devoir de programmation. –

Répondre

3

Vous pouvez utiliser boost tokenizer pour cela:

#include <boost/tokenizer.hpp> 
typedef boost::char_separator<char> separator_type; 

boost::tokenizer<separator_type> tokenizer(my_text, separator_type(",")); 

auto it = tokenizer.begin(); 
while(it != tokenizer.end()) 
{ 
    std::cout << "token: " << *it++ << std::endl; 
} 

Voir aussi getline pour analyser une ligne à la fois d'un fichier.

+0

hmmmmm .... est-il possible de ne pas utiliser les fichiers d'en-tête externes? En fait, je le fais dans le feu ... –

0
int main() 
{ 
    ifstream file("file.txt"); 
    string line; 
    while (getline(file, line)) 
    { 
     stringstream linestream(line); 
     string item; 
     while (getline(linestream, item, ',')) 
     { 
      std::cout << item << endl; 
     } 
    }  
    return 0; 
} 
Questions connexes