istream_iterator<string>
+ find
алгоритм являются простым способом определить, содержит ли файл, данное отделённое пробелами слово, используя линейный поиск:
ifstream file("input.txt");
istream_iterator<string> eof;
bool found = find(istream_iterator<string>(file), eof, word) != eof;
Например, если слово задано с коммандной строки, а файл передаётся на стандартном вводе:
/** $ g++ *.cxx -o find-word && <input.txt ./find-word word
Exit status:
0 -- found word
1 -- not found
2 -- error
*/
#include <algorithm>
#include <cstdlib>
#include <iostream>
#include <iterator>
#include <string>
int main(int argc, char* argv[])
{
using namespace std;
if (argc != 2) {
cerr << "Usage: find-word WORD <input.txt\n";
exit(2);
}
string word(argv[1]); // word to search
istream_iterator<string> words(cin), eof;
bool found = find(words, eof, word) != eof;
return found ? 0 : (cin.eof() ? 1 : 2);
}
Поиск работает, потому что istream_iterator<string>
вызывает cin >> next_word
внутри, который пропускает пробелы по умолчанию (skipws
флаг установлен) и find
алгоритм затем просто сравнивает next_word == word
.
Что такое пробел, а значит и что такое слово может зависеть от текущей локали.
На системах с utf-8 локалью, код работает как есть с произвольным Юникодным текстом (поддержка нескольких языков в одном документе, поддержка эмотиконов и т.д., правда Юникодные пробелы не распознаются). Windows может испортить входной поток за счёт неявных (codepage) преобразований байтового потока -- как прочитать Юникодный текст на Windows лучше задать как отдельный вопрос.
Код читает только одно слово за раз и возвращается как только входное слово обнаружено, то есть код может работать с очень большими файлами и если заданное слово присутствует во вводе, то программа может вернуться раньше -- без считывания всего ввода. Код также информирует об ошибках ввода (cin.eof()
тест).
Существует множество строковых алгоритмов, которые помогают найти подстроку в строке, например, алгоритм Ахо—Корасик (мог быть использован для реализации fgrep
) может быть эффективнее в некоторых случаях чем наивный линейный поиск. Связанный вопрос: Поиск повторяющихся строк.