导航:首页 > 文件教程 > fread大文件读取

fread大文件读取

发布时间:2023-05-15 15:57:14

㈠ fread函数怎么读取文件的全部内容

fread是一个函数。从一个文件流中读数据,最多读取count个元素,每个元素size字节,如果调用成功返回实际读取到的元素个数,如果不成功或读到文件末尾返回 0。 函数原型 size_t fread ( void *buffer, size_t size, size_t count, FILE *stream)...

㈡ 文件函数fread()获取文件的内容的问题,在线等,急啊!

fread的原型见353951452的回答。
我建议可以这样写:
//声明用到的变量
unsigned char fa[3];
unsigned short ret;
unsigned short idx;
//从文件中读取最多两个字节的数据
ret=fread(fa, 1, 2, fp);
//根据返回的读取到的数据数量,按十六进制的方式和相应的ASCII方式打印出来。
for (idx=0;idx<ret;idx++) {
printf("0x%02x(%c) ", fa[idx], fa[idx]);
}
printf("\n");

㈢ C语言 用fread读文件的大小

使用fseek(fh, 0, SEEK_END)到文件末尾,然后调用ftell(fh),得到的就是文件大小。

㈣ fread大概只能读10k

错误原因:
你用文本方式打开了二进制文件

文本方式读取二进制数据, 可能在文件结束之前将某段数据判定为文件末尾EOF, 所以结束读取( 举个例子, 比如遇到 0x00 0x00 0xff 0xff, 则文本方式方式的文件流, 认为已经到文件末尾, 不能读取)

你这个38016的文件, 大概在10k左右有段数据和文件结束标志格式相同, 文本方式读取到10k左右就认为文件结束了( 真正的文本文件, 结束标志可能在磁盘簇的剩余空间中 )

所以第一种方式:
固定读取38016次, 每次往新文件中写一个字节; 前10k次能读取到内容, fread返回值是1, 这样写过去的一字节就是读取的字节; 后28k因为读取失败, fread返回值为0, 这样temp的内容就不会被改写, 仍然是最后一次成功读取的值, 但因为是写次数固定, 所以后28k就重复写过去;
后一种方式:
根据fread的返回值来判定文件结束, 这是正确的方法; 所以读取到10k后, 返回值为0, 表示无效, 文件结束, 所以只复制了10k内容

CFile只支持二进读写, 所以你的结果是正确的( CFile用CFile::typeText格式会报错; CStdioFile才能文本读写)
用fopen返回的FILE, 如果读取的时候没有加b( 比如"r"), 则默认的是文本格式; 所以请用"rb"来读取二进制文件, 用"wb"写二进制文件; 当然如果只是复制文件的话, 纯二进制读写没有问题

下面是楼主要的效果, 是一个字节读写的
#include <stdio.h>
int main()
{
FILE *pFileS = fopen( "s.rar", "rb" );
if( ! pFileS )
return 1;
FILE *pFileD = fopen( "d.rar", "wb+" );

unsigned char bTemp;
while( fread( &bTemp, sizeof(unsigned char), 1, pFileS) )
fwrite( &bTemp, sizeof(unsigned char), 1, pFileD );

fclose( pFileS ), fclose( pFileD );
return 0;
}
其实一个字节读写的话, 用fgetc和fputc就可以了, 当然还是得以二进制方式打开

另外单字节读写速度太慢; 系统中复制文件都是整块读写的, 设置缓冲大小
比如
#include <stdio.h>
int main()
{
FILE *pFileS = fopen( "s.rar", "rb" );
if( ! pFileS )
return 1;
FILE *pFileD = fopen( "d.rar", "wb" );

unsigned char buffer[ 4 * 1024 ];
int nRead;
while( nRead = fread( buffer, sizeof(unsigned char), sizeof(buffer), pFileS ) )
fwrite( buffer, sizeof(unsigned char), nRead, pFileD );

fclose( pFileS ), fclose( pFileD );
return 0;
}

另外, fread单次读取的总字节数有限制, 也就是说缓冲有上限; 只能通过提高次数来读取大文件; 在这方面, 用API如ReadFile或者调用了这些API的封装类就好得多; 当然, 次数多对电脑来说不是问题呵呵

附:
至于文本方式不能完全读取, 而二进制方式能的原因-
文本方式读取文件, 最主要的用处是一次读取一整句( 以换行符'\n', 即二进制的换行标志"\r\n"结束 ), 方便用于特殊用处ReadString、fscanf(...,"%s",...)之类, 每次读取的内容长度是不定的; 而二进制读取方式Read、fread等, 都是读取固定长度
所以文本方式读取对EOF的判定, 是一个文件尾结束标志, 如果是文本文件, 则这个文件尾肯定不会出现在文件内容中( 因为是不可打印字符构成的结束标志, 人可读的文本文件不会包括它 ), 这样以结束标志为文件尾则是可以的; 二进制文件内容可以是任意字节, 如果把它当文本文件来读, 以文件尾为结束, 当然可能出现把文件内容判定为文件尾的情况;
二进制读取方式由于每次读取固定字节, 所以只需要用总文件长度( 这个数值是系统管理的数值, 不是计算得出来的 )减去每次读取的长度( 或根据Seek的位置计算长度 ), 就可以知道是否到文件尾, 不需要定义结束标志; 所以用二进制方式打开任何文件都是合理的

阅读全文

与fread大文件读取相关的资料

热点内容
mpf格式文件夹显示浏览器图标 浏览:359
图纸上可以看哪些数据 浏览:546
手机转发文件在哪里 浏览:445
扫描版pdf文件如何删减内容 浏览:95
秀米在哪里加psd文件 浏览:760
津e通app在哪里下载 浏览:95
钉钉app如何进入公司 浏览:974
苹果6plus不是官网维修靠谱吗 浏览:19
手机中的应用程序在哪个文件夹 浏览:27
联想windows7如何重新连接网络 浏览:716
兰州找租房哪个app最靠谱 浏览:641
PP助手怎么样可以下载苹果软件嘛 浏览:172
macxip文件 浏览:190
手机是大众化的通讯工具 浏览:95
linux查看mysql密码 浏览:456
win10卡的文件看不到 浏览:375
什么数据能反映中等水平 浏览:704
胎儿b超数据长和宽是哪个 浏览:522
女装批发哪个网站好 浏览:345
金士顿有系统迁移工具 浏览:86

友情链接