从cJson源码中学习技巧!!!

最近读了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);
}
先更新到这儿,还有后续......

发布了15 篇原创文章 · 获赞 3 · 访问量 2239

猜你喜欢

转载自blog.csdn.net/sky_s_limit/article/details/80209057