c++ - 从文件中读取大内容并将该内容写入新文件
问题描述
我编写了代码来读取大文件内容并将该内容写入新文件。
该代码适用于中小型文件内容,但对于大约 1.8GB 及以上的大文件内容,它不起作用,并且在运行时给我一个未知的错误/异常。
另外,我尝试过调试,调试结果如下:
编码:
char * myClass::getFileContent(const char * fileName) {
std::ifstream file(fileName, std::ios::binary|std::ios::ate);
if (!file.is_open()) {
perror(strerror(errno));
return "";
}
char * strBuffer = NULL;
long long length = file.tellg();
strBuffer = new char[length];
file.seekg(0, std::ios::beg);
file.read(strBuffer, length);
return strBuffer;
}
// The implementation
char *fileName = "C:\\desktop-amd64.iso";
char *fileContent = myClass.getFileContent(fileName);
ofstream file("c:\\file.iso", ios::binary);
if (file.is_open()) {
file.write(fileContent, myClass.getFileSize(fileName));
file.close();
}
delete fileContent;
注意:我在 Windows 7 x64 上使用 Visual Studio 2015。
为什么大文件会出现这个问题?
解决方案
调试器显示该std::bad_alloc
行发生异常
strBuffer = new char[length];
您似乎正在尝试在内存中分配一个大小与您尝试读取的文件相同的块。由于文件的大小约为 1.8 GB,因此操作系统可能无法在内存中分配具有该大小的块。
我建议阅读这个关于处理大文件而不将所有内容存储在内存中的答案。
推荐阅读
- python - 在分配“默认”值时检查是否存在非顺序列表索引
- ruby-on-rails - Fresh Rails 6.0.0 在执行“捆绑安装”后中断
- java - java将json发送到php并插入mysql,但返回null
- sql - 在sql中的case语句中设置多个变量值
- java - Spring RequestMapping Regex 排除字符串
- jmeter - 将 java 代码转换为 beanshell 采样器 (JMETER)
- r - 通过 NoData 拆分数值向量
- amazon-web-services - AWS 转录 | 无法通过 SDK 使用表格创建自定义词汇表
- hazelcast - 如果为区域配置了 MapLoader 的后写队列,它们是否会持久保存到 Hazelcast 热重启存储
- android - 在 Android ARCore 中检测二维码