gpt4 book ai didi

c - stat64 一个大(~5GB)文件

转载 作者:太空宇宙 更新时间:2023-11-04 06:10:48 25 4
gpt4 key购买 nike

在 raspbian 上,我正在尝试执行 stat/stat64 一个大文件:5.4G/tmp/some.mpg。这是代码:

#include <stdio.h>
#define __USE_LARGEFILE64
#define _LARGEFILE_SOURCE
#define _LARGEFILE64_SOURCE
#include <sys/stat.h>

int main(){
char filename[] = "/tmp/some.mpg";
struct stat64 myst;
int x = stat64(filename, &myst );
if ( x < 0 ){
printf("x is %d\n", x);
perror("stat failure");
}
printf("%s size: %ld\n", filename, myst.st_size);

return 0;
}

但是当我运行它时它显示错误信息:

$ gcc bigsize.c -D_FILE_OFFSET_BITS=64  -o bigsize
$ ./bigsize
/tmp/some.mpg size: 1435916040
$ ls -ltr /tmp/some.mpg
-rw-r--r-- 1 XXX YYYY 5730883336 Jul 27 08:44 /tmp/some.mpg

x86_64 上这似乎工作正常,但在 armv7l 上不行

请告诉我正确的方法来完成这个,谢谢!

更新 1

这似乎有效,将 printf 从 ld 更改为 llu

#include <stdio.h>
#define __USE_LARGEFILE64
#define _LARGEFILE_SOURCE
#define _LARGEFILE64_SOURCE
#include <sys/stat.h>

int main(){
char filename[] = "/tmp/some.mpg";
struct stat64 myst;
int x = stat64(filename, &myst );
if ( x < 0 ){
printf("x is %d\n", x);
perror("stat failure");
}
printf("%s size: %llu\n", filename, myst.st_size);

return 0;
}

更新 2

在阅读了答案后,这是可行的:

#include <stdio.h>
#include <inttypes.h>

#define __USE_LARGEFILE64
#define _LARGEFILE_SOURCE
#define _LARGEFILE64_SOURCE
#include <sys/stat.h>

int main(){
char filename[] = "/tmp/some.mpg";
struct stat64 myst;
int x = stat64(filename, &myst );
if ( x < 0 ){
printf("x is %d\n", x);
perror("stat failure");
}
printf("%s size: %llu\n", filename, myst.st_size);
printf("%s size: %jd\n", filename, (intmax_t)myst.st_size);
printf("file %s is %" PRIdMAX " bytes.\n", filename, (intmax_t)myst.st_size);

return 0;
}

这样编译:

$ gcc bigsize.c  -o bigsize -Wall -Wextra ; echo $?
0

运行:

 $ ./bigsize 
/tmp/some.mpg size: 5730883336
/tmp/some.mpg size: 5730883336
file /tmp/some.mpg is 5730883336 bytes.

感谢大家!

最佳答案

问题是你告诉printf()你给它一个参数 long ,但实际上传递给它一个参数,在本例中是一个 long long ,当两种类型的大小不同时会导致未定义的行为。它适用于 x86_64 系统,因为 longlong long都是 64 位的,但我打赌 arm 系统使用 32 位 long s 和 64 位 long long

当您不知道要打印出的确切类型时,一种可移植的方法是将其转换为最大可能的类型(来自 intmax_t<stdint.h> ,并使用来自 <inttypes.h> 的打印宏来显示它:

printf("file %s is %" PRIdMAX " bytes.\n", filename, (intmax_t)myst.st_size);

关于c - stat64 一个大(~5GB)文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57233899/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com