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_tokener_parse
将NULL
在您传递无效json
标签时返回。
您可以执行以下操作。
while (fp && fgets(tmp+strlen(tmp), sizeof(tmp)-strlen(tmp), fp))
或者再有一个缓冲区并tmp
每次都附加到它。
注意:我不确定是否
json_tokener_parse
将char *
with\n
作为有效json
标签。在这种情况下,您可能需要手动\n
从缓冲区中解析出 。
推荐阅读
- c# - 如何在不阻塞所有(或其他一些)的情况下由任何并发请求触发一次?
- wordpress - Nginx通过ecs反向代理docker容器中的wordpress
- c++ - char类型声明与验证
- nuxt.js - 如何在 Vue 或 Nuxt 中设置洋红色音乐框架
- sql - 在不连续订单后排除所有后续行的方法
- android - 未检测到网络时停止 exoplayer 下载下一个数据块
- excel - VBA - 获取最后添加的工作表的名称
- javascript - 从 JavaScript 数组递归构建 JSON
- sql - 如何在 db2 查询中从字符串中获取特定值
- emacs - 将任务标记为完成后刷新议程