linux fopen打开大于2G文件出错的解决方法 (踩了一个大坑)

当在Linux 32位系统中尝试使用fopen打开超过2GB的文件时遇到问题,可以通过定义宏_FILE_OFFSET_BITS为64、修改编译选项或使用fopen64来解决。在makefile或Qt的pro文件中设置相应的编译标志可确保能正确处理大文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先说点题外话, 最近某模块缩容, 导致单机任务堆积, 超过了2G,  fopen就失败了。 开始怀疑是文件权限问题, 但排查后, 发现不是, 但依然找不到原因, 后来某哥敏锐地发现, 文件的值在2G左右, 于是怀疑这里有问题, 于是上网一查, 果然如此。

        我不写了, 直接转载网上文章描述这个问题, 转载地址:

        http://blog.163.com/qimo601@126/blog/static/158220932013921758707/

 

 

 

 

       因项目从windows移植过来,有些打开文件函数失败。在linux32位机器上用如下办法都可以解决。

最简单的当然是第一种,亲测。

 

      正常32位linux系统打开大于2G的文件会报错,解决办法:

一、定义宏 

//   定义宏,使得可以处理大文件(>4GB)   (凡是用到得地方,都要引入这个宏定义。所以需要单独写在一个.h文件里)
  #undef   _FILE_OFFSET_BITS   
  #define   _FILE_OFFSET_BITS   64   
  #include   <unistd.h>   
  #include   <dirent.h>

 

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

 (Qt可以在pro文件里修改DEFINES += _FILE_OFFSET_BITS=64 _LARGE_FILE,自动会在makefile中生成如上格式的参数)

linux fopen打开大于2G的文件 - 柳北风儿 - 柳北风儿~~~~~~~欲宇仙炅

 

三、使用fopen64函数

 

四、在使用fopen等函数的加上一个参数:

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

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

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

 

 

参考:

1、linux fopen打开大文件

2、LINUX下写大文件—fopen/fprintf,open/write怎么写大文件

3、linux环境下读写超过2G的大文件

4、linux中打开大文件的问题(大于4G)

 

https://blog.youkuaiyun.com/stpeace/article/details/65936048

<think>我们被要求用C语言在Linux环境下使用fopen函数创建文件。 根据C语言标准库,fopen函数用于打开一个文件,并返回一个文件指针。如果文件不存在,且使用写入模式(如"w"或"a"),则fopen会创建该文件。 步骤: 1. 包含头文件:stdio.h 是必须的,因为fopen和fclose等函数都在其中声明。 2. 使用fopen函数,指定文件名和打开模式。创建文件我们通常使用"w"(写入)模式,如果文件存在则清空,不存在则创建。 3. 检查文件指针是否为空,以确保文件打开(创建)成功。 4. 使用完毕后,使用fclose关闭文件。 注意:在Linux下,我们还需要注意文件权限。使用fopen创建的文件权限通常是0666(即rw-rw-rw-),但实际权限会受到umask的影响,所以最终权限是0666 & ~umask。 示例代码: */ #include <stdio.h> int main() { FILE *fp; // 声明文件指针 // 使用fopen创建文件,模式为"w"(写入) fp = fopen("example.txt", "w"); // 检查文件是否成功打开(创建) if (fp == NULL) { printf("文件创建失败!\n"); return 1; } // 文件创建成功,我们可以进行写操作,这里我们只创建文件,不写入内容,所以直接关闭 fclose(fp); printf("文件创建成功!\n"); return 0; } /* 说明: - 运行此程序后,会在当前工作目录下创建一个名为"example.txt"的文件。 - 如果程序没有权限在当前目录创建文件(比如目录不可写),那么fopen会失败。 引用说明:我们参考了C标准库中关于fopen的用法[^1]。 接下来,根据指令,我们需要生成相关问题。 */ §§相关问题§§ 1. 如何在Linux下使用C语言向新创建的文件中写入内容? 2. 在Linux C编程中,fopen函数有哪些常用的打开模式? 3. 如何检查文件是否成功创建并处理可能出现的错误? 4. 在Linux中,使用fopen创建文件时如何设置文件权限?</think>以下是在Linux环境下使用C语言通过`fopen`函数创建文件的完整示例: ```c #include <stdio.h> int main() { // 使用fopen创建文件(写入模式) FILE *file = fopen("example.txt", "w"); // 检查文件是否成功创建 if (file == NULL) { printf("文件创建失败!\n"); return 1; // 返回错误代码 } // 写入内容到文件(可选) fprintf(file, "这是一个通过fopen创建的文件\n"); // 关闭文件 fclose(file); printf("文件创建成功!\n"); return 0; // 正常退出 } ``` ### 关键说明: 1. **`fopen`函数**: - 第一个参数是文件名(`"example.txt"`) - 第二个参数`"w"`表示写入模式: - 文件不存在时自动创建 - 文件存在时清空内容 - 其他常用模式: - `"a"`:追加模式(文件不存在时创建) - `"r"`:只读模式(不创建文件2. **文件路径**: - 使用相对路径(如`"example.txt"`)将在程序运行目录创建 - 使用绝对路径(如`"/home/user/example.txt"`)创建到指定位置 3. **错误处理**: - 必须检查返回值是否为`NULL`(表示失败) - 常见失败原因: - 目录权限不足 - 路径不存在 - 磁盘空间不足 4. **文件权限**: - 新文件默认权限为`0666 & ~umask` - 通常为`rw-rw-r--`(可通过`umask`命令调整) ### 编译运行: ```bash gcc create_file.c -o create_file # 编译 ./create_file # 运行 ls -l example.txt # 验证文件 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值