本章综合练习

1、编程读写一个文件test.txt,每隔1秒向文件中写入一行数据,类似这样:

1,  2007-7-30 15:16:42
2,  2007-7-30 15:16:43

该程序应该无限循环,直到按Ctrl-C中断程序。下次再启动程序写文件时可以追加到原文件之后,并且序号能够接续上次的序号,比如:

1,  2007-7-30 15:16:42
2,  2007-7-30 15:16:43
3,  2007-7-30 15:19:02
4,  2007-7-30 15:19:03
5,  2007-7-30 15:19:04

提示:

2、INI文件是很常见的一种配置文件。比如:

;Configuration of http
[http]
domain=www.mysite.com
port=8080
cgihome=/cgi-bin

;Configuration of db
[database]
server = mysql
user = myname
password = toopendatabase

方括号括起来的部分是section名,之后则是各个key = value键值对。等号两边可以有若干个空白字符(空格或Tab),也可以没有空白字符。注释是以分号;开始的行。一个section结束时至少有一个空行,也可以有连续几个空行,空行是仅包括0个或若干个空白字符(空格或Tab)的行。INI文件的最后一行后面可能有换行符也可能没有。

现在XML兴起了,INI显得有点土。现在要求编程把INI文件转化为XML文件。

<!-- Configuration of http -->
<http>
        <domain>www.mysite.com</domain>
        <port>8080</port>
        <cgihome>/cgi-bin</cgihome>
</http>

<!-- Configuration of db -->
<database>
        <server>mysql</server>
        <user>myname</user>
        <password>toopendatabase</password>
</database>

3、我们知道C程序通常会包含一些头文件。

#include <time.h>

是指/usr/include/time.h。

# include <bits/types.h>

是指/usr/include/bits/types.h。注意,#和include之间,以及include和<文件名>之间都可以有0个或若干个空白字符(空格或Tab)。

#include "stack.h"

是指当前工作目录下的stack.h(为简化起见,不考虑编译器-I参数指定的路径)。

#include "arch/types.h"

指当前工作目录的子目录arch下的types.h。使用getcwd(3)可以得到当前工作目录的绝对路径。

我们还知道,这些头文件还可能继续包含其他的头文件,也有可能重复包含先前已包含过的头文件,甚至也可能循环包含(a.h包含b.h,b.h又包含a.h)。

现在给一个.c源文件,例如

#include <errno.h>
#include "stack.h"

int main()
{
	return 0;
}

要求把它编译时候可能包含的所有头文件找出来(由于有条件编译,所以只是“可能”包含),输出到一个文件里,一个头文件一行,包含绝对路径,不能重复。如果.c或.h文件include的头文件在相应目录中找不到,则输出一行错误信息。例如:

/usr/include/errno.h
/home/akaedu/stack.h: cannot find
/usr/include/features.h
/usr/include/bits/errno.h
/usr/include/linux/errno.h
......