如何以编程方式读取文件中的某个字符?

时间:2014-07-30 07:26:27

标签: linux file c io json

我的C程序会写一个.json文件。 .json文件架构中很少有值是字符串,并且长度可变。

我正在使用jansson库。我将不得不阅读一个完整的.json object,否则库会引发错误。因此,除了完整的对象之外,我无法读取任何内容。我在C中使用File I/O并将字符读取到char数组。

因此,如果我静态分配数组的大小,但每个对象的字符数会有所不同。

有没有办法动态地为char数组分配字符数,以便我可以读到特定对象的结尾?

有没有办法在不知道文件中的字符数的情况下读取文件的全部内容?

我应该使用struct来编写.json文件吗?但这会产生括号,逗号和冒号的问题,这会使struct难以维持。

2 个答案:

答案 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);
相关问题