用C读写大文件

时间:2013-04-13 13:14:41

标签: c io

我想知道以下代码中的问题。这用于首先打开一个大小为800Mb的文件来填充名称变量,然后通过读取另一个文件中的索引来访问存储在其中的数据。问题是在读取并填充数组名称后,从中访问任何元素会产生seg错误。当在较小的数据大小上测试相同的代码时,它起作用。可能是什么原因?我运行的硬件是intel i5芯片上的4GB RAM,32位linux版本。

#include <stdio.h>
#define MAXINT 61578414
int main(int argc,char** argv){
    printf("Starting \n");    

    FILE* fp1 = fopen(argv[1],"r");
    FILE* fp2 = fopen(argv[2],"r");


    char** name;
    name = (char**)malloc(MAXINT*sizeof(char*));

    char* tname;

    int i = 0;
    int tmp1;


    //reading to fill in name
    while(i < MAXINT){
        name[i] = (char*)malloc(20);
        fscanf(fp1,"%d%s",&tmp1,name[i]);
        i++;
    }

    //accessing elements from  name
    int i1,i2;
    while(!feof(fp2)){
        fscanf(fp2,"%d%d",&i1,&i2);
        fprintf(stdout,"%s %s\n",*(name+i1),*(name+i2));
    }

}

3 个答案:

答案 0 :(得分:1)

您分配name时存在一个潜在问题。

char** name;
name = (char**)malloc(MAXINT*sizeof(char*));

name被定义为指向指针的指针,指针是一个指针数组。代码分配MAXINT个指针数,这是一个非常大的数字。您需要检查是否已成功分配next或删除了NULL指针,即malloc是否成功。

同样,还应检查name[i] = malloc(20) NULL指针,因为系统可能会耗尽内存。

答案 1 :(得分:1)

这是在Linux上吗?在这种情况下,(默认情况下)来自malloc的非NULL值不会告诉您实际上是否可以访问您请求的内存量。实际上,这意味着你可以使用malloc远远超过你可用的内存。只有当你真正访问它时,才会分配内存。

所以写一个简单的循环,它只是读取或写入你malloc的每个字节,看看是否崩溃。如果确实如此,那么这就是你的问题。

作为旁注,您是否考虑过使用mmap()来处理大文件/内存分配?

答案 2 :(得分:0)

我认为name = (char**)malloc(MAXINT*sizeof(char*));实际上失败了,你应该检查那里的NULL返回值。