2013-11-10 8 views
0

Я ищу слово/фразу в файле .txt.Извлечение фразы из строки

файл выглядит следующим образом:

apple tree '\t' data 
    apple '\t' data 
    apple pie '\t' data 
    Greek '\t' data 
    Holland ; Netherlands ; The Netherlands '\t' data 

Я ищу char *word внутри этого огромного файла. Мне становится сложно, когда у меня есть слова, такие как Netherlands или The Netherlands, и я хочу захватить эти данные.

Я сломал проблему на мелкие детали. Пока я знаю, сколько строк имеет файл и может использовать эту информацию для fseek для этой строки. Эти части работают независимо от этой части ниже.

file_lines = 12325; 

// line_index[] every element corresponds to a line in to a line in the file. 
char* buffer[256]; 
FILE fp = fopen(file.txt, "r") 

int i, j, k; 
for(i = line_index[index_start]; i < line_index[index_end]; i++) 
{ 
    fseek(fp, i, SEEK_SET); 
    fgets(buffer, 256, fp); 

    if(strstr(buffer, word) != NULL) // word is here 
    { 
    // having problems finding the word here 

    for(j = 0; j < 256; j++) 
     for(k = 0; k < 256; k++) 
     { 
     if(buffer[k] == word[k]) 
      continue; 

     if(buffer[k] == ' ') 
      continue; 

     if(buffer[k] == ';') 
      break; 

     if(buffer[k] == '\t') 
      break; 
     } 

    } 
} 

Моя самая большая проблема - убедиться, что слово/фраза в этой строке. Я могу знать, какая потенциальная линия имеет экземпляр слова, но если я ищу яблоко, я могу получить яблочное дерево, если я не буду искать внутри этой строки правильно.

Пожалуйста, помогите.

+1

Вы знаете, что strstr() возвращает вам указатель на слово в буфер, не так ли? Возможно, использование этого возвращаемого значения поможет. –

+0

Результат strstr() минус адрес буфера - это индекс. Pointer arithmetics ... – SzG

+0

Он дает вам указатель на буфер. –

ответ

2

Грубо ...

char *tab = strchr(buffer, '\t'); 
    if(tab) *tab = 0; 
    if(strstr(buffer, word) != NULL) // word is here 
    { 
     char *token = strtok(buffer, ";"); 
     int found = 0; 
     while(token) { 
      // remove this printf later, but for now it will help you debug 
      printf("'%s' vs '%s'\n", word, token); 
      if(strcmp(word, token) == 0) { 
       found = 1; 
       break; 
      } 
      token = strtok(0, ";"); 
     } 
     if(found) { 
      if(tab == 0) { 
       printf("No data for %s\n", word); 
      } else { 
       printf("data is '%s'\n", tab+1); 
      } 
     } 
+0

Это действительно хорошо, но это не работает, когда в базе данных есть что-то вроде «красного яблока», оно будет захватывать данные из этого экземпляра вместо «apple». –

+0

Значит, слово «яблоко»? Если строка «красное яблоко \ t данных», то strstr будет соответствовать, но strtok() -> strcmp не должен совпадать, потому что strtok должен возвращать «красное яблоко», а не «красный». –

+0

Да, вы правы, он делает это только для одной из записей, поэтому это что-то еще. –

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