大文件操作(eg:4G)
大文件指的是超过4G的文件。在32bit机器上操作这样的大文件时,会出现问题。具体的,下面会具体讲解。
大文件问题
首先32位机器用fopen/fclose打开大文件没有问题,顺序读写操作while(!feof(fp)){ fread / fgets / fscanf }或while(1){ fwrite / fputs / fprintf} 也没有问题。由于32位机器下long是32位,故fseek (FILE *stream,longoffset, int whence)和long ftell(FILE *stream) 不能访问4G以上文件。另外,要用 fseeko(FILE *stream,off_toffset, int whence)和off_tftello(FILE *stream);代替fseek和ftell。这样,只要你用64bit的类型(off_t,long(64位机器),和longlong(32位机器) 或int64_t/uint64_t)声明offset作为fseeko的参数输入,就可以操作4G以上的文件了。
fseeko和ftello的具体说明见本文《ftello&fseeko》,在文章最后面。
注:文件open操作返回的是文件描述符,并没有将文件读入内存。文件内容只有通过read调用时才读才将相应的内容读入内存。
解决方法
类型off_t 的定义在 <sys/types.h>里面:
# ifndef __USE_FILE_OFFSET64 typedef __off_t off_t; # else typedef __off64_t off_t; # endif
off_t在32位机器中是32bit,64位机器中是64bit。那么,在32位机器中,在include之前加入宏定义:#define _FILE_OFFSET_BITS 64,或者编译是加入-D_FILE_OFFSET_BITS 64告诉系统在文件内部使用64位的偏移地址,使off_t变成__off64_t类型。然后,将ftell、fseek换成对应的ftello、fseeko就可以操作大文件了。
- 上一篇: Java中数组的初始化方式
- 下一篇: jquery里面获取div区块的宽度与高度