课堂老师留个作业,开发一段代码,从配置文件中读取用户配置的值,按照从小到大的顺序排序,然后依次输出圆形、方形或者三角形。
配置文件如下:
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"
分享到:
相关推荐
通过按钮,读取配置文件,并修改自定义配置文件appSettings中的值.这是一个很简单的dome.
读取XXX.ini配置文件里面数据信息 1.在使用中把CIniFile类添加到项目当中,并在使用的类引用CIniFile类 2.m_iniFile = new CIniFile(QCoreApplication::applicationDirPath()+ MoonlightService); [MoonlightService...
在Windows下可以用GetPrivateProfileString或GetPrivateProfileInt方便读取.ini配置文件内容,自己尝试写了一下这个函数。还有一些bug,后面慢慢改。
保存INI配置文件和读取配置文件,欢迎大家下载学习!
读取本地配置文件,在CListBox中选择中英文的方式来匹配配置文件的项
java读取配置文件 在经常更换的一些东西 就可以用配置文件
操作配置文件的代码分.h,.c和main.c(示例) 每一行不超过1024字符。 1.注释以#打头,行首空格要忽略 2.一个参数占一行,配置项格式 变量名 = 变量值 变量名= (也合法. =两边有无空格不影响结果,值可以为空格) 3.没有...
Linux打开shell时读取配置文件的顺序
参考大神文档,在这个基础上修改处的可以直接调用读取CSV文件的接口;很方便可以直接调用读取;函数都封装的很好,也有很详细的注释
c# 实现的。通过配置文件config 读取数据库连接字符串,用户名密码等。通过配置文件,有利于系统的升级。
c语言文件操作,详细的给出了如何读取文本文件数据,以及存储数据到另外的文件中
Qt读取配置文件的源码
自己写的vbs读取配置文件的代码 直接就能用 很好使哈
c语言 读取xml文件,相信对大家读取c语言文件有帮助
C# .net读取ini配置文件
利用java可以读取配置文件信息,可以流来处理这个问题
spring读取配置不同目录下的配置文件,使用ClassPathXmlApplicationContext与FileSystemXmlApplicationContext
java 按顺序读取文件 java 按顺序读取文件 java 按顺序读取文件
一个成功的VC读取配置文件的例子,可以直接套用。