主题:[讨论]求救这个题目怎么做啊 谢谢!!(题目: INI文件操作库)
fuxianfeng1988
[专家分:0] 发布于 2011-10-22 22:10:00
INI文件就是扩展名为“ini”的文件。在Windows系统中,INI文件很多,最重要的就是“System.ini”、 “System32.ini”和“Win.ini”。该文件主要存放用户所做的选择以及系统的各种参数。用户可以通过修改INI文件,来改变应用程序和系统的很多配置。
首先,我们先来了解下INI文件的结构。INI文件是一种按照特定方式排列的文本文件。每一个INI文件构成都非常类似,由若干段落(section)组成。在每个段落下面,是若干个以单个单词开头的关键词(key)和一个等号,等号右边的就是关键字对应的值(value)。即一般形式如下:
[Section1]
KeyWord1 = Valuel
KeyWord2 = Value2
[gmy_p]
exist_p=0
linux_p=123
其中[gmy_p]为section;exist_p为key;0为key的值value。
在本题中我们假设INI文件的结构中没有section部分,即我们所定义的inifile文件结构如下: Key1 = Valuel
Key2 = Value2
我们需要实现一个能对inifile文件进行读写操作的库。该库通过包含inifile.h来调用。读操作中需要将文件中每行的key值和其对应的value值读出;写操作中需要将给定的key和value值按照inifile文件的结构写入文件中。
下面给出inifile.h中函数原型
int load(char * filename); #装载正常返回0
int read(char * section, char * key, char * stored_value);
int write(char * section, char * key, char * value_write);
需要写的程序:
(1) 在inifile.c中实现三个函数
(2) 写一个示例程序,看看infile这个库能不能正常工作。
提示:
由于不知道inifile中有多少个section和多少个value,所以需要用到链表来存储。
回复列表 (共10个回复)
沙发
fuxianfeng1988 [专家分:0] 发布于 2011-10-23 10:38:00
有没有谁知道,哪怕指点一下也行、//真心谢谢!!!
板凳
windy0will [专家分:2300] 发布于 2011-10-23 12:55:00
这种工作交给脚本做吧,用C语言写起来比较麻烦。
结合正则表达式,应该不用30行代码就差不多了。
3 楼
fuxianfeng1988 [专家分:0] 发布于 2011-10-23 13:19:00
[quote]这种工作交给脚本做吧,用C语言写起来比较麻烦。
结合正则表达式,应该不用30行代码就差不多了。[/quote]
虽然还是不懂、、但谢谢哈、、这是一个作业,以前没见过这种题、、、所以无从下手、、
4 楼
fuxianfeng1988 [专家分:0] 发布于 2011-10-23 13:27:00
[quote]这种工作交给脚本做吧,用C语言写起来比较麻烦。
结合正则表达式,应该不用30行代码就差不多了。[/quote]
请问下要做这题,可以去参考什么书?你说的什么正则表达式我还是第一次听过、、谢谢
5 楼
windy0will [专家分:2300] 发布于 2011-10-23 16:24:00
比如说 KeyWord1 = Valuel 这种格式:
任意个可选空白 一串字母 可选空白 = 可选空白 一串字母 可选空白
这个格式可以写成这样:
m{ ^ \s*+ (\w++) \s*+ = \s*+ (\w++) \s*+ $ }xo
\s表示空白字符 \w表示字母字符 ^表示行首 $表示行尾 *表示可以有任意个这样的字符
+表示至少要有一个这样的字符 *+和*差不多 ++和+差不多
()表示把里面的内容保存到临时变量中,第1个括号保存到$1 第2个保存到$2,依此类推。
也就是把.ini文件里每一行内容和上面的表达式匹配,如果匹配成功,那么
$1 的值就是 KeyWord, $2 的值就是 Value.
如用 keyword1 = value1 和那个式子匹配,
能匹配成功,并且匹配后 $1等于"keyword1", $2等于"value1"
如果用 section: 和那个式子匹配,将匹配失败。
6 楼
windy0will [专家分:2300] 发布于 2011-10-23 16:45:00
如果是作业,一定要用C语言写的话,可以把你的思路贴出来,大家一起讨论。
7 楼
fuxianfeng1988 [专家分:0] 发布于 2011-10-23 16:49:00
[quote]比如说 KeyWord1 = Valuel 这种格式:
任意个可选空白 一串字母 可选空白 = 可选空白 一串字母 可选空白
这个格式可以写成这样:
m{ ^ \s*+ (\w++) \s*+ = \s*+ (\w++) \s*+ $ }xo
\s表示空白字符 \w表示字母字符 ^表示行首 $表示行尾 *表示可以有任意个这样的字符
+表示至少要有一个这样的字符 *+和*差不多 ++和+差不多
()表示把里面的内容保存到临时变量中,第1个括号保存到$1 第2个保存到$2,依此类推。
也就是把.ini文件里每一行内容和上面的表达式匹配,如果匹配成功,那么
$1 的值就是 KeyWord, $2 的值就是 Value.
如用 keyword1 = value1 和那个式子匹配,
能匹配成功,并且匹配后 $1等于"keyword1", $2等于"value1"
如果用 section: 和那个式子匹配,将匹配失败。[/quote]
哦,刚也看了下书,貌似有点像文本搜索里的模式匹配问题,不好意思再问个 这个编出来后在什么软件上运行验证?
8 楼
fuxianfeng1988 [专家分:0] 发布于 2011-10-23 17:16:00
[quote]如果是作业,一定要用C语言写的话,可以把你的思路贴出来,大家一起讨论。[/quote]
我不知道那个load函数用来干嘛、、我的想法是把load函数用来打开文件调用库函数fopen(),打开成功就返回0,至于那个read()和write()函数则是分别调用fgets()和fputs()库函数读取和写内容,然后这中间就正确的读取和存储section、keyword和value的内容、、至于说有多个section和value,则创建一个结构体,把他转变成链表的形式,通过指针来读取section和value值、、、不知道这样说是不是太空洞了,好多地方不懂,我还是太菜了呵呵、、我昨晚试了下、、还是有的地方不知道怎么实现、、
9 楼
argentmoon [专家分:13260] 发布于 2011-10-23 23:53:00
一行一行读文件内容。
碰到[...]格式的,就是section的开始,
那么接着一行一行读,在没碰到[...]之前,这些读出来的值都是以key=value的形式存取的,用字符串处理的方式,把key和value取出来。
想怎么存都可以。链接什么的也可以。
以上是存的或者,写只是类似的过程。
10 楼
fuxianfeng1988 [专家分:0] 发布于 2011-10-24 16:27:00
Inifile提示
(1) 文件test.txt中有如下内容
Aaa
Bbb
Ccc
你能否写一个程序,将内容存入一个数组lines[100]中?
(2) 可否对数组lines[100]中数据修改,然后写回test.txt中?
(3) 假如test.txt中的文件行数未知,你能否写一个程序,将内容存入到一个链表plines中?
struct pline
{
char * value;
struct pline * next;
};
(4) 假如test.txt中的每行不是”Aaa”,而是”Aaa=111”,能否将每一行分离,存入一个二维数组mlines[100][2]中?
文件格式
Aaa=111
Bbb=222
Ccc=333
数组内容
Aaa 111
Bbb 222
Ccc 333
其中mlines[0][0]=”Aaa”, mlines[0][1]=”111”,
(5) 可否对链表plines中数据修改,然后写回test.txt中?
(6) 假如test.txt中的文件行数未知,你能否写一个程序,将内容存入到一个链表pmlines中?
struct pmline
{
char * key;
char * value;
struct pmline * next;
};
(7) 可否对链表mplines中数据修改,然后写回test.txt中?
(8) 做到第7步后,不难相信,其它更复杂的情况你也能处理了。
我来回复