【发布时间】:2023-03-08 08:35:01
【问题描述】:
我有这段代码,它读取多个文件并打印某个值。读取文件后,在某个时刻我的 while 循环停止并显示分段错误...
这是我的代码
int main () {
const char s[2] = ",";
const char s2[2] = ":";
char var1[] = "fiftyTwoWeekHigh\"";
char *fiftyhigh;
char *fiftyhigh2;
char *fiftyhigh_token;
char *fiftyhigh2_token;
char var2[] = "fiftyTwoWeekLow\"";
char *fiftylow;
char *fiftylow2;
char *fiftylow_token;
char *fiftylow2_token;
char var3[] = "regularMarketPrice\"";
char *price;
char *price2;
char *price_token;
char *price2_token;
FILE *fp;
char* data = "./data/";
char* json = ".json";
char line[MAX_LINES];
char line2[MAX_LINES];
int len;
char* fichier = "./data/indices.txt";
fp = fopen(fichier, "r");
if (fp == NULL){
printf("Impossible d'ouvrir le fichier %s", fichier);
return 1;
}
while (fgets(line, sizeof(line), fp) != NULL) {
char fname[10000];
len = strlen(line);
if (line[len-1] == '\n') {
line[len-1] = 0;
}
int ret = snprintf(fname, sizeof(fname), "%s%s%s", data, line, json);
if (ret < 0) {
abort();
}
printf("%s\n", fname);
FILE* f = fopen(fname, "r");
while ( fgets( line2, MAX_LINES, f ) != NULL ) {
fiftyhigh = strstr(line2, var1);
fiftyhigh_token = strtok(fiftyhigh, s);
fiftyhigh2 = strstr(fiftyhigh_token, s2);
fiftyhigh2_token = strtok(fiftyhigh2, s2);
printf("%s\n", fiftyhigh2_token);
fiftylow = strstr(line2, var2);
fiftylow_token = strtok(fiftylow, s);
fiftylow2 = strstr(fiftylow_token, s2);
fiftylow2_token = strtok(fiftylow2, s2);
printf("%s\n", fiftylow2_token);
price = strstr(line2, var3);
price_token = strtok(price, s);
price2 = strstr(price_token, s2);
price2_token = strtok(price2, s2);
printf("%s\n", price2_token);
//printf("\n%s\t%s\t%s\t%s\t%s", line, calculcx(fiftyhigh2_token, price2_token, fiftylow2_token), "DIV-1", price2_token, "test");
}
fclose(f);
}
fclose(fp);
return 0;
}
输出是:
./data/k.json
13.59
5.31
8.7
./data/BCE.json
60.14
46.03
56.74
./data/BNS.json
80.16
46.38
78.73
./data/BLU.json
16.68
2.7
Segmentation fault
这就像我的程序停止,因为它无法到达某个文件的某个数据......有没有办法分配更多的内存?因为我的 MAX_LINES 已经设置为 6000。
【问题讨论】:
-
输入是什么?确保返回的指针不是
NULL,然后再将它们传递到下一步。 -
输入是一个包含文件的目录。我的程序读取每个 .json 文件并打印这些文件的 3 个值(我必须在逗号和“:”之后取值)。
-
如果你将一个返回值从
fiftylow = strstr(line2, var2);传递给strtok(),即NULL,那么你就是在欺骗strtok(),让它相信它是分裂过程的延续。 -
strtok不会复制令牌。每个fgets都会覆盖该行和您的令牌。使用malloc和strcpy。 -
strdup()如果您可以访问它,它会很方便,但重要的是不要设置任意数组限制,您可能会彻底崩溃。这段代码充满了猖獗的重复,这使得它比应有的更难理解。
标签: c file segmentation-fault fgets strtok