您的位置:首页 > 其它

曾经被问到的一个问题:大文件该怎么读写

2009-08-12 14:55 260 查看
bigfile.c

#include <stdio.h>

int main(int argc,char argv[])
{
FILE *fp1,*fp2;
char buf[1024];
int nbytes;

if(argc!=3)
{
printf("wrong command/n");
exit(1);
}

if((fp1=fopen(argv[1],"rd"))==NULL)
{
perror("fail to open");
exit(2);
}

if((fp2=fopen(argv[2],"rd"))==NULL)
{
perror("fail to open");
exit(3);
}

//开始复制文件,文件可能很大,缓冲区一次装不下,所以使用一个循环进行读写
while((n=fread(buf,sizeof(char),1024,fp1))>0)
{
buf
='/0';
if(fwrite(buf,sizeof(char),n,fp2))==-1)
{
perror("fail to write");
exit(4);
}
}

if(n==1)
{
perror("fail to read");
exit(5);
}

fclose(fp1);
fclose(fp2);
}

test:
#gcc -o bigfile bigfile.c
#./bigfile testsrc.txt testdes.txt


修改流的缓冲区大小:

相关函数:setbuffer, setlinebuf, setbuf

表头文件:#include <stdio.h>

定义函数:int setvbuf(FILE *stream, char *buf, int mode, size_t size)

函数说明:在打开文件流后,读取内容之前,调用setvbuf()可以用来设置文件流的缓冲区。参数stream为指定的文件流,参数buf指向自定的缓冲区起始地址,参数size为缓冲区大小, 参数mode有下列几种
_IONBF 无缓冲IO
_IOLBF 以换行为依据的无缓冲IO
_IOFBF 完全无缓冲IO,如果参数buf为NULL指针,则为无缓冲IO

返回值 :

疑问:

fread是全缓冲的。

Linux默认分给fread用的缓冲区大小?1024?4096?如何测试?

其它环境呢?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