C语言 如果换行符,则复制 char[] 数组中的文件崩溃



我正在读取和解析一个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"
}

所以我认为我的错误是阅读文件部分。我做错了什么?

在文件带有新行的情况下

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

tmp将只有},因为fgets会覆盖以前的值。因此,当您传递无效的json标签时,json_tokener_parse将返回NULL

您可以执行以下操作。

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

或再有一个缓冲区,每次都附加tmp

注意:我不确定json_tokener_parse是否将带有n char *作为有效的json标签。在这种情况下,您可能需要手动分析缓冲区中的n

相关内容

  • 没有找到相关文章

最新更新