Come si cerca un documento per una stringa in C ++?
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!
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.