Поиск номера строки с искомым словом C++

137
13 июня 2019, 21:20

Цель: Пользователь вводит слово произвольной длины и имя файла, в котором это слово нужно найти. Программа должна вывести номер строчки, в которой это слово встречается впервые.

Полный текст программы:

#include <stdio.h>
#include <iostream> //для добавления русского в LC_ALL
#include <fstream> //работа с файлами
#include <iostream> 
#include <string>
using namespace std;
void searcher(string word)
{
    std::string filename;
    std::cout << "Введите имя файла для поиска слова: " << endl;
    std::cin >> filename; //сохраняем имя файла в переменную filename
    ifstream oleg;
    oleg.open(filename); //Попытка открытия файла
    if (!oleg.is_open()) //В случае проблемы открытия
        exit(EXIT_FAILURE); //просто закрываем программу
    int number_of_lines = 0; //номер строки
    std::string line;
    while (std::getline(oleg, line)) //<----------------------------1)
    {
        number_of_lines += 1;
        if ((line.find(word) != std::string::npos) && (line.find(word) != (-1) )) //<------------------2)
        {
            std::cout << "Ваше слово " << word << " найдено в строке #" << number_of_lines << endl; //<----------------------3)
            return; //(если нашли слово - выходим из функции)
        }
        //иначе продолжаем while
    }
    std::cout << "Нет ни одного слова, совпадающего с: " << word << endl; //если слово так и не было найдено
    oleg.close(); //закрываем читаемый файл
}
int main(void)
{
    std::string word; //слово, которое пользователь хочет найти в файле
    std::cout << "Введите слово, которое программа будет искать: " << std::endl;
    std::cin >> word; //считываем с клавиатур слово до первого пробела
    std::cout << "Вы ввели \t" << word << endl; //Проверочная печать
    cin.get();
    searcher(word); 
    cin.ignore();
    cin.get(); //Ликвидируем самопроизвольное закрытие консоли
    return 0;
}

Вопросы:

---->(Соответствующие строки кода отмечены стрелочками)<---------
  1. Долго искал информацию по поводу того как точно это работает. По моим расчетам эта строчка считывает строку за строкой

    — Работает ли это так как я думаю? Почему?

  2. Идею закладывал такую: если .find() не возвращает отрицательного результата — значит слово найдено.

    — Правильно ли я обозначил условие?

  3. Что бы я не вводил, вот эта строка никогда не выполняется. Программа все время говорит, что ничего не нашла.

    — Опять же, что я упускаю?

Перепробывал все, что знал, похожие вопросы со стэка не помогли. Ценю любую помощь.

Спасибо

Answer 1
  1. Да, это так работает. Потому что так сказано в спецификации соответствующих функций стандартной библиотеки.

  2. Проверка на -1 избыточна. Во-первых, никакого буквально отрицательного значения эта функция возвращать не может - у нее беззнаковый тип возврата. Во-вторых, в спецификации ясно сказано, что в случае безуспешного поиска эта функция возвращает npos. Это все, что вас должно интересовать.

  3. А что сказал дебаггер? Что у вас содержится в самих строках? Может, проблемы с локалью?

Также, не совсем понятна ваша трактовка условия. В каждой строке вы ищете подстроку. В условии же сказано, что надо искать слово. Вы уверены, что в данном случае имелось в виду одно и то же? Содержит ли строка "Луна умножает четырехугольно" слова "нож" и "уголь"?

Answer 2

Вообше то лучше функцию написать для более широкого использования, а в программе уже вводить имена и получать результат. Ну например так:

size_t searcher(const string& w,  std::istream& input)
{
    std::string line;
    size_t k = 0;
    while (std::getline(input, line))
    {
        ++k;
        if (line.find(w) != std::string::npos)
            return k;
    }
    return 0;
}

В программе:

string word, filename;    
// вводите  word и filename и инициализируйте std::ifstream oleg
if (size_t line = searcher(word, oleg))
{
    std::cout << "слово найдено в строке " << line;
    //  другие действия 
}
else
    //такого слова нет
READ ALSO
ISO C++ forbids converting a string constant to &#39;char*&#39;

ISO C++ forbids converting a string constant to 'char*'

Создал класс HumanПрототипы методов get() и set() объявил в Human

144
Получить значений jtable зная строку

Получить значений jtable зная строку

есть ли какой-нибудь способ получить значение колонок на определенной строке зная её?

128
Добавление элементов в TreeSet

Добавление элементов в TreeSet

Использую коллекцию TreeSetВозможно добавить не больше одной записи в add

256