`
lichuanbao
  • 浏览: 125611 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

C 读取配置文件,按照配置值从小到大的顺序输入圆形、三角或方形

    博客分类:
  • C
阅读更多
课堂老师留个作业,开发一段代码,从配置文件中读取用户配置的值,按照从小到大的顺序排序,然后依次输出圆形、方形或者三角形。

配置文件如下:
triangle=2
cycle=5
square=8

老师给的例子是C#的,因为对C#不是很熟悉,因此改造成了C版本和Java版本的,这里是C版本的例子。

要完成本例子,需要将任务分解成以下步骤:读取配置文件、排序用户配置数值、按照升序依次输出图形。

1,读取配置文件:感觉C读取文件还是很方便的,但是字符串操作相对较少,读取完每行按照“=”分割时比较麻烦。
	//load the configure file
	FILE *f;
	f = fopen(FILENAME,"r");
	if(f == NULL){
		printf("%s\n", "error when open the configure file");
		return ;
	}
	char content[3][100];
	char line[100];
	int i=0;
	while(fgets(line, 100, f) != NULL){
		if(line[0] == '#'){
			continue;
		}else{
			strncpy(content[i], line, 100);
			i++;
		}
	}
	fclose(f);

	//parser the configured file
	for(i=0;i<3;i++){
		parserByLine(content[i], kv, 6);
	}


解析每行内容,按照“=”分割。
//parser configure file line by line
void parserByLine(char * line, struct shapeType * kv,int num){
	int length = 0, equalSign = 1;
	char *begin;

	length = strlen(line);
	for(begin = line; * begin != '=' && equalSign <= length; begin++){
		equalSign++;
	}

	//seperate name and value by equal
	//这里的数组需要声明的大一些,防止参数名称保存不全
	char charValue[200];
	char charName[200];
	strncpy(charName, line, equalSign-1);
	strncpy(charValue, line + equalSign, length);

	char * strCycle = CYCLE;
	char * strSquare = SQUARE;
	char * strTriangle = TRIANGLE;
	if(* strCycle == charName[0]){
		kv->sortValue = atoi(charValue);
	}else if(* strTriangle == charName[0]){
		// (* (kv+1)).sortValue = atoi(charValue);
		(++kv)->sortValue = atoi(charValue);
	}else if(* strSquare == charName[0]){
		// (* (kv+2)).sortValue = atoi(charValue);
		kv += 2;
		kv->sortValue = atoi(charValue);
	}
}

因为配置内容在java中是使用key、value的形式保存的,但是C没有这种数据结构,因此自己定义了一个结构shapType,用来保存每行配置的键值对应关系。
struct shapeType
{
	char * shapeName;
	int sortValue;
} shapes[3] = {{CYCLE,0},{TRIANGLE,0},{SQUARE,0}};


接下来对读取出来的内容进行排序:
//sort configured values load from the configure file
void sort(struct shapeType * kv){
	int i, j;
	char * tmpName;
	int tmpValue;
	for(i=0;i<2;i++){
		for(j=i+1;j<3;j++){
			if( (* (kv+i)).sortValue >= (* (kv+j)).sortValue){
				tmpName = (* (kv+j)).shapeName;
				tmpValue = (* (kv+j)).sortValue;

				(* (kv+j)).shapeName = (* (kv+i)).shapeName;
				(* (kv+j)).sortValue = (* (kv+i)).sortValue;

				(* (kv+i)).shapeName = tmpName;
				(* (kv+i)).sortValue = tmpValue;
			}
		}
	}
}


接下来就是按照排序后的顺序,进行输出了,这个比较简单:
// draw shapes accroding to the sorted array shapes[3]
void draw(struct shapeType * kv){
	struct shapeType * kvEnd;
	kvEnd = kv+3;
	for(;kv<kvEnd;kv++){
		if( kv->shapeName == CYCLE){// (* kv).shapeName
			drawCycle();
		}else if( kv->shapeName == SQUARE){
			drawSquare();
		}else if( kv->shapeName == TRIANGLE){
			drawTriangle();
		}
		printf("\n");
	}
}


总结:好久没有写C了,而且这个项目是先完成的Java版本,回头再写C版本的,感觉相当痛苦,总是在以Java的思维去想C的构思,结果就是什么语言也不像了。好在是基本的功能出来了,至于代码优化,欢迎大家给出好的建议啊!

附件是项目几个源码文件,可以直接下载使用,入口是"main.c"
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics