从 stdin 查找文件的大小给出了错误的数字

Finding the size of a file from stdin gives incorrect number

我正在从标准输入读取文件名,而函数 returns 完全错误。下面的代码 returns 4294967296 而不是应该是 7。我 运行 linux 上的文件是这样的:

回声"p3test.txt" | ./总尺寸

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <errno.h>

//find the file size
off_t filesize(const char* fileName){
    printf("%s", fileName);

    struct stat st;
    if(stat(fileName, &st) == 0)
        printf("%zd", st.st_size);
        return st.st_size;


    fprintf(stderr, "Cannot determine size of %s: %s\n",
        fileName, strerror(errno));

    return -1;

}

int main (int argc, char *argv[])
{
    char tmpstring[1024];
    const char* fileName;
    off_t size;

    while (fgets(tmpstring, 1024, stdin)) 
  {
    fileName = tmpstring;
    size = filesize(fileName);
  }
}

当您使用时:

while (fgets(tmpstring, 1024, stdin)) 

您在 tmpstring 中获得了 '\n'。 Trim 调用前名称中的那个字符 filesize

此外,行

if(stat(fileName, &st) == 0)
    printf("%zd", st.st_size);
    return st.st_size;

应该是:

if(stat(fileName, &st) == 0)
{
    printf("%zd", st.st_size);
    return st.st_size;
}

否则,if 语句在 printf 行终止,您最终 returning st.st_size 而不管 return 的值 stat.

更新

感谢@chux 的建议。格式 "%zd" 可能不适合用于 stat.st_size 的类型。你应该使用:

    printf("%jd", (intmax_t)st.st_size);