2015-04-23 6 views
2

Мне нужно найти позицию некоторых строк. Эти строки хранятся в файле с именем queryfile, из другого файла с именем datafile.Моя программа не работает должным образом

Однако моя программа не работает должным образом. Может кто-нибудь мне помочь?

Моя программа

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
int main() 
{ 
    FILE *queryfile; 
    queryfile = fopen("op2query.txt","r"); 

    FILE *datafile; 
    datafile = fopen("op2data.txt","r"); 

    int i = 1; 
    char word[99]; 
    char search[99]; 

    if(queryfile==NULL) { 
     printf("Error in reading Query File"); 
     exit(1); 
    } 
    if(datafile==NULL) { 
     printf("Error in reading Data File"); 
     exit(1); 
    } 

    while(fscanf(queryfile,"%98s",search)==1){ 
     while(fscanf(datafile,"%98s",word)==1){ 
      if (strcmp(word,search)==0){ 
       printf("\n %i %s ", i, search); 
       rewind(datafile); 
       i=1; 
       break; 
       } 
       else 
       i++; 
     } 
    } 

    fclose(datafile); 
    fclose(queryfile); 
    return 0; 
    } 

ответ

2

Я строю массив каждого набора слов, которые будут проверены, разделив строку запроса в слова. Эти слова могут охватывать разрыв строки в файле данных. Я помещаю позицию файла данных во второе слово набора, если поиск не выполняется, я ищу эту точку (если необходимо). Программа удалась, даже если я дублирую каждое слово «возраст» в файле данных.

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

#define MAXWORDS 5 
#define MAXLEN  99 

int main() 
{ 
    int j, i, done, words, count; 
    long mark; 
    char word[MAXLEN]; 
    char search[MAXLEN]; 
    char *tok, *sptr[MAXWORDS]; 
    FILE *queryfile; 
    FILE *datafile; 

    if ((queryfile = fopen("op2query.txt","r")) == NULL) { 
     printf("Error in reading Query File"); 
     exit(1); 
    } 
    if ((datafile = fopen("op2data.txt","r")) == NULL) { 
     printf("Error in reading Data File"); 
     exit(1); 
    } 

    while(fgets(search, MAXLEN, queryfile) != NULL){ 
     words = 0; 
     done = 0; 
     count = 0; 
     mark = -1; 
     tok = strtok(search, " \r\n"); 
     while (tok && words < MAXWORDS) {  // build array of query 
      sptr[words++] = tok; 
      tok = strtok(NULL, " \r\n");  // strips newline too 
     } 
     if (words < 1)       // no more queries 
      break; 
     rewind(datafile);      // beginning of file 

     while (!done) {       // until none to read 
      count++; 
      if (mark >= 0)      // when more than one word to search 
       fseek (datafile, mark, SEEK_SET); 
      mark = -1; 
      for (j=0; j<words; j++) { 
       if (j == 1)      // mark for next search 
        mark = ftell(datafile); 
       if (fscanf(datafile, "%98s", word) != 1){ 
        done = 1;     // end of file 
        break; 
       } 
       if (strcmp(sptr[j], word)!=0) 
        break;      // failed multi word search 
      } 
      if (done) 
       printf("NOT FOUND!"); 
      else if (j == words) {    // if all words found 
       printf("%d", count); 
       done = 1;      // success 
      } 
     } 
     for (i=0; i<words; i++) 
      printf(" %s", sptr[i]);    // show array of words asked 
     printf("\n"); 
    } 
    fclose(datafile); 
    fclose(queryfile); 
    return 0; 
} 

выход программы:

18 wisdom 
40 season 
NOT FOUND! summer 
22 age of foolishness 

UPDATE - напечатать NOT FOUND! когда запрос не найден. Добавлено «лето» для запроса файла.

+0

Спасибо большое !!! Но что мне делать Если я хочу сказать пользователю, что запрос, который они хотят найти, не содержится в тексте. Пусть говорят «зима» в файле запроса, и я хочу показать «НЕ НАЙДЕН! winter'. Спасибо огромное ! – tatatatat

+0

@tatatatat посмотреть. –

0

вы должны поставить некоторые отладки-вывод позади fscanf-вызовов (например, printf("search:<%s> word:<%s>", search, word);

Тогда вы увидите, что fscanf останавливается в поиске Пробельного. Сравнить wisdom для каждого последующего слова в op2data.txt.

Вы должны прочитать построчно с fgets() удаления CR/LF от поиска

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

find me 

i am the text to find 
me in this file 

поэтому лучшим решением было бы:

  • читать слово для поиска по линии (удалить CR/LF) (нормализовать ее, удалив двойные пробелы и не-букв)
  • прочитать кусок из файла данных и нормализуйте его тоже.
  • сравнить или продолжить, перемещая чтения-позиции в данных слева по длине длины слова поиска
+0

Я попытался использовать fgets, но он ничего не показывает на экране – tatatatat

+0

попробуйте еще раз использовать fgets() и покажем результат, как я предложил; dirctly позади прочитанного, ВНЕШНИЕ 'if' –

Смежные вопросы