【发布时间】:2018-03-17 06:35:26
【问题描述】:
我在这样的文件中有一个任意长度的 JSON 数组:
[ 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18 ]
我想获取整数并将它们存储在一个新数组中。
我尝试使用fscanf(f, " [ %d , ", data); 捕获第一个整数,但 fscanf 返回 -1(在 Ubuntu 终端上使用 gcc)。
格式说明符错了吗?如何跳过方括号,用逗号分隔不同的整数?
我的代码在这里:
typedef struct {
int *data;
unsigned int len;
} intarr_t;
intarr_t *intarr_load_json(const char *filename) {
if (filename == NULL) {
return NULL;
}
FILE *f = fopen(filename, "r");
if (f == NULL) {
printf("file open failed\n");
return NULL;
}
int char_input = 0;
int count = 0;
int num_count = 0;
//count the # of numbers in the file by counting # of ","
while ((char_input = fgetc(f)) != EOF) {
if (char_input == 44) {
count++;
}
}
num_count = count+1;
printf("num_count is %d\n", num_count);
intarr_t *intarr_loaded_json = malloc(sizeof(intarr_t));
if (intarr_loaded_json == 0) {
return NULL; // intarr_loaded_json malloc failed
}
if (num_count == 0) {
intarr_loaded_json->len = num_count;
intarr_loaded_json->data = NULL;
return intarr_loaded_json;
}
intarr_loaded_json->len = num_count;
intarr_loaded_json->data = malloc(sizeof(int) * num_count);
if (intarr_loaded_json->data == 0) {
printf("Malloc failed\n");
return NULL;
}
int a = 0;
int b = 0;
int i = 0;
//char temp;
int value = 0;
//printf("a is %d\n", a);
if ((a = fscanf(f, "[ %d , ", intarr_loaded_json->data + i) > 0) {
printf("got first number\n");
i++;
}
//printf("temp is %c\n", temp);
printf("a is %d\n", a);
while ((b = fscanf(f, " , %d", intarr_loaded_json->data + i)) == 1) {
i++;
printf("do while loop %d th time\n", i);
}
printf("b is %d\n", b);
// printf("intarr_loaded_json->len is %d\n", intarr_loaded_json->len);
return intarr_loaded_json;
fclose(f);
}
【问题讨论】:
-
欢迎来到 Stack Overflow。请尽快阅读 About 和 How to Ask 页面,但更紧急的是,阅读有关如何创建 MCVE (minimal reproducible example) 的信息。您提供的内容过于零碎,无法进行大量分析。我们需要更多信息来帮助您——通过提供信息来帮助我们帮助您。
-
一般来说,
scanf()-family 格式规范上的尾随空格是个坏主意。但是,它在形式上并不是不正确的,应该可以工作。令人惊讶的是*data的使用——您还没有展示data是如何定义的。使用&data或只使用data会更正常。使用*data意味着代码被传递了一个指向指针的指针,为数据分配空间,现在在所示的fscanf()调用中初始化它。但是出了点问题,报告了-1——这意味着检测到 EOF 或硬错误(f初始化是否正确?)。 -
使用一些 JSON 库。喜欢jansson 或许多其他人
-
data 是指向先前 malloc 的数组的指针(为粗心的错误道歉)。 f 是由 fopen 正确初始化的流。
-
感谢您添加代码。原来的两行代码无法解决问题;使用完整的代码,发现问题并不难。这就是 MCVE 很重要的原因。