我正在从标准输入读取文件名,该函数返回完全错误的内容。下面的代码返回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);
}
}
答案 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);