Страницы

Поиск по вопросам

среда, 22 января 2020 г.

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

#cpp #строки #файлы #getline


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

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

#include 
#include  //для добавления русского в LC_ALL
#include  //работа с файлами
#include  
#include 
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;
}


Вопросы: 

---->(Соответствующие строки кода отмечены стрелочками)<---------



Долго искал информацию по поводу того как точно это работает. По моим расчетам эта
строчка считывает строку за строкой

— Работает ли это так как я думаю? Почему?
Идею закладывал такую: если .find() не возвращает отрицательного результата — значит
слово найдено. 

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

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


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

Спасибо
    


Ответы

Ответ 1



Да, это так работает. Потому что так сказано в спецификации соответствующих функций стандартной библиотеки. Проверка на -1 избыточна. Во-первых, никакого буквально отрицательного значения эта функция возвращать не может - у нее беззнаковый тип возврата. Во-вторых, в спецификации ясно сказано, что в случае безуспешного поиска эта функция возвращает npos. Это все, что вас должно интересовать. А что сказал дебаггер? Что у вас содержится в самих строках? Может, проблемы с локалью? Также, не совсем понятна ваша трактовка условия. В каждой строке вы ищете подстроку. В условии же сказано, что надо искать слово. Вы уверены, что в данном случае имелось в виду одно и то же? Содержит ли строка "Луна умножает четырехугольно" слова "нож" и "уголь"?

Ответ 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 //такого слова нет

Комментариев нет:

Отправить комментарий