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

时间:2015-03-02 19:27:50

标签: c linux file stat

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

echo" p3test.txt" | ./totalsize

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

1 个答案:

答案 0 :(得分:4)

使用时:

while (fgets(tmpstring, 1024, stdin)) 

您获得了'\n'中的tmpstring。在调用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行终止,无论st.st_size的返回值如何,您都会返回stat

<强>更新

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

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