C:搜索后如何打印文件内容

时间:2012-01-16 23:58:21

标签: c

您好,我正在尝试打印文件的剩余内容后,我做了一个fseek。现在我没有得到任何回报。我的代码出了什么问题?

#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");
  }

}

4 个答案:

答案 0 :(得分: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语句更新为:

来提高阅读文件的效率
    while (fread(c, sizeof(char), 1023, fr) > 0)
    {
        c[1023] = '\0';
        printf("%s", c);
    };

答案 1 :(得分:1)

您无法使用%s打印,因为您的字符串需要以空终止并且您只有一个字符。 使用方法:

      printf("%c",*c);

并非所有字符都可打印,请检查ascii table以查看哪些字符可打印,哪些不可打印。例如,打印0将不会在屏幕上打印任何内容,AFAIK

答案 2 :(得分:0)

您正在读取一个字节但尝试使用%s打印它,它需要一个以空字符结尾的字符串。将其更改为%c(当然还有c更改为*c,以便与格式字符串一致!)应该可以解决问题。

特别是如果您读取的字节值等于0,带printf说明符的%s将完全没有输出(因为它认为您反复要求它打印空字符串)。

答案 3 :(得分:0)

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