2009-10-25 11 views
2

J'essaye de lire à partir du fichier: Le fichier est multiline et fondamentalement j'ai besoin de passer en revue chaque "mot". Le mot étant n'importe quoi non espace.Lecture à travers le fichier en utilisant ifstream

fichier d'entrée de l'échantillon serait:

Exemple de fichier:

essai 2d
mot 3,5
entrée
{

essai 13,5 12,3
autre {
test 145,4
}}

J'ai donc essayé quelque chose comme ceci:

ifstream inFile(fajl.c_str(), ifstream::in); 

if(!inFile) 
{ 
    cout << "Cannot open " << fajl << endl; 
    exit(0); 
} 

string curr_str; 
char curr_ch; 
int curr_int; 
float curr_float; 

cout << "HERE\n"; 
inFile >> curr_str; 

cout << "Read " << curr_str << endl; 

Le problème est quand il lit la nouvelle ligne, il se bloque juste. Je lis tout avant le test 13.5 mais une fois qu'il atteint cette ligne, il ne fait rien. Quelqu'un peut me dire ce que je fais mal? Toute meilleure suggestion sur la façon de le faire ??? J'ai essentiellement besoin de passer par le fichier et aller un "mot" (char non blanc) à la fois. I

Merci

Répondre

3

Vous ouvrez un fichier 'inFile' mais lisez de la 'std :: cin' une raison particulière?

/* 
* Open the file. 
*/ 
std::ifstream inFile(fajl.c_str()); // use input file stream don't. 
             // Then you don't need explicitly specify 
             // that input flag in second parameter 
if (!inFile) // Test for error. 
{ 
    std::cerr << "Error opening file:\n"; 
    exit(1); 
} 

std::string word; 
while(inFile >> word) // while reading a word succeeds. Note >> operator with string 
{      // Will read 1 space separated word. 
    std::cout << "Word(" << word << ")\n"; 
} 
+0

faute de frappe :) je voulais dire inFile >> en question se programme pas – grobartn

1

Je ne sais pas comment « dans l'esprit » de la bibliothèque iostream c'est, mais vous pouvez le faire avec l'entrée non formaté. Quelque chose comme:

char tempCharacter; 
std::string currentWord; 
while (file.get(tempCharacter)) 
{ 
    if (tempCharacter == '\t' || tempCharacter == '\n' || tempCharacter == '\r' || tempCharacter == ' ') 
    { 
     std::cout << "Current Word: " << currentWord << std::endl; 
     currentWord.clear(); 
     continue; 
    } 
    currentWord.push_back(tempCharacter); 
} 

Est-ce que cela fonctionne?

+1

Cela ne marchera pas parce que 'istream :: get' ne prend pas un seul' char * 'en tant que paramètre et vérifier le' fichier!. eof() 'avant d'effectuer une lecture ne fonctionne pas toujours. En outre, vous comparez les littéraux de caractères larges à un objet étroit de type 'char' (ces types ne sont pas compatibles). Je vais l'éditer pour que vous le corrigiez. – 0x499602D2

+0

@ 0x499602D2: Merci d'avoir corrigé ça :) –