大家都知道写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()函数吧。它的参数就是要打开文件的文件名
首先测试文件是否正确打开,如果没打开就需要报错。打开文件的函数是。 然后开始从文件一个一个读取字符。如果遇到#字符就调用 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] != '\\'。应该是'\' 。不知道怎么写成那样了。 知道的可以帮我弄一下。现在是拿同学的电脑,上面没编译器,他也要了。时间匆忙, 写的不是很好。 不要见怪! 希望对你有所帮助 :)原文出自: