我有一个C代码,它是以下输出:
INPUT:./includeCrawler -Itest s_01.c
输出:s_01.o: s_01.c i_60.h i_44.h i_46.h i_04.h i_51.h i_15.h i_33.h i_29.h i_16.h
S_01.c:
#include "i_60.h"
#include "i_44.h"
#include "i_46.h"
#include "i_04.h"
#include "i_51.h"
#include "i_15.h"
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <sys/time.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <signal.h>
i_60.c
#ifndef _I_60_H_
#define _I_60_H_
#include "i_33.h"
#include "i_04.h"
#include "i_29.h"
#include <stdio.h>
#endif /* _I_60_H_ */
我试图将其转换为java,因此它读入一个文件,例如s_01.c,它将打印上面的输出。文件本身将读取所有i.h并输出它。如果存在依赖关系,例如程序读取s_01.c它将读取s_01.c中的文件并且它将在其中读取#include“i_60.h”然后它将转到i_60.h并找到更多与我相关的东西。它将继续这样做,直到它找不到我的路径。
以下是我到目前为止所做的事情: 我已经成功阅读了例如1个文件并打印出与i相关的所有内容然后我把它扔进了一个链表。但是我不知道如何继续调用彼此的文件然后打印出来。
read: s_02.c
Output:
[i_02.h]
[i_02.h, i_52.h]
[i_02.h, i_52.h]
[i_02.h, i_52.h]
[i_02.h, i_52.h, i_51.h]
[i_02.h, i_52.h, i_51.h]
[i_02.h, i_52.h, i_51.h]
[i_02.h, i_52.h, i_51.h]
[i_02.h, i_52.h, i_51.h, i_03.h]
[i_02.h, i_52.h, i_51.h, i_03.h, i_41.h]
答案 0 :(得分:0)
好吧,我假设你已经实现了一个名为readFile(String filename)的函数,它将返回一个它所依赖的文件名的数组(或者像你说的那样是一个linkedList)。
您可以做的是使用递归过程。顺便说一句,您可以使用Set来保存文件名而不是链接列表。
// a set of filenames that have been read
HashSet<String> setOfProceededFilenames = new HashSet<String> ();
// recursively read the files
private void recursivelyReadFiles(String filename) {
// we have defined String [] readFile(String filename)
String [] dependencies = readFile(filename);
// we only read those haven't been proceeded
for (String dependentFile : dependencies) {
if (!setOfProceededFilenames.contains(dependentFile)){
// add this file to the set and read its dependencies
setOfProceededFilenames.add(dependentFile);
recursivelyReadFiles(dependentFile);
}
}
}