Цель: Пользователь вводит слово произвольной длины и имя файла, в котором это слово нужно найти. Программа должна вывести номер строчки, в которой это слово встречается впервые.
Полный текст программы:
#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;
}
Вопросы:
---->(Соответствующие строки кода отмечены стрелочками)<---------
Долго искал информацию по поводу того как точно это работает. По моим расчетам эта строчка считывает строку за строкой
— Работает ли это так как я думаю? Почему?
Идею закладывал такую: если .find() не возвращает отрицательного результата — значит слово найдено.
— Правильно ли я обозначил условие?
Что бы я не вводил, вот эта строка никогда не выполняется. Программа все время говорит, что ничего не нашла.
— Опять же, что я упускаю?
Перепробывал все, что знал, похожие вопросы со стэка не помогли. Ценю любую помощь.
Спасибо
Да, это так работает. Потому что так сказано в спецификации соответствующих функций стандартной библиотеки.
Проверка на -1
избыточна. Во-первых, никакого буквально отрицательного значения эта функция возвращать не может - у нее беззнаковый тип возврата. Во-вторых, в спецификации ясно сказано, что в случае безуспешного поиска эта функция возвращает npos
. Это все, что вас должно интересовать.
А что сказал дебаггер? Что у вас содержится в самих строках? Может, проблемы с локалью?
Также, не совсем понятна ваша трактовка условия. В каждой строке вы ищете подстроку. В условии же сказано, что надо искать слово. Вы уверены, что в данном случае имелось в виду одно и то же? Содержит ли строка "Луна умножает четырехугольно" слова "нож" и "уголь"?
Вообше то лучше функцию написать для более широкого использования, а в программе уже вводить имена и получать результат. Ну например так:
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
//такого слова нет
При отладке происходит ошибка: Вызвано исключение по адресу
Создал класс HumanПрототипы методов get() и set() объявил в Human
есть ли какой-нибудь способ получить значение колонок на определенной строке зная её?
Использую коллекцию TreeSetВозможно добавить не больше одной записи в add