Linux Programming Unleashed
中文版第一版叫做:GNU/Linux编程指南(第一版),翻译者是王勇等;
中文版第二版叫做:GNU/Linux 编程指南,入门.应用.精通,翻译者是张辉等。
英文版的电子书是只有第一版的,pdf文件,6.3M.
英文版第一版电子书中的一些源程序每行之前有个行号,行号和语句之问一般还有个空格。
如下所示:
11 int main(int argc, char *argv[])
12 {
13 int c, i = 0;
14 char str[20];
15 char *pstr;
当把源程序粘贴到编辑器中进行调试时,这个行号的存在是个问题,必须将其去掉。
手工一行行去掉则很麻烦,于是用下面的c源程序来做这个工作。
本程序可取名为 del_line_num.c, filename为待处理的源文件,生成新文件tmp.c
$ make del_line_num
$./del_line_num fcilename
---------------------------------------------------------------
#include
#include
#include
#define BUFSIZE 256 // 取得足够大防止字符串溢出
int main(int argc, char * argv[])
{
FILE * fp1, * fp2;
char buf[BUFSIZE];
if(argc != 2) // 执行时要带源文件名参数
{
printf("Usage: %s {file}\n", argv[0]);
exit(EXIT_FAILURE);
}
fp1 = fopen(argv[1], "r"); // 以只读方式打开源文件
fp2 = fopen("tmp.c", "w"); // 以只写方式打开目标文件tmp.c,存在则先将其清空
if(fp1 == NULL || fp2 == NULL)
{
printf("open file error\n!");
exit(EXIT_FAILURE);
}
do
{
fgets(buf, BUFSIZE, fp1); // 从源文件中读取一行字符
if (feof(fp1) != 0) break; // 源文件已到文件尾
if(buf[0] >= '1' && buf[0] <= '9') // 第一个字符是数字
{
if(buf[2] >= '0' && buf[2] <= '9') // 数字字符为三位数(四位数以上暂未考虑)
{
(buf[3] == ' ') ? (fputs(buf + 4, fp2)) : (fputs(buf + 3, fp2));
// 如果第四个字符是空格则去掉前面三个数字和随后的这个空格将符串写入新文件
// 第四个字符不是空格则一定是'\n'
}
else if(buf[1] >= '0' && buf[1] <= '9') // 数字字符为二位数
{
(buf[2] == ' ') ? (fputs(buf + 3, fp2)) : (fputs(buf + 2, fp2));
}
else // 数字字符为一位数
{
(buf[1] == ' ') ? (fputs(buf + 2, fp2)) : (fputs(buf + 1, fp2));
}
}
else
fputs(buf, fp2); // 其他情况则读取的一行字符不做改变写入新文件
} while(1);
close(fp1);
close(fp2);
exit(EXIT_SUCCESS);
}
**************************************************************
上面生成的tmp.c所有行的语句都是顶格,下面的程序将其作一个简单的缩进处理。
每遇到一对大括号就进行一次缩进,缩进使用用tab字符--'\t'.
#include
#include
#include
#define BUFSIZE 256 // 取得足够大而不会出现字符串溢出
int main(int argc, char * argv[])
{
FILE * fp1, * fp2;
char src[BUFSIZE], dst[BUFSIZE];
if(argc != 2)
{
printf("Usage: %s {file}\n", argv[0]);
exit(EXIT_FAILURE);
}
fp1 = fopen(argv[1], "r"); // 以只读方式打开文件
fp2 = fopen("new.c", "w"); // 以只写方式打开文件,文件存在则清空
if(fp1 == NULL || fp2 == NULL)
{
printf("open file error\n!");
exit(EXIT_FAILURE);
}
int level = 0; // 要缩进的层数
int i;
do
{
fgets(src, BUFSIZE, fp1);
if (feof(fp1) != 0) break; // 已到文件尾
if(src[0] != '\n')
{
if(src[0] == '}') level--; // 第一个字符为'}'时,缩进要少一个tab,从本行开始
for(i = 0; i < level; i++)
dst[i] = '\t'; // 在原来的语句前面加入level个tab字符
}
strcpy(dst + level, src);
fputs(dst, fp2); // 写入新文件
if(src[0] == '{' || src[strlen(src)-2] == '{') // 第一个或倒数第二个字符是'{' (最后一个是换行) level++; // 缩进增加一个tab,从下一行开始
} while(1);
close(fp1);
close(fp2);
exit(EXIT_SUCCESS);
}
阅读(1669) | 评论(1) | 转发(0) |