大家都知道写C语言程序的时候需要包含头文件,需要预处理指令#include
例如 #include 。
在做算法题目的时候遇到一个题目,要求写一个程序能处理#include 指令
就是把这条指令替换成文件。例如 #include a.txt。就会把指令替换成
文件a.txt的内容。不多说,上代码:
#include
#include
#define FLAG "include"
int readWordInFile(char *word,FILE *pfile)
{
int flag,i;
flag = i = 0;
char c;
while((c = fgetc(pfile)) != EOF){
if(' ' == c || '\n' == c || '\t' == c){//遇到空格
if(0 == flag){//单词前面的空格输出即可
putchar(c);
}
else{
//改变_ptr域返回前一位置出错 暂不知出错原因
break;
}
}
else{//读取单词
word[i++] = c;
flag = 1;
}
}
word[i] = '\0';
}
void getPath(char *path)
{
int i;
for(i = strlen(path);path[i] != '\\';i--)
;
path[++i] = '\0';
}
int readFile(char *path)
{
char buff[256],c;
FILE *pfile;
if(NULL == (pfile = fopen(path,"r")))//测试文件是否成功打开
return 0;
else{
while((c = fgetc(pfile)) != EOF){//未到文件尾
if('#' == c){//遇到 # 字符
readWordInFile(buff,pfile); //读取命令
if(0 == strcmp(buff,FLAG)){
readWordInFile(buff,pfile);//读取文件名
getPath(path);//截取文件名前部分
readFile(strcat(path,buff));//根据命令读取文件
}
else //命令对不上就打印 # 字符
printf("#%s ",buff);
}
if(c != '#') //防止 # 字符重复输出
putchar(c); //打印文件
}
}
fclose(pfile);//关闭文件
return 1;
}
int main()
{
char path[] = "c:\\intel\\test.txt";
readFile(path);
}
readWordInFile()函数
就是从文件中读取单词。
如果先遇到空格就直接输出在读取。
读取到字符后如果遇到空格就表示单词读取完毕就可以退出函数了。
但因为读取到了那个空格不属于单词中,而此时文件指针却指向文件的下一个
字符了,所以这时需要把文件指针后移。但是对于文件指针我不太熟悉
到现在都没弄好,这个就留给聪明的你去做了。指针后移的代码是:
else{
//改变_ptr域返回前一位置出错 暂不知出错原因
break;
再说readFile()函数吧。它的参数就是要打开文件的文件名
首先测试文件是否正确打开,如果没打开就需要报错。打开文件的函数是fopen()。
然后开始从文件一个一个读取字符。如果遇到#字符就调用 readWordInFile 读取 #字符后面的单词,看是不是
include。
if(0 == strcmp(buff,FLAG))这句代码就是测试是不是读到了#include指令。
如果是就向后读取文件名。
readWordInFile(buff,pfile);//读取文件名
getPath(path);//截取文件名前部分
readFile(strcat(path,buff));//根据命令读取文件
上面的几句代码就是先调用readWordInFile读取文件名
读取到之后,在调用getPath。它的参数是当前文件名,我们要获取到我们正在读的文件
在那个文件夹,然后获取这个文件夹的地址,把它连接到#include后面哪个文件名之前。
在递归调用readFile(strcat(path,buff));继续读取文件。
如果#字符后面不是include指令,就直接把#和后面的内容原样输出
if(c != '#') //防止 # 字符重复输出
putchar(c); //打印文件
}
这代码有什么作用呢?大家可以自己试试。呵呵
getPath 从参数后面判断字符,如果晕倒'\'就表示找到文件所在文件夹了。
我的函数:
int i;
for(i = strlen(path);path[i] != '\\' ;i--)
那个判断 path[i] != '\\'。应该是'\' 。不知道怎么写成那样了。
知道的可以帮我弄一下。现在是拿同学的电脑,上面没编译器,他也要了。时间匆忙,
写的不是很好。
不要见怪! 希望对你有所帮助 :)
原文出自:大笨兔博客 来看看我吧