免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 9730 | 回复: 12
打印 上一主题 下一主题

[C] 读取大于2G文件,stat [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-11-17 12:28 |只看该作者 |倒序浏览
文件大小是2G以上。想通过下面代码取得确切的值,可是没有效果。。。
请指教

long long get_file_size(const char *filename)
{
        struct stat buf;
        if(stat(filename, &buf)<0)
        {
                return 0;
        }
        return (long long)buf.st_size;
}


换成如下编译不过,struct stat64也是包含在#include <sys/stat.h>这个头文件里吧,请指教哪地方错误。
错误信息:error: storage size of 'buf' isn't known

long long get_file_size(const char *filename)
{
        struct stat64 buf;
        if(stat64(filename, &buf)<0)
        {
                return 0;
        }
        return (long long)buf.st_size;
}

论坛徽章:
0
2 [报告]
发表于 2009-11-17 12:38 |只看该作者
既然是编译不过了,那就跟2G文件也没有关系了

论坛徽章:
0
3 [报告]
发表于 2009-11-17 12:44 |只看该作者

  1. #include <sys/types.h>
  2. #include <sys/stat.h>
  3. #include <unistd.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. long long get_file_size( const char *filename )
  7. {
  8.   struct stat buf;

  9.   if( stat( filename, &buf ) < 0 ) {
  10.     return 0;
  11.   }
  12.   return ( long long )buf.st_size;
  13. }

  14. int main( int argc, char *argv[] )
  15. {
  16.   if( argc < 2 ) {
  17.     printf( "Usage: ./filesize filename\n" );
  18.     exit( 1 );
  19.   }
  20.   printf( "size is %u bytes\n", get_file_size( argv[1] ) );
  21.   return 0;
  22. }
复制代码

man 2 stat
你就知道应该include哪些文件了

论坛徽章:
0
4 [报告]
发表于 2009-11-17 12:46 |只看该作者
原帖由 churchmice 于 2009-11-17 12:38 发表
既然是编译不过了,那就跟2G文件也没有关系了

可能我说的有误。
stat函数对小于2G的文件的操作是正却的,但不能操作大于2G的,
所以,我找了stat64这个函数,可是这个函数在GCC下却编译不过。。。。。

编译选项也加了  -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64,可是还编译不过。

论坛徽章:
0
5 [报告]
发表于 2009-11-17 12:48 |只看该作者
原帖由 churchmice 于 2009-11-17 12:44 发表

#include
#include
#include
#include
#include
long long get_file_size( const char *filename )
{
  struct stat buf;

  if( stat( filename, &buf ) < 0 ) {
    return 0;
  }
  retu ...

头文件都包含了,现在是编译stat64()这个函数编译不过。。。。

论坛徽章:
0
6 [报告]
发表于 2009-11-17 13:32 |只看该作者

回复 #5 Henk2009 的帖子


  1. #define __USE_LARGEFILE64
  2. #define _LARGEFILE_SOURCE
  3. #define _LARGEFILE64_SOURCE
  4. #include <sys/types.h>
  5. #include <sys/stat.h>
  6. #include <unistd.h>
  7. #include <stdio.h>
  8. #include <stdlib.h>

  9. int get_file_size( const char *filename )
  10. {
  11.   struct stat64 buf;

  12.   if( stat64( filename, &buf ) < 0 ) {
  13.     return 0;
  14.   }
  15.   return buf.st_size;
  16. }

  17. int main( int argc, char *argv[] )
  18. {
  19.   if( argc < 2 ) {
  20.     printf( "Usage: ./filesize filename\n" );
  21.     exit( 1 );
  22.   }
  23.   printf( "Filesize is %d bytes\n", get_file_size( argv[1] ) );
  24.   return 0;
  25. }
复制代码

这个可以,直接cc就行了

论坛徽章:
0
7 [报告]
发表于 2009-11-17 13:47 |只看该作者

stat这样最恐怖。用的一个库,居然用了-D_FILE_OFFSET_BITS=64
而我调用那个库的程序,没有用这个选项,结果stat覆盖掉一片内存

论坛徽章:
0
8 [报告]
发表于 2009-11-17 16:37 |只看该作者
不需要stat64的。修改 CFLAGS,之后就可以了。


  1. CFLAGS += -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGE_FILE_SOURCE -D_LARGEFILE64_SOURCE

  2. assert(sizeof(buf.st_size) == 8)

复制代码

[ 本帖最后由 pagx 于 2009-11-17 16:40 编辑 ]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2010-02-04 11:54 |只看该作者
stat这样最恐怖。用的一个库,居然用了-D_FILE_OFFSET_BITS=64
而我调用那个库的程序,没有用这个 ...
peidright 发表于 2009-11-17 13:47


操,我也碰到这种问题了,程序一运行就崩溃了,后来将头文件一个一个减少,最后发现是 加了_FILE_OFFSET_BITS 这个宏的问题

论坛徽章:
0
10 [报告]
发表于 2010-02-04 11:56 |只看该作者
这就是精验
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP