我已经编写了代码以读取大文件内容并将该内容写入新文件。
该代码适用于中小型文件内容,但适用于大文件内容(大约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。
为什么大文件会出现此问题?
答案 0 :(得分:3)
调试器显示在行上发生std::bad_alloc
异常
strBuffer = new char[length];
似乎您正在尝试在内存中分配一个大小与您要读取的文件相同的块。由于文件大小约为1.8 GB,因此操作系统可能无法在该大小的内存中分配块。
我建议阅读this answer,了解如何处理大文件而不将所有内容存储在内存中。
答案 1 :(得分:0)
据我所知。您尝试使用free
释放内存,而使用new
分配内存。您不能混合它们。
要释放内存,请使用delete
。
现在,如果需要使用free
释放它,则必须使用malloc
分配内存。