整容说文库 > 程序代码 > 教育资讯

有关C++ 文件I0 64的操作问题

来源:学生作业帮助网 编辑:整容说文库 时间:2020/10/24 05:39:16 程序代码
有关C++ 文件I0 64的操作问题程序代码
使用传统的 
fread 
_write 
操作,现在遇到的问题是文件不能超过2G,如何能突破这个限制?
似乎找不到详细的64位文件IO操作的范例。
VC++ 大文件读写(大于4G)
以前见过有个CFile64的类,支持大文件的读写,你找找看,或许对你有用
我大都用CFile,凡涉及文件位置和字节数的通通用 ULONGLONG,都正常。
经常使用8、9个G大小的文件,没遇到这问题。
我需要的是使用_fseeki64调用的方式,有例子吗?
MFC 的你参考一下,我刚写了几行代码。

ULONGLONG* buf = new ULONGLONG[65536];
CFile f;
f.Open(_T("d:\\test.ttt"),CFile::modeCreate|CFile::modeWrite);
for(ULONGLONG i=0; i<32768; i++)
{
for(ULONGLONG j=0; j<65636; j++)
{
buf[i] = i*65536ull + j;
}
f.Write(buf,sizeof(ULONGLONG)*65536);
}
f.Close();
delete [] buf;


这几行代码在D:创建一个16G的文件。

等下我试试 seek
ULONGLONG ull,pos;
pos = 65536ull*65536ull*2;
CFile f;
f.Open(_T("d:\\test.ttt"),CFile::modeRead);
ULONGLONG p = f.Seek(pos,CFile::begin);
f.Read(&ull,sizeof(ULONGLONG));
f.Close();

在8G的位置读取一个数,seek是成功的,p是8G的位置,但是读出来的数不知道怎么是65535呢?你再看看,我还没吃饭呢。等会儿再说。
我要的是fopen等等传统的C++的文件系统范例,不是MFC的
设置文件指针到某个指定的位置。
int fseek( 
   FILE *stream,
   long offset,
   int origin 
);
int _fseeki64( 
   FILE *stream,
   __int64 offset,
   int origin 
);

获取当前文件指针位置。 
long ftell( 
   FILE *stream 
);
__int64 _ftelli64( 
   FILE *stream 
);
 

用法和你现在用的应该没区别,就参数的变量类型不一样。
可否给出一个示范例子,感觉不是那么容易只换个函数名那么简单
最下面是MSDN官方fseek()的示例:
你只需要把fseek的地方替换成_fseeki64就好了。
至于偏移量offset,fseek是long型,_fseeki64是__int64型,
其他没区别了呀。
具体的你可以查看MSDN这两个函数的说明。
这里最简单的贴出官方对返回值的说明:
Return Value
If successful, fseek and _fseeki64 returns 0. Otherwise, it returns a nonzero value. On devices incapable of seeking, the return value is undefined. If stream is a null pointer, or if origin is not one of allowed values described below, fseek and _fseeki64 invoke the invalid parameter handler, as described in Parameter Validation. If execution is allowed to continue, these functions set errno to EINVAL and return -1.
可见使用的地方其实是一样的了。

// crt_fseek.c
// This program opens the file FSEEK.OUT and
// moves the pointer to the file's beginning.
 
#include <stdio.h>

int main( void )
{
   FILE *stream;
   char line[81];
   int  result;

   if ( fopen_s( &stream, "fseek.out", "w+" ) != 0 )
   {
      printf( "The file fseek.out was not opened\n" );
      return -1;
   }
   fprintf( stream, "The fseek begins here: "
                    "This is the file 'fseek.out'.\n" );
   result = fseek( stream, 23L, SEEK_SET);
   if( result )
      perror( "Fseek failed" );
   else
   {
      printf( "File pointer is set to middle of first line.\n" );
      fgets( line, 80, stream );
      printf( "%s", line );
    }
   fclose( stream );
}
你把
该回复于2011-02-24 09:02:36被版主删除
http://topic.csdn.net/t/20050110/16/3713662.html类似的帖子,不妨看一下
这个问题一般不常用,最好不要在32位机上这样操作,有些意想不到的问题
程序代码