gpt4 book ai didi

读取 250MB 文件时 C 中的代码被杀死

转载 作者:行者123 更新时间:2023-12-02 03:06:53 25 4
gpt4 key购买 nike

我正在尝试使用 C 中的脚本处理一个 250MB 的文件。该文件基本上是一个数据集,我只想读取其中的一些列(更重要的是)将其中一个(最初是一个字符串)分解为一个字符序列。

但是,即使我有足够的 RAM 可用,每次运行时代码都会被 konsole(使用 KDE Neon)杀死。

来源如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {

FILE *arquivo;
char *line = NULL;
size_t len = 0;
int i = 0;
int j;
int k;
char *vetor[500];
int acertos[45];

FILE *licmat = fopen("licmat.csv", "w");

//creating the header
fprintf(licmat,"CO_CATEGAD,CO_UF_CURSO,ACERTO09,ACERTO10,ACERTO11,ACERTO12,ACERTO13,ACERTO14,ACERTO15,ACERTO16,ACERTO17,ACERTO18,ACERTO19,ACERTO20,ACERTO21,ACERTO22,ACERTO23,ACERTO24,ACERTO25,ACERTO26,ACERTO27,ACERTO28,ACERTO29,ACERTO30,ACERTO31,ACERTO32,ACERTO33,ACERTO34,ACERTO35\n");

if ((arquivo = fopen("MICRODADOS_ENADE_2017.csv", "r")) == NULL) {
printf ("\nError");
exit(0);
}

//reading one line at a time
while (getline(&line, &len, arquivo)) {

char *ptr = strsep(&line,";");
j=0;
//breaking the line into a vector based on ;
while(ptr != NULL)
{
vetor[j]=ptr;
j=j+1;
ptr = strsep(&line,";");
}

//filtering based on content
if (strcmp(vetor[4],"702")==0 && strcmp(vetor[33],"555")==0) {
//copying some info
fprintf(licmat,"%s,%s,",vetor[2],vetor[8]);
//breaking the string (32) into isolated characters
for (k=0;k<27;k=k+1) {
fprintf(licmat,"%c", vetor[32][k]);
if (k<26) {
fprintf(licmat,",");
}
}
fprintf(licmat,"\n");

}

i=i+1;
}

free(line);
fclose(arquivo);
fclose(licmat);

}

在脚本被终止之前,输出是完美的。输出文件只有 640KB 长,只有大约 10000 行。

可能是什么问题?

最佳答案

在我看来,您正在错误地处理由 getline() 管理的内存缓冲区 - 它根据需要分配/重新分配 - 通过使用 strsep(),这似乎操纵了相同的指针值。

一旦 line 被更新以反射(reflect)线上的一些其他元素,它就不再指向分配内存的开始,然后 boom 下一次 getline() 需要用它做任何事情。

使用不同的变量传递给 strsep():

while (getline(&line, &len, arquivo) > 0) { // use ">=" if you want blank lines
char *parseline = line;

char *ptr = strsep(&parseline,";");
// do the same thing later

这里的关键是:你不能乱用 line 的值,除了 free() 最后(你这样做),并且您也不能让任何其他例程执行此操作。

编辑:更新以反射(reflect) getline() 返回 <0 错误(h/t to @user3121023)

关于读取 250MB 文件时 C 中的代码被杀死,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58754567/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com