如何克服读取大文件(超过1GB)时的内存错误——C/ c++

How to overcome Memory error when reading large file (over 1GB) -- C/C++

本文关键字:错误 内存 c++ 超过 克服 何克服 读取 文件 1GB      更新时间:2023-10-16

我试图读取超过1GB的文件(其中有1,157,421,364字节),它在使用fread()函数时给出内存错误,但当我使用fgets()函数时工作得很好。注意:我混合了C和c++ .

有人能帮我克服这个记忆错误,我做错了什么吗?

Thanks in advance…

Error is "Memory Error"

<>之前 #include <iostream> #include <cstdlib> #include <cstdio> #include <cerrno> #include <cstring> void read_file2(FILE* readFilePtr){ long file_size; fseek(readFilePtr, 0L, SEEK_END); file_size = ftell(readFilePtr); rewind(readFilePtr); char *buffer; buffer = (char*) malloc (sizeof(char)*file_size); if (buffer == NULL) { fputs("Memory Error", stderr); exit(2); } long lines = 0; if (fread(buffer, 1, file_size, readFilePtr) != file_size){ fputs("Reading Error", stderr); exit(1); } char *p = buffer; while (p = (char*) memchr(p, 'n', (buffer + file_size) - p)){ ++p; ++lines; } printf("Num of lines %ldn", lines); free(buffer); } int main(int argc, char** argv){ clock_t begin_time, end_time; float time_consumed; begin_time = clock(); FILE* inputFilePtr = fopen(argv[1], "rb"); if(inputFilePtr == NULL){ printf("Error Opening %s: %s (%u)n", argv[1], strerror(errno), errno); return 1; } read_file2(inputFilePtr); end_time = clock(); time_consumed = ((float)end_time - (float)begin_time)/CLOCKS_PER_SEC; printf("Time consumed is -- %fn", time_consumed); return 0; }

你可以在块中读取文件,而不是作为一个整体读取,将所有文件读取到一个分配的缓冲区意味着你的应用程序的巨大内存分配,你真的想要吗?这是假设您不需要一次处理所有内容(这在大多数情况下是正确的)。

您通常不会像这样一次读取大文件。你使用的是缓冲读取。本质上,你在循环中不断调用fread,直到没有东西可读。