Как найти слово? [закрыто]

189
15 декабря 2016, 16:08
#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("Введите слово для поиска: ");  
    // Здесь должен быть линейный поиск  
}
Answer 1

Вот ответ, разбирайтесь:

#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;
}
Answer 2

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) может быть эффективнее в некоторых случаях чем наивный линейный поиск. Связанный вопрос: Поиск повторяющихся строк.

Answer 3

Читайте в цикле файл по словам функцией 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 $
READ ALSO
Двумерный массив &ldquo;си&rdquo;

Двумерный массив “си”

Дана матрица А(10х10)Расставить строки таким образом, чтобы элементы в первом столбце были упорядочены по убыванию

205
Как записать текст в массив?

Как записать текст в массив?

Как написать код так, чтобы мой массив заполнялся текстом в 500 Кб и не захлебывался

295
R6010 abort() has been called

R6010 abort() has been called

http://pastebincom/g5dJAAYM# Выходит вот такая ошибка в данном коде

257
Как получить цвет пикселя виджета  QT?

Как получить цвет пикселя виджета QT?

Нужно получить значание RGB именно одной точки на QWidget

283