#include "stdafx.h"
#include <stdio.h>
#include <iostream>
#include <fstream>
#include <string.h>
#include <conio.h>
int main()
{
char mass [80][80];
char slovo[80];
int i=0;
int a,k=0;
setlocale(LC_ALL, "Russian");
FILE *f;
f=fopen("text.txt", "r");
if(f==NULL) printf("файл text.txt не открыт\n");
a=i;
printf("Введите слово для поиска: ");
// Здесь должен быть линейный поиск
}
Вот ответ, разбирайтесь:
#include "iostream"
#include <string>
#include <fstream>
using namespace std;
int main(){
ifstream file("C://1.txt"); // открыли файл с текстом
string s, find;
char c;
while (!file.eof()){ // прочитали его и заполнили им строку
file.get(c);
s.push_back(c);
}
file.close(); // обязательно закрыли
cout << "enter a world for find: ";
cin >> find;
int pos = s.find(find); // поиск
if (pos == -1)
cout << "not finded" << endl;
else
cout << "finded in " << pos << " simvol position" << endl;
return 0;
}
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
) может быть эффективнее в некоторых случаях чем наивный линейный поиск. Связанный вопрос: Поиск повторяющихся строк.
Читайте в цикле файл по словам функцией fscanf()
и используйте strcmp()
для сравнения.
--
См. man fscanf
. Что будет непонятно -- спрашивайте.
Update
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int
main (int argc, char* argv[])
{
FILE *fp;
const char *fname;
int rc = 1; // like grep return code
if (!(fp = fopen(fname = (argv[1] ? argv[1]: "1.txt"),"r"))) {
perror(fname);
exit(2);
}
char input[81], word[81];
printf("Enter word: "); fflush(stdout);
if (scanf("%80s", input) == 1) {
printf("search [%s] in %s\n", input, fname);
while(fscanf(fp, "%80s", word) == 1)
if (strcmp(word, input) == 0) {
rc = 0;
printf("Found in pos: %ld\n", ftell(fp));
}
} else
puts("nothing to search");
return rc;
}
Windows 7, emacs e-shell:
c:/Users/avp/src/cc/hashcode $ g++ b.cpp -o b
c:/Users/avp/src/cc/hashcode $ ./b
Enter word: ERRDEMO
search [ERRDEMO] in 1.txt
Found in pos: 591
c:/Users/avp/src/cc/hashcode $
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Дана матрица А(10х10)Расставить строки таким образом, чтобы элементы в первом столбце были упорядочены по убыванию
Как написать код так, чтобы мой массив заполнялся текстом в 500 Кб и не захлебывался
http://pastebincom/g5dJAAYM# Выходит вот такая ошибка в данном коде