我的C
程序会写一个.json
文件。 .json文件架构中很少有值是字符串,并且长度可变。
我正在使用jansson
库。我将不得不阅读一个完整的.json object
,否则库会引发错误。因此,除了完整的对象之外,我无法读取任何内容。我在C中使用File I/O
并将字符读取到char
数组。
因此,如果我静态分配数组的大小,但每个对象的字符数会有所不同。
有没有办法动态地为char
数组分配字符数,以便我可以读到特定对象的结尾?
或
有没有办法在不知道文件中的字符数的情况下读取文件的全部内容?
或
我应该使用struct
来编写.json文件吗?但这会产生括号,逗号和冒号的问题,这会使struct
难以维持。
答案 0 :(得分:1)
如果您有一个文件描述符,您正在从中读取json对象,则可以使用getline
通过在*lineptr=NULL
调用中设置getline
来为您动态分配所需的内存( 参见:man getline )。这将读取您的FILE输入的整行(直到换行符)。 e.g:
char *lineptr = NULL;
size_t n = 0;
ssize_t len = 0;
FILE *jsonfd;
jsonfd = fopen (filename, mode);
if (jsonfd == NULL)
exit (EXIT_FAILURE);
len = getline (&lineptr, &n, jsonfd);
printf ("read '%zd' characters: %s\n", len, lineptr);
如果您在输入中有多行,则可以将getline
来电置于while循环中:
while ((len = getline (&lineptr, &n, jsonfd)) != -1)
{
process as needed
}
您应该能够解析并将json字符串写入文件,而无需使用结构来处理数据。一旦您将信息读入您的角色阵列(上面的lineptr
),您就可以灵活地编写所需内容。
答案 1 :(得分:1)
有没有办法在不知道文件中的字符数的情况下读取文件的全部内容?
#include <stdio.h>
#include <stdlib.h>
long GetFileSize(FILE *fp){
long fsize = 0;
fseek(fp,0,SEEK_END);
fsize = ftell(fp);
fseek(fp,0,SEEK_SET);//reset stream position!!
return fsize;
}
char *ReadToEnd(const char *filepath){
FILE *fp;
long fsize;
char *buff;
if(NULL==(fp=fopen(filepath, "rb"))){
perror("file cannot open at ReadToEnd\n");
return NULL;
}
fsize=GetFileSize(fp);
buff=malloc(fsize+1);
fread(buff, sizeof(char), fsize, fp);
fclose(fp);
buff[fsize]='\0';
return buff;
}
使用jansson从文件中读取对象:
json_t *obj;
json_error_t error;
obj = json_load_file("data.json", 0, &error);