在 C 中读取大行时由于大缓冲区大小而导致分段错误

问题描述

需要读取的CSV文件相当大,但每个文件只有一行(从kb到gb),一大行。我尝试使用下面的代码,但最大大小只能通过 1000000 达到,再添加一个 0 结果为 Segmentation fault。我读到缓冲区有限制,但是有没有另一种方法可以读取那一行大行并将其放入一个 int 数组中?还是我真的需要使用mmap?非常感谢!

struct IntArrLen {
 int length;
 int max_index;
 int* arr;
};


struct IntArrLen readInt(char* str){
    struct IntArrLen intArr;
    intArr.length = 0;
    intArr.arr = NULL;

    char file_name[100];
    strcat(file_name,str);
    FILE *fp;
    fp = fopen(file_name,"r");

    if (!fp){
        return intArr;
    }

    char* token = NULL;
    // define the maximum size of line
    int max_size = 1000000;
    char row_content[max_size];
    int* arr = (int *) malloc(sizeof(int) * max_size);
    fscanf(fp,"%[^\n]",row_content);

    int count = 0;
    token = strtok(row_content,",");
    while(token != NULL){
        arr[count] = atoi(token);
        token = strtok(NULL,");
        count ++;
    }

    intArr.length = count;
    intArr.arr = (int *) malloc(sizeof(int) * intArr.length);
    memcpy(intArr.arr,arr,sizeof(int) * intArr.length);

    free(arr);
    return intArr;
}


CSV 文件是这样的:

1245,2234532,23243523,235235325,325362436,5473658658,65879659,....

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)