Domanda

Ecco il mio codice finora:

#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;

}

Non sono sicuro di come andare alla parola successiva, attualmente questi infiniti loop ... qualche raccomandazione?

Inoltre ... come mi dico di stampare la linea che quella parola era?

Grazie in anticipo!

È stato utile?

Soluzione

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

Questo farebbe il lavoro. Si prega di leggere di più dei flussi.

Altri suggerimenti

Se tutto ciò che vuoi fare è contare il numero di parole chiave in un file, allora:

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

Se vuoi leggere le parole.
Ma voglio anche stampare i numeri di riga, poi qualcosa del genere dovrebbe funzionare:

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;
} 

Modificare while(infile.is_open()) a while(infile). Quindi è possibile rimuovere il test EOF ridondante alla fine.

È ancora aperto anche se hai riscontrato un errore o hai raggiunto la fine del file. È probabile che tu sia in uno scenario in cui Failbit viene impostato (GetLine non restituisce nulla), ma l'EOF non è stato riscontrato, quindi il file non viene mai chiuso, quindi il tuo loop non esce mai. Usando il operator bool del flusso gira tutti questi problemi per te.

Il problema arriva in questa parte del codice sorgente:

getline(cin,word);

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

Prima di tutto, non vuoi leggere le righe da Cin. Vuoi leggere parole da infilare. Quindi dovresti sostituire la prima riga del tuo codice all'interno del loop da:

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

Inoltre, dovresti cambiare le condizioni del ciclo. Non è necessario verificare se il infilare è aperto qui. Dovresti verificarlo prima Il ciclo inizia. Per il ciclo, è necessario verificare se il eof lo stato è stato raggiunto o no:

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++;
    }
}

E come puoi vedere, ora puoi liberarti di quello strano secondo Se Hai messo dentro il ciclo.
L'ultimo passo è introdurre la tecnica "Lettura in anticipo": non ha senso testare EOF quando non abbiamo letto nulla.

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;
}

Spero che sia di aiuto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top