2012-01-16 3 views
2

Привет Я пытаюсь распечатать оставшееся содержимое файла после того, как сделаю fseek. Прямо сейчас я ничего не получаю. Что случилось с моим кодом?C: как распечатать содержимое файла после поиска

#include <stdio.h> 

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

    if (fr = fopen (argv[1], "r")){ 
    fseek(fr, 100, SEEK_CUR); 

    char c[1]; 
    while (fread(c, 1, sizeof(c),fr) > 0) 
     printf("%s", c); 

    fclose(fr); 
    } 
    else{ 
    perror("File does not exist"); 
    } 

} 

ответ

2

Как указывалось в других ответах, вы передаете printf строку, которая не может быть NULL завершена. Вы также не проверяете, что прочитанный файл превышает 100 байт. Последний пункт, в fread(), вы поменяли параметры size_t size и size_t niters.

Вот модифицированная версия вашей программы, которая устраняет вышеупомянутые проблемы (и очищает распорный немного):

#include <stdio.h> 
#include <sys/stat.h> 

int main(int argc, char *argv[]) 
{ 
    FILE *fr; 
    char c[1]; 
    struct stat sb; 

    // obtains information about the file 
    if (stat(argv[1], &sb) == -1) 
    { 
     perror("stat()"); 
     return(1); 
    }; 

    // verifies the file is over 100 bytes in size 
    if (sb.st_size < 101) 
    { 
     fprintf(stderr, "%s: file is less than 100 bytes\n", argv[1]); 
     return(1); 
    }; 

    // opens the file, or prints the error and exists 
    if (!(fr = fopen (argv[1], "r"))) 
    { 
     perror("fopen():"); 
     return(1); 
    }; 

    fseek(fr, 100, SEEK_CUR); 

    while (fread(c, sizeof(c), 1, fr) > 0) 
     printf("%c", c[0]); 

    fclose(fr); 

    return(0); 
} 

Вы также могли бы улучшить эффективность чтения файла путем изменения char c[1]; к чему-то линии char c[1024]; и обновление заявление в то время как:

while (fread(c, sizeof(char), 1023, fr) > 0) 
    { 
     c[1023] = '\0'; 
     printf("%s", c); 
    }; 
+0

Обратите внимание, что чтение более чем в 1 байт за раз, а затем с использованием printf предполагает, что входной файл является текстовым файлом без символов NULL. –

0

Вы читаете байт, но при попытке напечатать его с %s, которая ожидает строку с завершающим нулем. Изменив это на %c (и, конечно, c до *c, чтобы он соответствовал строке формата!) Должен исправить ситуацию.

Особенно если значение байт вы прочитанные равно 0, printf с %s спецификатором будет выводить абсолютно ничего (как он думает, что вы неоднократно просили его напечатать пустую строку).

+0

extract.c: 30: предупреждение: формат «% с» рассчитывает ввести «Int», но аргумент 2 имеет тип «символ *» Getting, что ошибка d он все равно ничего не печатает – SuperString

+0

@SuperString: Из этого следует, что вам нужно изменить 'c' на' * c', чтобы он соответствовал спецификатору формата. Также попробуйте напечатать '* c' с'% d' - это, возможно, нулевые байты? – Jon

1

вы не можете печатать с %s, так как ваша строка должна быть пустой, и у вас есть только один символ. использование:

 printf("%c",*c); 

не все символы печати, проверьте в ascii table, чтобы увидеть, какие печати и какие нет. например, печать 0 не будет печатать что-либо на экране, AFAIK

+0

по-прежнему ничего не печатать – SuperString

0

printf("%s",blabla) должен печатать строку с нулевым символом. для печати один знак использование printf("%c",c[0]).

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