问题:在centos5.5 32位系统上,开发的c++程序,用vfprintf 输出日志文件,发现当日志大于2G时会报错“File size limit exceeded”。开始以为ulimit问题,查看发现没有限制。

经过网上查找资料得到这样结论:在32位机器下,默认情况下,文件长度是off_t类型,这个可以从ftrucate的参数,从stat获取的文件属性struct stat中都可以看出文件的长度是用off_t类型表示的,即文件的长度在32位机器下默认是long int类型。所以,默认情况下,在Linux系统下,fopen和open操作的文件大小不能超过2G。

自己测试:程序如下

#include

#include

void WriteFormatted (FILE * stream, const char * format, ...)

{

va_list args;

va_start (args, format);

vfprintf (stream, format, args);

va_end (args);

}

int main ()

{

FILE * pFile;

int i;

pFile = fopen ("myfile.txt","w");

for(i=0;i<100000000;i++)

{

WriteFormatted (pFile,"Call with %d variable argument.\n",1);

WriteFormatted (pFile,"Call with %d variable %s.\n",2,"arguments");

}

fclose (pFile);

return 0;

}

编译执行时

[root@localhost c]# g++ writefile.cpp -o writefile

[root@localhost c]# ./writefile

File size limit exceeded

当时文件为:-rw-r--r-- 1 root root 2.0G Jun 20 22:09 myfile.txt

解决办法:

一、定义宏

// 定义宏,使得可以处理大文件(>2GB)

#undef _FILE_OFFSET_BITS

#define _FILE_OFFSET_BITS 64

#include

#include

二、在makefile编译选项里加上-D_FILE_OFFSET_BITS=64 -D_LARGE_FILE

三、使用fopen64函数

用的第二种已经写到5G了

[root@localhost c]# g++ -D_FILE_OFFSET_BITS=64  writefile.cpp -o writefile

[root@localhost c]# ./writefile

[root@localhost c]# ll -h myfile.txt

-rw-r--r-- 1 root root 5.9G Jun 20 22:41 myfile.txt

linux 生成2g文件吗,linux 32位系统 c++写大于2G文件相关推荐

  1. 如果知道dll文件是面向32位系统还是面向64位系统的?

    http://www.cnblogs.com/qguohog/archive/2011/09/13/2174897.html 在发布dll时,可以选择编译为x86模式.x64模式以及Any Cpu模式 ...

  2. (转)如果知道dll文件是面向32位系统还是面向64位系统的?

    本文为转载文章,原文地址:http://www.cnblogs.com/qguohog/archive/2011/09/13/2174897.html,仅仅是记录供后续使用,如有侵权请通知删除. 在发 ...

  3. 给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中的32位整数

    给定一个最多包含40亿个随机排列的32位整数的顺序文件,找出一个不在文件中的32位整数.            1.在文件中至少存在这样一个数?            2.如果有足够的内存,如何处理? ...

  4. Visual Studio Code 1.36 发布,结束对 Linux 32 位系统的支持

    Visual Studio Code 六月份更新之 1.36 已发布. 先看看有哪些更新亮点: 隐藏/显示状态栏项目 - 在状态栏只展示你选择的项目 优化文件资源管理器中的缩进结构 - 清晰地高亮显示 ...

  5. 发行版中的i386/i686/x86-64的区别: i386用来处理32位系统,i686是i386的下集;x86-64用来处理64位系统。 linux发行版中的i386/i686/x86-64各自含

    发行版中的i386/i686/x86-64的区别: i386用来处理32位系统,i686是i386的下集:x86-64用来处理64位系统. linux发行版中的i386/i686/x86-64各自含义 ...

  6. linux实用技巧:ubuntu16.04 64位系统安装32位系统兼容包并修改dash(缺省)为bash

    需求 ubuntu16.04 64位系统安装32位系统兼容包并修改dash(缺省)为bash 命令行操作 在linux系统安装32位兼容包:         sudo apt-get install ...

  7. linux 2g内存 64系统怎么样,电脑2g内存能装64位系统吗|2g内存装64位系统好不好

    大家都知道,电脑有32位和64位之分,而如果在电脑配置硬件可以的话,64位系统处理速度远超32位系统,所以很多人就想给电脑装64位系统,但是对于硬件配置相对比较低,比如电脑只有2g内存,那么电脑2g内 ...

  8. sql2005性能优化(在32位系统上突破2G内存使用量的方法)

    服务器磁盘为(SAS)IBM组成RAID0+1,SQL2K5只识别4G内存,实际只占用2G内存.而使用 AWE的话,应用程序可以直接将操作系统允许的最大物理内存量保留为未分页的内存.使用 AWE 使  ...

  9. 让32位应用程序不再为2G内存限制苦恼

    让32位应用程序不再为2G内存限制苦恼 分类: VC++ 2009-09-21 17:57 8303人阅读 评论(6) 收藏 举报 windows winapi token server null a ...

最新文章

  1. word怎么设置图片编号(图片下标,图片标签,图片序号,图片注释,题注)(交叉引用)
  2. velocity模板引擎 -- java.io.FileNotFoundException: velocity.log (Permission denied)
  3. Java Web 程序设计----基于SSM框架(正在更新中)
  4. 【HihoCoder - 1850】字母去重 (字符串,思维)
  5. SpringBoot的整合————一些常用工具类依赖及用法总结
  6. 程序员都该懂的 UML 规范!
  7. 几何学在计算机中应用,分形几何在计算机图形学中的应用
  8. Gitblit安装遇到的一些问题
  9. 7月1号连连支付不能提现PayPal了,以后PayPal怎样提现?
  10. 10 个错过即损失的智能合约开发者工具
  11. CAD.net二次开发之图层,文字样式,标注样式,标注封装,引线的封装
  12. 单元测试利器-Mockito 中文文档
  13. redis设计秒杀活动图解
  14. 关于wireshark包体的中文解码
  15. 给网站添加优质内容的25种方式
  16. WatchGuard 防火墙封 Msn qq icq
  17. 数学在计算机方面的应用论文参考文献,数学论文参考文献
  18. 【Blender批量合并fbx动画到单个gltf】
  19. QString,QByteArray和QBitArray之间的转换(原创)
  20. 计算机应用有作业吗,计算机应用基础_作业1

热门文章

  1. Head First 设计模式 —— 单例模式(Singleton)
  2. 存储与主板的外设接口
  3. 【辨异】 —— 带宽与宽带
  4. 面向对象 —— 结构与设计
  5. android gpu 编程,Android设备上的GPU编程
  6. 不小心合并了icloud通讯录_苹果手机号码被删除如何恢复?找回通讯录的具体步骤...
  7. 在电脑上安装python-在电脑上安装python的方法
  8. 学了python能干啥举例-Python爬虫学了可以做什么工作?
  9. 当输入法语音识别准确率达97%是怎样一种体验?
  10. 语音识别介绍(上篇)