亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標(biāo)題: 讀取大于2G文件,stat [打印本頁]

作者: Henk2009    時間: 2009-11-17 12:28
標(biāo)題: 讀取大于2G文件,stat
文件大小是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;
}
作者: churchmice    時間: 2009-11-17 12:38
既然是編譯不過了,那就跟2G文件也沒有關(guān)系了
作者: churchmice    時間: 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. }
復(fù)制代碼

man 2 stat
你就知道應(yīng)該include哪些文件了
作者: Henk2009    時間: 2009-11-17 12:46
原帖由 churchmice 于 2009-11-17 12:38 發(fā)表
既然是編譯不過了,那就跟2G文件也沒有關(guān)系了

可能我說的有誤。
stat函數(shù)對小于2G的文件的操作是正卻的,但不能操作大于2G的,
所以,我找了stat64這個函數(shù),可是這個函數(shù)在GCC下卻編譯不過。。。。。

編譯選項也加了  -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64,可是還編譯不過。
作者: Henk2009    時間: 2009-11-17 12:48
原帖由 churchmice 于 2009-11-17 12:44 發(fā)表

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

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

頭文件都包含了,現(xiàn)在是編譯stat64()這個函數(shù)編譯不過。。。。
作者: churchmice    時間: 2009-11-17 13:32
標(biāo)題: 回復(fù) #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. }
復(fù)制代碼

這個可以,直接cc就行了
作者: peidright    時間: 2009-11-17 13:47

stat這樣最恐怖。用的一個庫,居然用了-D_FILE_OFFSET_BITS=64
而我調(diào)用那個庫的程序,沒有用這個選項,結(jié)果stat覆蓋掉一片內(nèi)存
作者: pagx    時間: 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)

復(fù)制代碼

[ 本帖最后由 pagx 于 2009-11-17 16:40 編輯 ]
作者: cookis    時間: 2010-02-04 11:54
stat這樣最恐怖。用的一個庫,居然用了-D_FILE_OFFSET_BITS=64
而我調(diào)用那個庫的程序,沒有用這個 ...
peidright 發(fā)表于 2009-11-17 13:47


操,我也碰到這種問題了,程序一運行就崩潰了,后來將頭文件一個一個減少,最后發(fā)現(xiàn)是 加了_FILE_OFFSET_BITS 這個宏的問題
作者: prolj    時間: 2010-02-04 11:56
這就是精驗
作者: cookis    時間: 2010-02-04 13:14
這就是精驗
prolj 發(fā)表于 2010-02-04 11:56



prolj 精驗 不少啊
作者: lsxlyan    時間: 2010-02-09 11:32
32bit Linux 的話,在編譯選項中加入 -D_FILE_OFFSET_BITS=64 -D_LARGE_FILE就可以了,不需要用fopen64和stat64。
64bit的話,就更簡單了,什么都不用就能讀2G以上大文件。
作者: lhhsoft    時間: 2011-08-09 12:46
CFLAGS += -D_FILE_OFFSET_BITS=64 -D__USE_LARGEFILE64 就可解決。。。




歡迎光臨 Chinaunix (http://72891.cn/) Powered by Discuz! X3.2