C语言 如何打印查找后的文件内容

xfb7svmp  于 2023-01-29  发布在  其他
关注(0)|答案(4)|浏览(113)

我尝试在执行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");
  }

}
daupos2t

daupos2t1#

正如其他答案所指出的,您传递了一个不能以NULL结尾的字符串printf,也没有验证要读取的文件是否大于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];更改为something行char c[1024];并将while语句更新为以下内容来提高阅读文件的效率:

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

ttcibm8c2#

你不能用%s打印,因为你的字符串需要以空终止,而你只有一个字符。用途:

printf("%c",*c);

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

u59ebvdq

u59ebvdq3#

您正在阅读一个字节,但试图使用%s打印它,它需要一个以null结尾的字符串,将其更改为%c(当然,将c更改为*c,以便与格式字符串一致!)应该可以解决问题。
特别是当读取的字节值等于0时,带有%s说明符的printf将完全不输出任何内容(因为它认为您在重复要求它打印空字符串)。

xbp102n0

xbp102n04#

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

相关问题