从文件中读取大内容并将该内容写入新文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从文件中读取大内容并将该内容写入新文件相关的知识,希望对你有一定的参考价值。

我编写了代码来读取大文件内容并将该内容写入新文件。

该代码适用于中小型文件内容但具有大尺寸文件内容,大约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,因此操作系统可能无法在具有该大小的内存中分配块。

我建议阅读this answer关于处理大文件而不将所有内容存储在内存中。

另一答案

到目前为止,我可以看到。在使用free分配内存时,您正尝试使用new释放内存。你不能混合它们。

要释放内存,请使用delete

现在,如果您需要使用free释放它,则必须使用malloc分配内存。

以上是关于从文件中读取大内容并将该内容写入新文件的主要内容,如果未能解决你的问题,请参考以下文章

从 BigQuery 读取数据并将其写入云存储上的 avro 文件格式

PowerShell - 从 csv 文件读取数据,比较特定列中的数据并将结果写入新文件

从文件中读取行并将它们分成两个数字并执行计算并将它们写入文件c ++

将标准输出从 subprocess.Popen 保存到文件,并将更多内容写入文件

java读取excel文件内容,并将读取到的内容写入到另一文件中

如何将 BIM 360 文件的内容作为文件流读取并将其写入另一个流