Скопировать файл в массиве char [] при падении новой строки - PullRequest
1 голос
/ 12 апреля 2019

Я читаю и анализирую файл json;все работает правильно, если в файле нет новой строки;Вот код:

#include <json-c/json.h>
#include <stdio.h>
#include <string.h>

void parse_json(json_object * jobj);

int main(int argc, char* argv[]) {

    FILE *fp = fopen(argv[1], "r");
    char tmp[65000] = { 0x0 };
    if (fp == NULL) {
        perror("Error opening file");
        return (-1);
    } else {
        while (fp && fgets(tmp, sizeof(tmp), fp)) {

        }
    }
    fclose(fp);

    json_object * jobj = json_tokener_parse(tmp);
    parse_json(jobj);
}  

void parse_json(json_object * jobj) {

    printf("\n");
    enum json_type type;
    json_object_object_foreach(jobj, key, val)
    {
        type = json_object_get_type(val);
        switch (type) {
            case json_type_string:
            if (strcmp(key, "product") == 0) {
                printf("***** key found! ***** \n");
                printf("key: %s, value: %s \n", key,
                    json_object_get_string(val));
                printf("***** End keys ***** \n");
            } else {
                printf("key: %s, value: %s \n", key,
                    json_object_get_string(val));
            }
            break;
        }
    }
}

Это рабочий JSON:

{"product": "Live JSON generator"}

И это сбой JSON.

{
 "colors" :"blue"
}

Так что я думаю, что моя ошибкав части чтения файла .. Что я делаю не так?

1 Ответ

0 голосов
/ 12 апреля 2019

В случае файла с новыми строками

while (fp && fgets(tmp, sizeof(tmp), fp))
{

}

tmp будет иметь только }, так как fgets заменяет предыдущее значение.Таким образом, json_tokener_parse вернет NULL при передаче неверного тега json.

Вы можете сделать, как показано ниже.

while (fp && fgets(tmp+strlen(tmp), sizeof(tmp)-strlen(tmp), fp))

или иметь еще один буфер и добавить tmp к нему каждый раз.

Примечание: я не уверен, если json_tokener_parse принимает char * с \n в качестве действительного тега json.В этом случае вам может понадобиться вручную разобрать \n из буфера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...