C语言读取4G大文件,fread/fseek出错。

时间:2021-05-16 19:32:12
    代码是C,环境是VC6.0,  一个二进制文件有3.79G,在读取文件的过程中,有fread和fseek,fseek包括从当前位置往前和后的偏移。  在到2G位置处,调用fread时,就出现了错误,请问下,如果解决这个问题呢?非常感谢。

29 个解决方案

#1


4G已经超过了int32能表示的最大范围,所以会出错。要用系统api来读了

#2


2楼正解


其实 fread/fwrite 是没问题的,主要是因为 fseek。
API SetFilePointer 可以支持大文件
如果是 VC,微软提供了 _fseeki64 来解决这个问题

#4


_fseeki64,我一直不知道的说,这种时候我都是api了。

#5


4G怎么读?
超出32位了

#6


你可以用_fseeki64来seek,用fread来read,但是不可以一次性读>4G的内存,你可以读4G, seek一下,读下一个4G

#7


不过_fseeki64 VC6有么?那个时代普遍使用fat32,根本不支持4G以上文件……

#8


fseeko就可以了,POSIX.1-2001建议的函数,也算是个POSIX标准了

       #include <stdio.h>

       int fseeko(FILE *stream, off_t offset, int whence);

       off_t ftello(FILE *stream);


       On many architectures both off_t and long are 32-bit types, but compilation with

              #define _FILE_OFFSET_BITS 64

       will turn off_t into a 64-bit type.

#9


引用 7 楼 jackyjkchen 的回复:
不过_fseeki64 VC6有么?那个时代普遍使用fat32,根本不支持4G以上文件……


windows NT早就普遍ntfs了, ntfs可是在windows 3.x时就引入了

#11


引用 9 楼 do_fork 的回复:
引用 7 楼 jackyjkchen 的回复:
不过_fseeki64 VC6有么?那个时代普遍使用fat32,根本不支持4G以上文件……


windows NT早就普遍ntfs了, ntfs可是在windows 3.x时就引入了


很遗憾,我装了VC6,试过了,没有……stdio.h是这个头文件么?

#12


VS2008里有_fseeki64,但是也没有fseeko

#13


引用 12 楼 jackyjkchen 的回复:
VS2008里有_fseeki64,但是也没有fseeko


vs对posix标准支持度低,不是一两天的事情了

#14


VAssistX串版本了,VC6里_fseeki64可以自动完成,但是却找不到声明

#15


就在 <stdio.h> 里面阿

#16


引用 15 楼 xingzhe2001 的回复:
就在 <stdio.h> 里面阿

VS2003/05/08都能找到声明,VC6不行……

#17


引用 7 楼 jackyjkchen 的回复:
不过_fseeki64 VC6有么?那个时代普遍使用fat32,根本不支持4G以上文件……


VC6 不清楚,
05/08 我知道肯定有的

#18


引用 16 楼 jackyjkchen 的回复:
引用 15 楼 xingzhe2001 的回复:
就在 <stdio.h> 里面阿

VS2003/05/08都能找到声明,VC6不行……


同情

#19


跟了一下, _fseeki64是调用SetFilePointer这个API实现的,vc6你就用 file api来做吧 

#20


非常感谢楼上各位的回答,但是上面所说的_fseeki64 fseeko之类的函数,我的系统中一个都没有哦

#21


引用 20 楼 gangstermxf 的回复:
非常感谢楼上各位的回答,但是上面所说的_fseeki64 fseeko之类的函数,我的系统中一个都没有哦


那你只好用一下系列函数咯:
CreateFile
ReadFile
SetFilePointer
WriteFile
CloseHandle

#22


直接用win32 api, CreateFile, SetFilePointer,ReadFile,CloseHandle

#23


注意获取文件长度的话,有高位和低位之分……也就是用两个unsigned int表示一个unsigned _int64

#24


看来也只能用API了,非常感谢楼上各位了。结贴给分,分不是很多,对不住大家了。

#25


分不在多,意思意思就可以。但很讨厌 0 分贴。

#26


.

#27


学习

