小记
笔记
cJSON是啥
cJSON是一种JSON解析,轻量级
cJSON函数
cJSON_Parse
作用:将一个JSON字符串,按照cJSON结构体的结构序列化整个数据包,并在堆中开辟一块内存存储cJSON结构体。
返回值:成功返回一个指向内存块中的cJSON的指针,失败返回NULL。
cJSON_Delete
作用:释放位于堆中cJSON结构体内存。
返回值:无
注意:在使用cJSON_Parse()获取cJSON指针后,若不再使用了,则需要调用cJSON_Delete()对其释放,否则会导致内存泄漏。
cJSON_Print
作用:将cJSON数据解析成JSON字符串,并在堆中开辟一块char*的内存空间存储JSON字符串。cJSON_PrintUnformatted()与cJSON_Print()类似,只是打印输出不带格式,而只是一个字符串数据。
返回值:成功返回一个char*指针该指针指向位于堆中JSON字符串,失败返回NULL。
注意:通过cJSON_Print()可以将cJSON链表中所有的cJSON对象打印出来,但是需要手动去释放对应的资源:free(char *)。
cJSON_PrintUnformatted
作用:无格式打印方式打印
cJSON_GetObjectItem
作用:从object的cJSON链中寻找key为string的cJSON对象。
返回值:成功返回一个指向cJSON类型的结构体指针,失败返回NULL。
简单应用一下
#include<stdio.h>
#include"cJSON.h"
#include <stdlib.h>
/*
{
"interface": "/dev/ttyS0",
"speed": 9600,
"parity": "N",
"databits": 8,
"stopbits": 1,
"interval": 1000,
"delay": 2,
"dervices": []
}
*/
int main(){
//模拟前台传参
char interface[]="/dev/ttyS0";
int speed=9600;
char parity[]="N";
int databits=8;
int stopbits=1;
int interval=1000;
int delay=2;
char *cjson_str = NULL;
cJSON * target=cJSON_CreateObject();
cJSON * devices = cJSON_CreateArray();
cJSON_AddItemToObject(target,"interface",cJSON_CreateString(interface));
cJSON_AddItemToObject(target,"speed",cJSON_CreateNumber(speed));
cJSON_AddStringToObject(target,"parity",parity);
cJSON_AddNumberToObject(target,"databits",databits);
cJSON_AddNumberToObject(target,"stopbits",stopbits);
cJSON_AddNumberToObject(target,"interval",interval);
cJSON_AddNumberToObject(target,"delay",delay);
cJSON_AddItemToObject(target,"dervices",devices);
cjson_str = cJSON_Print(target);
printf("%s\n",cjson_str);
}
输出:
然后将字符串写入target.json文件
FILE *fd=NULL;
fd=fopen("target.json","w+");
fprintf(fd, "This is testing for fprintf...\n");
fputs(cjson_str, fd);
这里有讲c对文件的读写操作的教程:
https://www.runoob.com/cprogramming/c-file-io.html
再实现从target.json中讲json数据提取出来:
//这是以字符串数组的方式提取
char buf[255];
FILE *fd=NULL;
fd=fopen("target.json","r+");
while(fgets(buf,1024,fd)!=NULL){
printf("%s",buf);
}
printf("\n");
//尝试了一下用字符数组提取
void read(){
char * r[1000];
char buf;
FILE *fd=NULL;
int len;
int i=0;
fd=fopen("target.json","r+");
//while(fgets(buf,1024,fd)!=NULL){
while(!feof(fd)){
fscanf(fd, "%c", &buf);
printf("%c",buf);
if(i==4){
break;
}
i++;
//break;
//r[i]=buf;
//printf("%d\n",i);
//i++;
}
// for(int i=0;i<sizeof(r);i++){
// printf("%s",r[i]);
// }
printf("\n");
}
这里我提取了前五个字符:
fopen和open的区别
https://www.cnblogs.com/hnrainll/archive/2011/08/16/2141365.html
open 是系统调用 返回的是文件句柄,文件的句柄是文件在文件描述副表里的索引,fopen是C的库函数,返回的是一个指向文件结构的指针。
fopen的实现要调用open。
1.fread是带缓冲的,read不带缓冲.
2.fopen是标准c里定义的,open是POSIX中定义的.
3.fread可以读一个结构.read在linux/unix中读二进制与普通文件没有区别.
4.fopen不能指定要创建文件的权限.open可以指定权限.
5.fopen返回指针,open返回文件描述符(整数).
C语言中int转char、char转int、字符拼接
for(int i=1000;i<=1003;i++){
char string[23];
char *json=".json";
char name[80];
//这里将int类型的i转化成了字符类型的string
sprintf(string,"%d",i);
//这里将字符类型的string和json拼接成一个字符型name
sprintf(name,"%s%s",string,json);
printf("%s\n",name);
break;
}
输出结果: