linux fopen 读文件,LINUX下写大文件—fopen/fprintf,open/write怎么写大文件

在32位机器下,默认情况下,文件长度是off_t类型,这个可以从ftrucate的参数,从stat获取的文件属性struct stat中都可以看出文件的长度是用off_t类型表示的,即文件的长度在32位机器下默认是long int类型。

所以,默认情况下,在Linux系统下,fopen和open操作的文件大小不能超过2G。

我们制造了一个异常文件,5G左右,可以使用dd命令来构建,也可以写个脚本来构建。

我写了一段程序来测试:

#include #include #include #include #include #include #include #include

int main(int argc,char *argv[])

{

FILE *fp;

int fd;

fp = fopen("./bill_test","a+");                                                              //bill_test是一个5G左右的文件

if(fp == NULL)

{

perror("fopen bill_test fail::");

}

else

{

int ret = 0;

ret = fprintf(fp,"%s\t","bill");

if(ret < 0)

{

perror("write bill_test fail::");

fclose(fp);

exit(1);

}

fclose(fp);

}

fd = open("./bill_test",O_APPEND|O_RDWR,0666);                  //bill_test是一个5G左右的文件

if(fd == -1)

{

perror("open bill_test fail::");

}

else

{

int len=0;

len = write(fd,"hello",5);

if(len == -1)

{

perror("write bill_test fail::");

close(fd);

exit(1);

}

close(fd);

}

return 0;

}

//当使用: g++ file_test.cpp -o file_test           对源码编译后,运行结果如下:

./file_test

fopen bill_test fail::: File too large

open bill_test fail::: File too large

可以看出,在32位机器下,不能直接支持超过2G的文件。

解决方案一、

g++   -D _FILE_OFFSET_BITS=64   file_test.cpp  -o   file_test

此时在用tail  -f    bill_test,然后再运行./file_test,可以看到数据被正常的写入bill_test文件中。

解决方案二、

对与open,可以使用O_LARGEFILE参数,即:

fd   =   open("./bill_test",O_LARGEFILE|O_APPEND|O_RDWR,0666);

然后就没用问题了,但是fopen没有这个参数,只能按照方法一来解决。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值