我想编写一个代码,找到所有以#include 开头的行并将这些文件分别写入另一个文件。我的主要任务是找到所有包含文件的名称并将它们写入一个单独的文件中。
很明显,我们需要使用基本的 IO 操作打开和读取这个文件。之后我认为使用 strtok 函数我们可以解析 # 之间的不同字符串(包括以 # 开头),但我发现这不是一个正确的方法。因为在这样做时,我们需要有需要初始化的数组指针,并且主文件中可能有 n 个包含文件(如果我们递归地获取它们,则意味着包含文件也可以包含包含文件)。
需要建议。
我想编写一个代码,找到所有以#include 开头的行并将这些文件分别写入另一个文件。我的主要任务是找到所有包含文件的名称并将它们写入一个单独的文件中。
很明显,我们需要使用基本的 IO 操作打开和读取这个文件。之后我认为使用 strtok 函数我们可以解析 # 之间的不同字符串(包括以 # 开头),但我发现这不是一个正确的方法。因为在这样做时,我们需要有需要初始化的数组指针,并且主文件中可能有 n 个包含文件(如果我们递归地获取它们,则意味着包含文件也可以包含包含文件)。
需要建议。
通过对 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 --> 子包含文件 1 --> 子包含文件 2 包含文件 2 --> 子包含文件 1 --> 子包含文件 2 包含文件 3 包含文件 4 包含文件 5
所以到目前为止,我只能获得包含文件 1、2、3、4。我仍然必须使用递归来获取所有子包含文件 1,2 等。
我仍然不确定您到底想要什么,但看起来您想使用用 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;
}