首页 > 解决方案 > 在 C 中读取大行时,由于缓冲区大小过大而导致分段错误

问题描述

需要读取的 CSV 文件很大,但每个文件只有一行(从 kb 到 gb),一大行。我尝试使用下面的代码,但最大尺寸只能达到1000000,再增加一个0result 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,....

标签: ccsvfgetsmmap

解决方案


推荐阅读