有时候,我们的程序需要一些在可以由用户修改的参数。
这些参数,通常放在一个外部文件里,典型的就是.ini格式的初始化类型文件。
要使用外部文件里定义的参数,只需要我们使用文件读写的方法,把这些文件里的参数读给程序里的变量就行了。
但外部文件,为了方便用户修改,总要加入一些描述信息,如何跳过这些描述信息,只将有用的信息读入我们的程序中呢?
这时就需要用到几个很有用的字符串处理函数:
(点击上面的函数名,可以查看使用帮助)
下面是一个例程:(注意是按行读取外部参数文件的)
外参文件: parameter.ini
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;1号同学的信息
name1 = zhang
age1 = 23
No1 = 10001
;2号同学的信息
name2 = Li
age2 = 25
No2 = 10002
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
处理"parameter.ini"的C程序如下:
char * comment,
* buf;
while( (ch = fgetc(fp)) != EOF ) {
if(ch == ';' || ch == ':' || ch == '/n') fgets(comment, 256, fp) ; //忽略空行或有注释符的一行,对读取的一行不做任何操作
else {
fseek(fp, -1L, SEEK_CUR) ; // 回到给ch赋值的那个字符
strncpy(comment, "", 256) ; strncpy(buf, "", 32) ; // 初始化为空
fgets(comment, 256, fp) ; // 读取外参文件的一行数据
if(strnicmp(comment, "name", 3) == 0) { // 如果该行是name开头
pos = strcspn(comment, "=") ; // 找name后的等号的位置
strncpy(buf, comment+3, pos-3) ; // 找到name后的序号 赋给buf
k = atoi(buf) ; // 将字符串处理成整型
strncpy(name[k] comment+pos+1, 32) ; // 把=后面的值读到name参数中
}else if(strnicmp(comment, "age", 3) == 0) { // "age"から始まる行を探す(バンディング対策時の上限
pos = strcspn(comment, "=") ; // "="の位置を探す
strncpy(buf, comment+3, pos-3) ; // "+3/-3"は"age"の分
ak = atoi(buf) ; //
strncpy(buf, comment+pos+1, 32) ; // "+1"はbuf内に含まれる"="の分
age[ak] = atol(buf) ;
}else if(strnicmp(comment, "No", 2) == 0) {
pos = strcspn(comment, "=") ; // "="の位置を探す
strncpy(buf, comment+2, pos-2) ; // "+2/-2"は"max"の分
k = atoi(buf) ; // k番目のドット出現率上限値の読み込み
strncpy(buf, comment+pos+1, 32) ; // "+1"はbuf内に含まれる"="の分
no[k] = atol(buf) ;
}
}
}