2015-04-12 4 views
0
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main() 

{ 
    int i, f=0; 
    int c; 
    char file_name[100]; 
    char search[10]; 

    printf("Enter the file name:"); 
    scanf("%s", file_name); 
    printf("Search word:"); 
    scanf("%s", search); 

    FILE *f = fopen((strcat(file_name, ".txt")), "rb"); 
    fseek(f, 0, SEEK_END); 
    long pos = ftell(f); 
    fseek(f, 0, SEEK_SET); 

    char *bytes = malloc(pos); 
    fread(bytes, pos, 1, f); 
    fclose(f); 

/*search*/ 

    if (strstr(bytes, search) != NULL){ 
     printf("found\n"); 
     f = 1;} 
     else{ 
    printf("Not found\n"); 

    f=0;} 

    if (f==1){ /* if found...print the whole line */ 
    ....} 
    free(bytes); 

} 

Вышеуказанная моя программа для поиска строки из .txt-файла. Когда он найден, он печатает «найденный», иначе он печатает «Не найден». Теперь я хочу напечатать полную строку, частью которой была строка. Я думал об использовании «f == 1» в качестве условия для «если найден» печатать всю строку, не совсем уверен, что это лучший способ для продолжения.Как распечатать текущую строку?

+0

Если вам небезразличны строки, ваш код должен содержать некоторые упоминания о концах строк, не? –

+0

В том месте, где вы нашли совпадение, выполните поиск назад, пока не найдете окончание строки (или начало файла). Теперь выполните поиск вперед, пока не закончится следующая строка (или конец файла.). Между вами и вашей текущей линией. – tux3

+0

Как мне искать назад? – jimo

ответ

0

Прежде всего, необходимо исправить чтение, чтобы оставить данные, прочитанные из файла NUL концевые:

char *bytes = malloc(pos + 1); 
fread(bytes, pos, 1, f); 
bytes[ pos ] = '\0'; 

Добавьте ошибку проверки слишком - Проверьте возвращение из malloc() и fread(). это хорошая привычка.

Затем, если вы нашли строку, разделить то, что вы читаете в этой точке:

char *found = strstr(bytes, search); 
if (found != NULL) 
{ 
    *found = '\0'; 
    char *lineStart = strrchr(bytes, '\n'); 
    char *lineEnd = strchr(found + 1, '\n'); 
     . 
     . 

Я оставлю это до вас, чтобы выяснить, что это означает, что если один или оба из них являются NULL.

Кроме того, использование fseek() для определения количества байтов в файле технически неверно, поскольку ftell() не возвращает смещение байта, а только значение, которое может использоваться fseek() для возврата к этому то же место в файле. Есть несколько архитектур, где ftell() возвращает бессмысленное число.

Если вы хотите знать, насколько большой файл, используйте stat() - или fstat() на открытом файле:

struct stat sb; 
FILE *f = fopen(...) 
fstat(fileno(f), &sb); 
off_t bytesInFile = sb.st_size; 

Заметим также, что я не использовал long - я off_t. Использование long для хранения количества байтов в файле - это рецепт серьезных ошибок при размере файлов более 2 ГБ для 32-разрядных программ.

+0

печать 'lineStart' печатает строку в начале строки, тогда как печать 'lineEnd' пропускает остальную часть текущей строки и печатает все следующие строки до конца файла. Почему это поведение? – jimo

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