2016-07-16 2 views
0

Je voudrais poser des questions sur mon problème, j'ai essayé de lire Getline et EOF Question, mais n'a pas aidé.getline et test EOF à la fois

Problème est je ne sais pas où pourrait être erreur ici: Y at-il un problème avec la fonction utilisée (getline ou vérification EOF)?

S'il n'y a pas de texte dans le fichier text.txt, il est indiqué que quelque chose a été trouvé. Mais je n'ai aucune idée pourquoi ou où j'ai fait une erreur ...

Ce que je veux est: Recherche de chaîne et s'il n'y a pas de texte dans le fichier txt je veux dire EOF ou quelque chose. Il dit encore - même si le fichier est vide - chaîne que je cherchais a été trouvé en ligne une position un - par exemple

Je Puting il code:

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

using namespace std; 

int openFile(void); 
int closeFile(void); 
int getTime(void); 
int findTime(); 
int findDate(); 
int stringFind(string); 
bool getOneLine(void); 

string what; 
bool ifound = false; 
string foundstring; 
string filename ; 
fstream inputfile; 
string sentence ; 
size_t found ; 
string foundTime ; 
string foundDate ; 
bool timeIsHere = false; 
bool dateIsHere = false; 

int iterTime = 0; 
int iterDate = 0; 
int line = 0; 


int main (void){ 
    sentence.clear(); 

    cout << " Enter the file name:" << endl; 

    openFile(); 


    while (getOneLine() != false) { 
     stringFind("Time"); 
    } 




    cout << "END OF PROGRAM" << endl; 
    system("PAUSE"); 
    ///getTime(); 
    closeFile(); 


    system("PAUSE"); 
} 


int closeFile(void) { 
    inputfile.close(); 
    cout << " File: " << filename << " - was closed..."; 
    return 0; 
} 

int openFile(void) { 

    cout << " Insert file name in program directory or full path to desired file you want to edit:"<<endl; 
    cout << " Do not use path with a space in directory address or filename ! " << endl; 
    cout<<" "; 
    getline(cin, filename); 

    inputfile.open(filename, ios::in); 

    cout <<" file_state: " << inputfile.fail(); 
    if (inputfile.fail() == 1) { 
     cout << " - Cannot open your file" << endl; 
    } 
    else cout << " - File was openned sucesfully"<< endl; 



    return 0; 

} 


int stringFind(string what) { 
    cout << " I am looking for:" << what << endl; 

    found = what.find(sentence); 
    if (found == string::npos) { 
     cout << " I could not find this string " << endl; 

    } 
    else if(found != string::npos){ 
     cout << " substring was found in line: " << line + 1 << " position: " << found + 1 << endl << endl; 
     ifound = true; 
     foundstring = sentence; 

    } 

    return 0; 


} 



bool getOneLine(void) { 
    if (inputfile.eof()) { 
     cout << "END OF FILE" << endl << endl; 
     return false; 
    } 
    else{ 
     getline(inputfile, sentence); 
     cout << "next sentence is: "<< sentence << endl; 
     return true; 
     } 
} 

Je suis novice et je ne un à demander - personnellement. J'ai essayé d'éditer Tandis que le cycle et les SI pour m'assurer que je n'ai pas fait une erreur sérieuse mais je n'ai aucune idée.

Je l'ai essayé avec par exemple sample.txt et ce fichier était vide.

+0

Cela peut avoir des informations utiles: https://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong – Galik

Répondre

2

Toujours essai si l'entrée a réussi après la tentative de lecture! Le flux ne peut pas savoir ce que vous essayez de faire. Il peut seulement indiquer si les tentatives ont réussi jusqu'à présent. Alors, vous feriez quelque chose comme

if (std::getline(stream, line)) { 
    // deal with the successful case 
} 
else { 
    // deal with the failure case 
} 

Dans le cas d'échec, vous pourriez vouloir utiliser l'utilisation eof() pour déterminer si l'échec était dû arriver à la fin du cours d'eau: Après avoir atteint la fin du fichier et, par conséquent, std::ios_base:eofbit étant défini n'est souvent pas une erreur mais simplement l'indication que vous avez terminé. Il peut encore s'agir d'une erreur, par exemple, lorsque l'on sait combien de lignes doivent être lues mais que moins de lignes sont obtenues.

+0

Oui, vous avez raison. Merci pour cet avis. Je ne savais pas - probablement j'ai oublié qu'il a 4 drapeaux ou plus que les retours getline. Et avec "If", il ne peut continuer qu'avec un bon bit - 0. Merci J'apprécie votre aide et votre temps. – naschd

0

Vous avez une erreur ici:

found = what.find(sentence); 

Vous êtes à la recherche à l'intérieur de what pour le sentence. Si sentence est vide, il sera trouvé.

Modifier à

found = sentence.find(what); 

Vous devriez apprendre definitivly comment utiliser un débogueur. De cette façon, vous trouverez ces problèmes assez rapidement!

+0

Oui merci. Il y avait une cause profonde de mon problème. Tu as raison. Mais SW que j'utilise est nouveau pour moi, je l'apprendrai dès que possible. Donc, merci encore;) Espérons que ce fil aidera quelqu'un avec un problème similaire. – naschd

2

manière correcte d'utiliser getline() et EOF vérification serait comme ceci:

bool getOneLine(void) { 
    if (getline(inputfile, sentence)) { 
     cout << "next sentence is: "<< sentence << endl; 
     return true; 
    } 
    if (inputfile.eof()) 
     cout << "EOF reached" << endl; 
    else 
     cout << "Some IO error" << endl; 
    return false; 
} 
+0

Merci, j'ai essayé de trouver de nouveau des informations sur getline. J'ai trouvé que ça renvoyait un drapeau. Donc, je peux le mettre dans certains laissez-moi dire - condition, comme vous l'avez mis. Mon erreur a été d'ignorer les valeurs de retour quand je le cherchais. Je ne le savais pas. Je vous remercie. – naschd