最近读了cJson的源代码,注意到了几个的函数,可以在以后的代码中使用,在这里做个记录
包括:文件读取、数字字符串处理等
cJson中读取文件的方法:
void dofile(char *filename)
{
FILE *f;long len;char *data;
f=fopen(filename,"rb");fseek(f,0,SEEK_END);len=ftell(f);fseek(f,0,SEEK_SET);
data=(char*)malloc(len+1);fread(data,1,len,f);fclose(f);
doit(data);
free(data);
}
自己做点改进:
#include <stdio.h>
#include <stdlib.h>
const char* dofile(char *filename)
{
FILE *f;
long len;
char *data;
f=fopen(filename,"rb");
fseek(f,0,SEEK_END);
len=ftell(f);
fseek(f,0,SEEK_SET);
data=(char*)malloc(len+1);
fread(data,1,len,f);
fclose(f);
return data;
}
int main(){
printf("%s",dofile("./test.txt"));
return 0;
}
tinyhttpd源码读取文件方法:
#include <stdio.h>
#include <stdlib.h>
int main(){
char buf[1024];
FILE *resource = fopen("./test.txt", "r");
if(resource == NULL)
exit(0);
fgets(buf, sizeof(buf), resource);
while (!feof(resource))
{
printf("%s",buf);
fgets(buf, sizeof(buf), resource);
}
return 0;
}
cJson中处理数字字符串:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
double parse_number(const char *num)
{
double n=0,sign=1,scale=0;int subscale=0,signsubscale=1;
if (*num=='-') sign=-1,num++; /* Has sign? */
if (*num=='0') num++; /* is zero */
if (*num>='1' && *num<='9')
do n=(n*10.0)+(*num++ -'0');
while (*num>='0' && *num<='9'); /* Number? */
if (*num=='.' && num[1]>='0' && num[1]<='9') {
num++;
do n=(n*10.0)+(*num++ -'0'),scale--;
while (*num>='0' && *num<='9');} /* Fractional part? */
if (*num=='e' || *num=='E') { /* Exponent? */
num++;
if (*num=='+') num++;
else if (*num=='-') signsubscale=-1,num++; /* With sign? */
while (*num>='0' && *num<='9')
subscale=(subscale*10)+(*num++ - '0'); /* Number? */
}
n=sign*n*pow(10.0,(scale+subscale*signsubscale));
/* number = +/- number.fraction * 10^+/- exponent */
return n;
}
int main(){
char *num="123.456";
double n = parse_number(num);
printf("%lf\n",n+1);
}
先更新到这儿,还有后续......