课堂老师留个作业,开发一段代码,从配置文件中读取用户配置的值,按照从小到大的顺序排序,然后依次输出圆形、方形或者三角形。
配置文件如下:
老师给的例子是C#的,因为对C#不是很熟悉,因此改造成了C版本和Java版本的,这里是C版本的例子。
要完成本例子,需要将任务分解成以下步骤:读取配置文件、排序用户配置数值、按照升序依次输出图形。
1,读取配置文件:感觉C读取文件还是很方便的,但是字符串操作相对较少,读取完每行按照“=”分割时比较麻烦。
解析每行内容,按照“=”分割。
因为配置内容在java中是使用key、value的形式保存的,但是C没有这种数据结构,因此自己定义了一个结构shapType,用来保存每行配置的键值对应关系。
接下来对读取出来的内容进行排序:
接下来就是按照排序后的顺序,进行输出了,这个比较简单:
[color=red][u][i]总结:好久没有写C了,而且这个项目是先完成的Java版本,回头再写C版本的,感觉相当痛苦,总是在以Java的思维去想C的构思,结果就是什么语言也不像了。好在是基本的功能出来了,至于代码优化,欢迎大家给出好的建议啊![/i][/u]
[b]附件是项目几个源码文件,可以直接下载使用,入口是"main.c"[/b][/color]
配置文件如下:
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");
}
}
[color=red][u][i]总结:好久没有写C了,而且这个项目是先完成的Java版本,回头再写C版本的,感觉相当痛苦,总是在以Java的思维去想C的构思,结果就是什么语言也不像了。好在是基本的功能出来了,至于代码优化,欢迎大家给出好的建议啊![/i][/u]
[b]附件是项目几个源码文件,可以直接下载使用,入口是"main.c"[/b][/color]