我想编写一个代码,找到以#include开头的所有行,并将这些文件分别写入另一个文件。我的主要任务是找到所有包含文件的名称,并将它们写入一个单独的文件。
这很明显我们需要open and read this file using basic IO operations。之后我认为使用strtok函数我们可以解析#之间的不同字符串(包括以#开头),但我发现这不是一个正确的方法。因为在这样做我们需要有需要初始化的数组指针,并且主文件中可能包含许多包含的文件(如果我们递归地使用它们,则意味着包含文件也可以包含包含文件)。
需要建议。
答案 0 :(得分:1)
我仍然不确定你想要什么,但看起来你想使用C语言编写的可执行文件解析另一个C类型文件,将“#include”的出现与另一个C类型文件分开。这是一个应该在ANSI C编译器中为您构建的示例。只需传递源文件和目标文件的完整路径/文件名:
#include <windows.h>
#include <ansi_c.h>
int parse(char *in, char *out);
int main(void)
{
//edit with desired file names
parse("c:\\temp\\someCfile.c" , "C:\\temp\\someNewCfile.c");
return 0;
}
int parse(char *in, char *out)
{
FILE *fp=0, *fp2=0;
char lineBuf[280];
if(in)
{
fp = fopen(in, "r");
if(fp)
{
fp2 = fopen (out, "w");
if(fp2)
{
while(fgets(lineBuf, 280, fp))
{
if((lineBuf[0]=='#') && strstr(lineBuf, "#include"))
{
fputs(lineBuf, fp2);
}
}
fclose(fp2);
}
fclose(fp);
}
}
return 0;
}
答案 1 :(得分:1)
除了Ryyker代码之外,下面的代码也适用于我。
#include<stdio.h>
#define CHUNK 1024
int parse(char *in, char *out);
int main(void)
{ char source[100];
printf("Enter the name of the source file : ");
scanf("%s",source);
printf("%s \n",source);
parse(source , "/home/shailendra/test.txt"); //edit with desired destination file name where file names
return 0;
}
int parse(char *in, char *out)
{
int i;
FILE *fp=0, *fp2=0;
char lineBuf[CHUNK];
char *str1;
char buf[100];
if(in)
{
fp = fopen(in, "r");
if(fp)
{
fp2 = fopen (out, "w+");
if(fp2)
{
while(fgets(lineBuf,CHUNK, fp))
{i = strlen(lineBuf);
lineBuf[i-2] = 0;
if((lineBuf[0]== '`') && strstr(lineBuf, "`include"))
{
fprintf(fp2,"%s \n",lineBuf+10);
//parse( "" , "/home/shailendra/test.txt");
}
}
fclose(fp2);
}
fclose(fp);
}
}
return 0;
}
虽然我仍在尝试使用递归来获取内部包含文件并获取其输出文件中写入的包含文件但未成功。所有包含文件都在同一目录中进行。
结构就像
包含文件1 - &GT;包含文件1 - &GT;包含文件2 包含文件2 - &GT;包含文件1 - &gt;子包含文件2 包含文件3 包含文件4 inlcude file 5
所以直到现在我才能得到只包含文件1,2,3,4。我仍然需要使用递归来获取所有子包含文件1,2等。