как использовать ‘string :: find’, чтобы найти слово в файле, используя переполнение стека

Я создаю программу, которая будет открывать файл и искать нужное слово в тексте.
Я создал следующий банк слов …

Lawyer
Smith Janes
Doctor
Michael Zane
Teacher
Maria Omaha#include <iostream>
#include <string>
#include <fstream>
#include <stdlib.h>
#include <string>
#include <sstream>
using namespace std;

int main ()
{
// Declarations
string reply;
string inputFileName;
ifstream inputFile;
char character;

cout << "Input file name: ";
getline(cin, inputFileName);

// Open the input file.
inputFile.open(inputFileName.c_str());

// Check the file opened successfully.
if ( ! inputFile.is_open())
{
cout << "Unable to open input file." << endl;
cout << "Press enter to continue...";
getline(cin, reply);
return 1;
}

Теперь, когда я сохраняю весь файл в строку, как я могу искать внутри этой строки
для конкретного слова я ищу …

Я изучаю C ++ с этого сайта http://www.cprogramming.com/tutorial/lesson10.html

Я думаю, что вы используете string::find но я не мог найти много ссылок о том, как искать рядом с этим сайтом ..

http://www.cplusplus.com/reference/string/string/find/

В этом разделе будет отображаться весь файл.

    string original;
getline(inputFile, original, '\0');
cout << original << endl;
cout << "\nEnd of file reached\n" << endl;

// Close the input file stream
inputFile.close();
cout << "Press enter to continue...";
return 0;
}

Вот как я думаю, что программа должна действовать …

Please enter a word: Smith Janes
Smith Janes Lawyer

another example....

Please enter a word: Doctor
Michael Zane Doctor

0

Решение

find возвращает позицию (смещение на основе нуля) в строке, в которой найдено слово. Если слово не найдено, оно возвращается npos,

#include <string>
#include <iostream>

int main()
{
std::string haystack("some string with words in it");

std::string::size_type pos = haystack.find("words");
if(pos != std::string::npos)
{
std::cout << "found \"words\" at position " << pos << std::endl;
}
else
{
std::cout << "\"words\" not found" << std::endl;
}
}
1

Другие решения

#include <string>
#include <iostream>
#include <cstdlib>

int main() {
std::string haystack = "Lawyer\nSmith Janes\nDoctor\nMichael Zane\nTeacher\nMaria Omaha\n";

std::string needle = "Janes";

auto res = haystack.find(needle);
if (std::string::npos == res) {
std::cout << "Not found\n";
std::exit(EXIT_FAILURE);
}
std::cout << res << '\n';
}

res является индексом в строке в точке, где «Janes» (должно быть 13).

Функциональность, которую вы, похоже, запрашиваете, является более сложной, чем просто нахождение некоторого содержимого в строке. Вывод, который вы показываете, имеет пользовательский ввод либо имя, либо профессию, а вывод — это связанная профессия или имя.

Очень просто написать программу, которая показывает строку, на которой находится «игла», или всегда показывает предыдущую строку, или всегда показывает следующую строку. Но то, что вы просите, это показать одно или другое в зависимости от того, что искали.

Один простой способ, которым мы могли бы реализовать это, состоит в том, чтобы найти, находится ли стрелка на четной или нечетной линии, и основывать то, что мы показываем на этом.

Сначала мы получаем номер строки.

auto line_num = std::count(std::begin(haystack), std::begin(haystack) + res, '\n');

На основании показанного вами контента профессии располагаются четными линиями, а названия — нечетными. Мы можем легко получить номера строк, которые мы хотим:

auto profession_line_num = line_num/2*2;
auto name_line_num = line_num/2*2 + 1;

Затем мы можем разбить текст на строки, так как нам нужно работать с целыми строками и получать строки по индексу. Метод, который я показываю ниже, делает копию текста и неэффективен, но это легко.

Вот функция разделения:

std::vector<std::string> split(std::string const &s, std::string const &delims) {
std::vector<std::string> res;

std::string::size_type i = 0;
auto found = s.find_first_of(delims, i);
while (std::string::npos != found) {
res.emplace_back(s, i, found-i);
i = found+1;
found = s.find_first_of(delims, i);
}
res.emplace_back(s, i);

return res;
}

И мы используем функцию разделения следующим образом:

auto lines = split(haystack, '\n');

Теперь мы можем показать строки, которые мы хотим.

std::cout << lines[name_line_num] << ' ' << lines[profession_line_num] << '\n';

Который, как только вы сложите программу, напечатает

Smith Janes Lawyer
1

Я думаю, что здесь есть вся необходимая информация.

http://www.cplusplus.com/reference/string/string/find/

-1
По вопросам рекламы [email protected]