#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 //такого слова нет
Комментариев нет:
Отправить комментарий