Pregunta

Aquí está mi código hasta ahora:

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

}

No estoy seguro de cómo ir a la siguiente palabra, actualmente este infinito bucles ... ¿alguna recomendación?

Además ... ¿cómo le digo que imprima la línea en la que esa palabra estaba?

¡Gracias por adelantado!

¿Fue útil?

Solución

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

Esto haría el trabajo. Lea más sobre transmisiones.

Otros consejos

Si todo lo que desea hacer es contar el número de palabras clave en un archivo, entonces:

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

Si quieres leer palabras.
Pero también quiero imprimir los números de línea que algo así debería funcionar:

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

Cambio while(infile.is_open()) a while(infile). Luego puede eliminar la prueba EOF redundante al final.

Todavía está abierto incluso si ha encontrado un error o ha alcanzado el final del archivo. Es probable que esté en un escenario en el que Failbit se está configurando (GetLine no devuelve nada), pero EOF no se ha encontrado, por lo que el archivo nunca se cierra, por lo que su bucle nunca sale. Utilizando el operator bool de la corriente se acerca todos estos problemas para usted.

El problema viene en esta parte del código fuente:

getline(cin,word);

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

En primer lugar, no quieres leer líneas de cinta. Quieres leer palabras de en archivo. Por lo tanto, debe reemplazar la primera línea de su código dentro del bucle por:

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

Además, debe cambiar la condición del bucle. No necesitas verificar si el en archivo está abierto aquí. Deberías verificar eso antes de El bucle comienza. Para el bucle, debe verificar si el EOF El estado ha sido alcanzado 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++;
    }
}

Y como puedes ver, ahora puedes deshacerte de ese extraño segundo si Pones dentro del bucle.
El último paso es introducir la técnica de "lectura por delante": no tiene sentido probar para EOF cuando no hemos leído nada.

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

Espero que esto ayude.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top