2011-08-27 39 views
0

我想读取超过1GB(其中有1,157,421,364字节)的文件,它会在使用fread()函数时给出内存错误,但当我使用fgets()函数时效果很好。 注:我混合了C和C++ ..如何克服读取大文件(超过1GB)时的内存错误 - C/C++

有人可以帮助我克服这个内存错误,我做错了什么?

在此先感谢...

错误是“内存错误”

 

#include &ltiostream> 
#include &ltcstdlib> 
#include &ltcstdio> 
#include &ltcerrno> 
#include &ltcstring> 

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 %ld\n", 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 -- %f\n", time_consumed); 
    return 0; 
} 
 
+2

什么是错误? –

+0

更新...它给“内存错误” – rda3mon

+1

不,我们需要错误的确切消息。但实际上这几乎足以证明不需要错误,所以请尝试下面的一些解决方案。 –

回答

4

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

+0

在这种情况下,这似乎是真的,这是计算换新。 +1 –

+0

我同意我可以阅读大块文件供我使用,有什么方法可以一次阅读吗?它直接取决于我的系统内存? – rda3mon

+0

不是直接。它也依赖于你的操作系统,以及它为每个进程分配了多少内存。如果你只是在计算行数,那么你并不需要将文件存储在应用程序内存中。 – MByD

0

你通常不会像这样一次阅读大文件。你使用了一些称为缓冲读取的东西。基本上,你不断地在循环中调用fread,直到没有什么需要阅读。

相关问题