2014-09-14 5 views
0

J'essaie de lire un fichier texte pour trouver le nombre de fois qu'une phrase/phrase (/ sous-chaîne?) Se produit. J'ai fait un vrai boulot sur le moment (voir le code ci-dessous), mais comme vous le verrez, cela dépend de quelques déclarations if plutôt maladroites. Je n'ai pas accès aux fichiers Je vais l'utiliser chez moi, j'ai donc utilisé un fichier appelé big.txt et je recherche des expressions comme "et" pour le moment.Recherche d'une phrase dans un fichier texte C++

Idéalement, j'aimerais pouvoir rechercher "ce code d'erreur 1" et renvoyer le nombre de fois qu'il se produit. Toute idée sur la façon dont mon code fonctionnerait de cette façon serait extrêmement utile!

int fileSearch(string errorNameOne, string errorNameTwo, string textFile) { 

string output;         //variable that will store word from text file 


ifstream inFile;       
inFile.open(textFile);       //open the selected text file 

if (!inFile.is_open()) { 
    cerr << "The file cannot be opened"; 
    exit(1); 
} 

if (inFile.is_open()) {       //Check to make sure the file has opened correctly 

    while (!inFile.eof()) {      //While the file is NOT at the end of the file 

     inFile >> output;      //Send the data from the file to "output" as a string 

     if (output == errorNameOne) {   //Check to look for first word of error code 
      marker = 1;       //If this word is present, set a marker to 1 
     } 

     else if (marker == 1) {     //If the marker is set to 1, 
      if (output == errorNameTwo) {  //and if the word matches the second error code... 
       count++;      //increse count 
      } 

      marker = 0;       //either way, set marker to 0 again 
     } 
    } 
} 

inFile.close();         //Close the opened file 

return count;         //Function returns count of error 
} 
+0

Je n'arrive pas à comprendre votre problème. Pouvez-vous s'il vous plaît ajouter un exemple avec des données factices comme: quelle est votre entrée et quelle est la sortie attendue. –

+0

Vous dites que vous recherchez cette phrase: "ce code d'erreur 1" mais votre exemple recherche deux phrases l'une après l'autre. Cherchez-vous une ou deux phrases? De plus, quelle est la variable dans le fichier texte? Est-il toujours fixé avec précision ou peut-on changer le nombre d'espaces (par exemple). Est-ce que le nombre est fixé à 1 ou peut-il être d'autres nombres comme: "ce code d'erreur 7"? – Galik

+0

@Galik dans les fichiers journaux réels, la phrase serait lire (par exemple) "Header Tangs Present" puis une charge d'espaces, puis un 1. Il ne peut avoir un 1 ou un 0 et tous les codes d'erreur sont listés ligne par ligne dans ce qui ressemble à une table (mais c'est juste un fichier texte formaté). La raison pour laquelle je cherche deux expressions est que lorsque la chaîne est envoyée à la sortie d'inFile, elle ne fait qu'un seul mot à la fois, donc elle ne reconnaîtra pas le second mot, d'où le marqueur et la vérification du mot suivant. – ElHarvman

Répondre

2

Étant donné que votre phrase ne peut se produire une fois par ligne et le numéro suit la phrase après un certain nombre d'espaces que vous pouvez lire le fichier ligne par ligne et utiliser std :: string :: find() pour voir des votre phrase est quelque part dans la ligne. Cela retournera la position de la phrase. Vous pouvez ensuite vérifier le reste de la ligne immédiatement après la phrase pour tester le nombre pour 1 ou 0.

Ce code peut ne pas être exactement ce que vous voulez (encore pas certain des spécifications exactes) mais j'espère qu'il devrait contenir suffisamment d'exemples de ce que vous pouvez faire pour atteindre votre objectif.

// pass the open file stream in to this function along with the 
// phrase you are looking for and the number to check 
int count(std::istream& is, const std::string& phrase, const int value) 
{ 
    int count = 0; 

    std::string line; 
    while(std::getline(is, line)) // read the stream line by line 
    { 
     // check if the phrase appears somewhere in the line (pos) 
     std::string::size_type pos = line.find(phrase); 

     if(pos != std::string::npos) // phrase found pos = position of phrase beginning 
     { 
      // turn the part of the line after the phrase into an input-stream 
      std::istringstream iss(line.substr(pos + phrase.size())); 

      // attempt to read a number and check if the number is what we want 
      int v; 
      if(iss >> v && v == value) 
       ++count; 
     } 

    } 
    return count; 
} 

int main() 
{ 
    const std::string file = "tmp.txt"; 

    std::ifstream ifs(file); 

    if(!ifs.is_open()) 
    { 
     std::cerr << "ERROR: Unable to open file: " << file << '\n'; 
     return -1; 
    } 

    std::cout << "count: " << count(ifs, "Header Tangs Present", 1) << '\n'; 
} 

Espérons que cela aide.

Questions connexes