Frage

Hier ist mein bisheriger Code:

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

using namespace std;

int main()
{
    int count = 0;
    string fileName;
    string keyWord;
    string word;


    cout << "Please make sure the document is in the same file as the program, thank you!" 
         << endl << "Please input document name: " ;
    getline(cin, fileName);
    cout << endl;

    cout << "Please input the word you'd like to search for: " << endl;
    cin >> keyWord;
    cout << endl;
    ifstream infile(fileName.c_str());
    while(infile.is_open())
    {
        getline(cin,word);
        if(word == keyWord)
        {
            cout << word << endl;
            count++;
        }
        if(infile.eof())
        {
            infile.close();
        }

    }
    cout << count;

}

Ich bin mir nicht sicher, wie ich zum nächsten Wort gehen soll, derzeit diese unendlichen Schleifen ... eine Empfehlung?

Auch ... wie kann ich es sagen, dass ich die Zeile ausdrucken soll, in der sich dieses Wort befand?

Danke im Voraus!

War es hilfreich?

Lösung

while(infile >> word)
{
    if(word == keyWord)
    {
        cout << word << endl;
        count++;
    }
}

Dies würde den Job machen. Bitte lesen Sie mehr über Streams.

Andere Tipps

Wenn Sie nur die Anzahl der Schlüsselwörter in einer Datei zählen möchten, dann:

int count = std::count(std::istream_iterator<std::string>(infile),
                       std::istream_iterator<std::string>(),
                       keyword);

Wenn Sie Wörter lesen möchten.
Ich möchte aber auch die Zeilennummern drucken, dann sollte so etwas funktionieren:

std::string      line;
std::ifstream    infile("plop");
int              lineNumber = 0;

while(std::getline(infile, line)) 
{
    ++lineNumber ;
    std::stringstream   linestream(line);
    int hits = std::count(std::istream_iterator<std::string>(linestream),
                          std::istream_iterator<std::string>(),
                          keyword);
    if (hits != 0)
    {
        std::cout << "Line: " << lineNumber << "   Matches(" << hits << ")\n";
    } 
    count  += hits;
} 

Veränderung while(infile.is_open()) zu while(infile). Dann können Sie den redundanten EOF -Test am Ende entfernen.

Es ist immer noch offen, auch wenn Sie einen Fehler aufgetreten sind oder das Ende der Datei erreicht haben. Es ist wahrscheinlich, dass Sie sich in einem Szenario befinden, in dem das Failbit festgelegt wird (GetLine gibt nichts zurück), aber EOF ist nicht angetroffen, sodass die Datei nie geschlossen wird, sodass Ihre Schleife nie beendet. Verwendung der operator bool des Stroms geht all diese Probleme für Sie um.

Das Problem kommt in diesem Teil des Quellcodes:

getline(cin,word);

if(word == keyWord)
{
    cout << word << endl;
    count++;
}

Zuallererst möchten Sie keine Zeilen aus lesen CIN. Sie möchten lesen Wörter aus im Ordner. Sie sollten also die erste Zeile Ihres Codes in der Schleife ersetzen durch:

infile >> word;
if(word == keyWord)
    {
        cout << word << endl;
        count++;
    }

Sie sollten auch den Zustand der Schleife ändern. Sie müssen nicht überprüfen, ob die im Ordner ist hier offen. Sie sollten danach suchen Vor Die Schleife beginnt. Für die Schleife müssen Sie prüfen, ob die eof Der Staat wurde erreicht oder nicht:

if ( !infile.is_open() ) {
    cerr << "Error while opening file." << endl;
    exit( EXIT_FAILURE );
}    

while( !infile.eof() ) {
    infile >> word;
    if(word == keyWord)
    {
        cout << word << endl;
        count++;
    }
}

Und wie Sie sehen können, können Sie jetzt diese seltsame Sekunde loswerden wenn Sie legen in die Schleife.
Letzter Schritt besteht darin, die Technik "Voraussetzung zu lesen" vorstellen: Es ist nicht sinnvoll, für EOF zu testen, wenn wir nichts gelesen haben.

if ( !infile.is_open() ) {
    cerr << "Error while opening file." << endl;
    exit( EXIT_FAILURE );
}    

infile >> word;    
while( !infile.eof() ) {
    if( word == keyWord )
    {
        cout << word << endl;
        count++;
    }

    infile >> word;
}

Hoffe das hilft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top