从 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);
我正在从标准输入读取文件名,而函数 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);