2015-09-14 3 views
0

У меня есть текстовый файл, и я хочу получить определенную строку из этого текстового файла. Содержимое файла выглядит,Поиск определенной строки в текстовом файле в C

<div class="logo_style"> 
    <img src="/images/Gnome-Network-Wireless-NoTx-64.png"> 
    <h2>Fast Actions</h2> 
</div> 
<div class="container"> 
    <p><b><font color=green>Action "update_frequency" is sent.</font></b></p> 
    <br/><a href="/">[Back To Main Section]</a> 
</div> 
</body></html> 

Я хочу искать только линию Action "update_frequency" is sent и распечатать его на стандартный вывод. Я использовал функцию strstr, но когда я печатаю указатель, заданный strstr, он также дает все конечные строки, которые появляются после нужной строки в текстовом файле. Поэтому я попытался сохранить возвращенный указатель в char *str_result. Затем я скопировал первые 10 байтов str_result в str_dst, но я получаю результат как segmentation fault (core dumped). Вот следующий код:

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


int main(int argc, char *argv[]) 
{ 

    FILE *file_r; 
    char *buffer; 
    buffer = malloc (100000); 
    char *str_result; 
    char str_dst[100]; 
    file_r= fopen ("file_new.txt", "r"); 
    fseek (file_r, SEEK_SET, 0); 
    while (fgets (buffer, 100000, file_r)!=NULL) 
     { 
      ; 

     } 

    str_result = strstr(buffer, "Action"); 
    memcpy (str_dst, str_result, 10); 
    printf("%s\n", str_dst); 


    fclose (file_r); 
    return 0; 
} 

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

+1

Почему вы использовали цикл while? –

+0

Чтобы прочитать полное содержимое файла. – learningpal

ответ

2
fgets (buffer, 100000, file_r); 
str_result = strstr(buffer, "Action ");//add space 
size_t len = strchr(str_result, '<') - str_result;//length upto '<' 
memcpy (str_dst, str_result, len); 
str_dst[len] = '\0';//null-terminate 
printf("%s\n", str_dst); 
+0

Спасибо большое. Это сработало ... :) – learningpal

3

memcpy (str_dst, str_result, 10); не вставляет/не добавляет терминатор NULL.

Вы должны добавить str_dst[10]='\0'; между memcpy и printf, чтобы избежать ошибки сегментации

0

Думай текстового файла в виде массива, полный символов. Создайте несколько целочисленных переменных и дайте им провести 0. Создайте цикл for и, если появится конкретная буква, пусть одна из переменных равна месту в массиве, символ был найден. Затем подумайте о другом конкретном персонаже и повторите то же самое, пока не найдете его. Пусть одна из переменных держит свое место. Повторите этот цикл, пока не проверите массив для всех символов в строке. Затем создайте серию операторов if, проверяющих целочисленные значения, вы можете сделать это, взяв значение int place второй буквы в слове, вычитая его из значения int place первого, и если оно равно 1, вы знаете что письмо 2 происходит непосредственно после буквы 1. Это может показаться запутанным, и это не простой способ сделать это, но я надеюсь, что это поможет несколько!

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