c - 在 C 中读取大行时,由于缓冲区大小过大而导致分段错误
问题描述
需要读取的 CSV 文件很大,但每个文件只有一行(从 kb 到 gb),一大行。我尝试使用下面的代码,但最大尺寸只能达到1000000
,再增加一个0
result 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,....
解决方案
推荐阅读
- python - 如何将熊猫中的一串数字转换为整数
- java - JAR 在本地 ubuntu:16.04 中运行并正常工作,但无法在 docker 中运行相同的环境
- ajax - 如何使用 json ajax 发送带有 id 的表单
- shell - 如何使用 graphicsmagick 运行/调用 shell 脚本函数
- c# - Caesar Cipher C# - 如何使用大写和小写字母
- javascript - 如何创建 2 个客户端
- java - Spring 5 控制器返回要在浏览器中加载的 html 字符串
- javascript - 如何通过同一列表中的另一个属性过滤一个属性 - 反应 js
- github - 如何移除或隐藏 Zenhub 侧边栏
- c# - 运行 t4 工具后更新项目文件