回 帖 发 新 帖 刷新版面

主题:[讨论]求救这个题目怎么做啊 谢谢!!(题目: INI文件操作库)

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个回复)

沙发

有没有谁知道,哪怕指点一下也行、//真心谢谢!!!

板凳

这种工作交给脚本做吧,用C语言写起来比较麻烦。

结合正则表达式,应该不用30行代码就差不多了。

3 楼

[quote]这种工作交给脚本做吧,用C语言写起来比较麻烦。

结合正则表达式,应该不用30行代码就差不多了。[/quote]
虽然还是不懂、、但谢谢哈、、这是一个作业,以前没见过这种题、、、所以无从下手、、

4 楼

[quote]这种工作交给脚本做吧,用C语言写起来比较麻烦。

结合正则表达式,应该不用30行代码就差不多了。[/quote]
请问下要做这题,可以去参考什么书?你说的什么正则表达式我还是第一次听过、、谢谢

5 楼

比如说 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 楼

如果是作业,一定要用C语言写的话,可以把你的思路贴出来,大家一起讨论。

7 楼

[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 楼

[quote]如果是作业,一定要用C语言写的话,可以把你的思路贴出来,大家一起讨论。[/quote]
我不知道那个load函数用来干嘛、、我的想法是把load函数用来打开文件调用库函数fopen(),打开成功就返回0,至于那个read()和write()函数则是分别调用fgets()和fputs()库函数读取和写内容,然后这中间就正确的读取和存储section、keyword和value的内容、、至于说有多个section和value,则创建一个结构体,把他转变成链表的形式,通过指针来读取section和value值、、、不知道这样说是不是太空洞了,好多地方不懂,我还是太菜了呵呵、、我昨晚试了下、、还是有的地方不知道怎么实现、、

9 楼

一行一行读文件内容。
碰到[...]格式的,就是section的开始,
那么接着一行一行读,在没碰到[...]之前,这些读出来的值都是以key=value的形式存取的,用字符串处理的方式,把key和value取出来。

想怎么存都可以。链接什么的也可以。

以上是存的或者,写只是类似的过程。

10 楼

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步后,不难相信,其它更复杂的情况你也能处理了。

我来回复

您尚未登录,请登录后再回复。点此登录或注册