2012-01-16 66 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 sizesize_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字符的文本文件。 – 2012-01-17 00:22:45

0

您正在阅读一个字节,但试图与%s,这需要一个空结尾的字符串打印出来。将其改为%c(当然还有c*c,以便它与格式字符串一致!)应该修复这些问题。

特别是如果你读字节的值等于0printf%s符将输出绝对没有(因为它认为你反复要求它打印空字符串)。

+0

extract.c:30:警告:格式 '%C' 型预计 'INT',但实参2的类型为 '字符*' 收到这个错误的d它仍然不会打印任何信息 – SuperString 2012-01-17 00:01:47

+0

@SuperString:因此,您需要将'c'更改为'* c',以便它符合格式说明符。也可以尝试用'%d'打印'* c' - 这些可能是空字节吗? – Jon 2012-01-17 00:03:06

1

您不能使用%s进行打印,因为您的字符串需要空终止,并且只有一个字符。 使用:

 printf("%c",*c); 

不是所有的字符打印,检查一个ascii table,看看哪些是可以打印并没有。例如,打印0不会在屏幕上打印任何东西,AFAIK

+0

仍然没有打印任何内容 – SuperString 2012-01-17 00:03:14

0

printf("%s",blabla)应该打印以空字符结尾的字符串。打印一个字符使用printf("%c",c[0])