#28


http://www.chkh.com/Article/HTML/24012.html

createfilemapping...4g以上注意一下技巧就好

#29


在头文件里加入#define _LARGEFILE64_SOURCE

#1


4G已经超过了int32能表示的最大范围,所以会出错。要用系统api来读了

#2


2楼正解


其实 fread/fwrite 是没问题的,主要是因为 fseek。
API SetFilePointer 可以支持大文件
如果是 VC,微软提供了 _fseeki64 来解决这个问题

#3


#4


_fseeki64,我一直不知道的说,这种时候我都是api了。

#5


4G怎么读?
超出32位了

#6


你可以用_fseeki64来seek,用fread来read,但是不可以一次性读>4G的内存,你可以读4G, seek一下,读下一个4G

#7


不过_fseeki64 VC6有么?那个时代普遍使用fat32,根本不支持4G以上文件……

#8


fseeko就可以了,POSIX.1-2001建议的函数,也算是个POSIX标准了

       #include <stdio.h>

       int fseeko(FILE *stream, off_t offset, int whence);

       off_t ftello(FILE *stream);


       On many architectures both off_t and long are 32-bit types, but compilation with

              #define _FILE_OFFSET_BITS 64

       will turn off_t into a 64-bit type.

#9


引用 7 楼 jackyjkchen 的回复:
不过_fseeki64 VC6有么?那个时代普遍使用fat32,根本不支持4G以上文件……


windows NT早就普遍ntfs了, ntfs可是在windows 3.x时就引入了

#10


#11


引用 9 楼 do_fork 的回复:
引用 7 楼 jackyjkchen 的回复:
不过_fseeki64 VC6有么?那个时代普遍使用fat32,根本不支持4G以上文件……


windows NT早就普遍ntfs了, ntfs可是在windows 3.x时就引入了


很遗憾,我装了VC6,试过了,没有……stdio.h是这个头文件么?

#12


VS2008里有_fseeki64,但是也没有fseeko

#13


引用 12 楼 jackyjkchen 的回复:
VS2008里有_fseeki64,但是也没有fseeko


vs对posix标准支持度低,不是一两天的事情了

#14


VAssistX串版本了,VC6里_fseeki64可以自动完成,但是却找不到声明

#15


就在 <stdio.h> 里面阿

#16


引用 15 楼 xingzhe2001 的回复:
就在 <stdio.h> 里面阿

VS2003/05/08都能找到声明,VC6不行……

#17


引用 7 楼 jackyjkchen 的回复:
不过_fseeki64 VC6有么?那个时代普遍使用fat32,根本不支持4G以上文件……


VC6 不清楚,
05/08 我知道肯定有的

#18


引用 16 楼 jackyjkchen 的回复:
引用 15 楼 xingzhe2001 的回复:
就在 <stdio.h> 里面阿

VS2003/05/08都能找到声明,VC6不行……


同情

#19


跟了一下, _fseeki64是调用SetFilePointer这个API实现的,vc6你就用 file api来做吧 

#20


非常感谢楼上各位的回答,但是上面所说的_fseeki64 fseeko之类的函数,我的系统中一个都没有哦

#21


引用 20 楼 gangstermxf 的回复:
非常感谢楼上各位的回答,但是上面所说的_fseeki64 fseeko之类的函数,我的系统中一个都没有哦


那你只好用一下系列函数咯:
CreateFile
ReadFile
SetFilePointer
WriteFile
CloseHandle

#22


直接用win32 api, CreateFile, SetFilePointer,ReadFile,CloseHandle

#23


注意获取文件长度的话,有高位和低位之分……也就是用两个unsigned int表示一个unsigned _int64

#24


看来也只能用API了,非常感谢楼上各位了。结贴给分,分不是很多,对不住大家了。

#25


分不在多,意思意思就可以。但很讨厌 0 分贴。

#26


.

#27


学习

#28


http://www.chkh.com/Article/HTML/24012.html

createfilemapping...4g以上注意一下技巧就好

#29


在头文件里加入#define _LARGEFILE64_SOURCE