【代码提取】提取一个文件夹里面的所有Java文件的类名函数名和变量名

读取一个文件夹中的Java文件

#include
#include
#include
#include
#include
#include
using namespace std;

string s(_pgmptr);
char  filePath[] = "I:\\"; 
vector files; 
void getFiles( string path, vector& files )
{
	//文件句柄
	long   hFile   =   0;
	//文件信息
	struct _finddata_t fileinfo;
	string p;
	if((hFile = _findfirst(p.assign(path).append("\\*").c_str(),&fileinfo)) !=  -1)
	{
		do
		{
			//如果是目录,迭代之
			//如果不是,加入列表
			if((fileinfo.attrib &  _A_SUBDIR))
			{
				if(strcmp(fileinfo.name,".") != 0  &&  strcmp(fileinfo.name,"..") != 0)
					getFiles( p.assign(fileinfo.name), files );
			}
			else
			{
				files.push_back(p.assign(fileinfo.name) );
			}
		}while(_findnext(hFile, &fileinfo)  == 0);
		_findclose(hFile);
	}
}

int find(string s,string extension){
	int i = -1;
	for(;++i>filePath;
	获取该路径下的所有文件  
	string temp(filePath);
	s = s.substr(0,s.find_last_of("\\")+1);
	ofstream fout((temp + "FileName.txt").c_str());
	cout<

上面的代码文件会调用以下代码来分析Java文件提取需要的信息

#pragma warning(disable: 4786)
#include
#include
#include
#include
#include
#include
#include
using namespace std;

#define PACKAGE   8
#define IMPORT    7
#define CLASS     3
#define VARIABLE  4
#define FUNCTION  5
#define UNDEINED  -1
#define NOTFOUND  0
#define HAVEFOUND 1

/**
 * 目前出现的问题:
 * 1. 不用制表符首行推进,而是用空格。函数没有识别到。
 */
class C{
public:
	string classname;//类的名字
	string extends;//类的extends
	vector implements;//类的implements
	vector var;//类的变量
	vector function;//类的函数
	C(){
		extends = "";
		classname = "";
	}
	C(string extends){
		classname = "";
		this->extends = extends;
	}
};

vector package;//package集合
vector import;//import集合
vector _c;//类的结合

//char p[50] = "I:\\Body.java";//想要分析的代码文件路径
//char q[50] = "I:\\Body.txt";//输出代码文件

char * filePath = "I:\\Android\\sample\\res\\drawable-mdpi"; 
vector files; 

int judge(string s);//判断字符串名字返回不同的值
void D(string& str,char c);//在字符串str中循环删除字符c
void D(string& str,string s);//删除所有指定的字符串
void R(string& str);//以\r为判断删除注释
void D(string& str);//以\t为判断删除所有注释
vector divideByTab(string &str);//以制表符为分隔符分解字符串成vector
void ignorespacetab(const string& str,int& fI);//fI停在非空格和制表符处
void ignorealnum(const string&str ,int& fI);//fI停在非数字和字母处
void display(vector& vs);//输出vector
void display(vector& vi);
void display(vector& vc);
void display(ofstream& fout);//用文件输出流输出
int find(string& str,string s,int& pos);//在pos处,str找s
string findClassName(const string& str,int &begin);//在一个字符串上找类名
string findExtendsName(const string& str,int pos);//在一个字符串上找扩展名
const vector findImplementsName(const string& str,int pos);//implements
void actionscope_ignore(const string& str,int& fI);//忽略一个大的作用域中的所有作用域
vector actionscope(const string& str,int& fI);//获取最大的作用域的位置

int main(int argc,char* argv[]){
	if(argc != 2)return 0;
	cout< divideByTab(string &str){
	vector vs;
	int index_s = 0;
	int index_e;
	index_s = str.find('\t',index_s);
	if(index_s != string::npos){
		index_e = str.find('\t',index_s+1);
		if(index_e != string::npos){
			do{
				if(index_s+1 != index_e){
					vs.push_back(str.substr(index_s+1 , index_e - index_s-1));
				}
				index_s = index_e;
				index_e = str.find('\t',index_e+1);
			}while(index_e != string::npos);
		}
	}
	if(index_s < str.length()){
		vs.push_back(str.substr(index_s+1,str.length() - index_s - 1));
	}
	return vs;
}

//忽略空格和制表符
void ignorespacetab(const string& str,int &fI){
	while(fI& vs){
	for(vector::iterator b = vs.begin(); b!=vs.end();++b){
		cout<<*b<& vi){
	for(vector::iterator b = vi.begin(); b!=vi.end();++b){
		cout<<*b<& vc){
	for(vector::iterator b = vc.begin(); b!=vc.end();++b){
		cout<classname<<" "<extends<implements);
		display(b->var);
		display(b->function);
	}
}


void display(ofstream& fout){
	vector::iterator b;
	int pos;
	for(b = package.begin(); b!=package.end();++b){
		fout<<*b<::iterator i;
	for(i = _c.begin(); i!=_c.end() ; ++i){
		fout<classname;
		if(i->extends.size() != 0){
			fout<<" e "<extends;
		}
		if(i->implements.size()!=0){
			fout<<" i";
			for(b = i->implements.begin(); b != i->implements.end(); ++b){
				fout<<" "<<*b;
			}
		}
		fout<var.begin(); b != i->var.end(); ++b){
			pos = 0;
			D(*b,"\r\n");
			ignorespacetab(*b,pos);
			if(pos != b->length()){
				fout<substr(pos,b->length()-pos)<function.begin(); b != i->function.end(); ++b){
			pos = 0;
			D(*b,"\r\n");
			ignorespacetab(*b,pos);
			if(pos != b->length()){
				fout<substr(pos,b->length()-pos)< in = findImplementsName(classline,begin);//implementsname
					theclass.classname = cn;
					theclass.extends = en;
					theclass.implements = in;

					int cur_index = lBlock;//current_index
					vector vi = actionscope(str,cur_index);//获取函数和数组变量初始化等 { 和 } 的位置
//					display(vi);
					string temp = "";
					//排除所有作用域内的字符串
					for(vector::iterator vit = vi.begin(); vit != vi.end(); vit += 2){
						temp += str.substr(*vit+1,*(vit+1)-*(vit)-1);
					}
	//				temp.find_last_of
					D(temp,"@Override");//删除@Override字符串
					D(temp);//删除注释
					D(temp,'=');//删除 = 号 和 ; 号之间的信息,包括=号,不包括;号
					vector vs = divideByTab(temp);//根据制表符分解字符串
					int sem_index;//分号下标
					//根据分号来区分函数和变量
					for(vector::iterator b = vs.begin(); b!=vs.end();++b){
						sem_index = b->find_last_of(';');
						if( sem_index != string::npos){
							theclass.var.push_back(b->substr(0,sem_index));
						}
						else{
							theclass.function.push_back(*b);
						}
					}
					_c.push_back(theclass);
					pos = fI + 1;//下一个搜索位置从fI开始,因为可能会出现类里面嵌套类的情况
					return HAVEFOUND;
				}
			}
			else{
				return NOTFOUND;
			}
			break;
		case VARIABLE:
			break;
		case FUNCTION:
			break;
		case UNDEINED:
			break;
	};
	return NOTFOUND;
}

string findClassName(const string& classline,int &begin){
//	cout< findImplementsName(const string& str,int pos){
	vector implements;
	int is = str.find("implements",pos);//implements_start
	if( is != string::npos){
		is += 11;
		ignorespacetab(str,is);
		int ins = is;//implements_name_start
		int ine = is;//implements_name_end
		while(is actionscope(const string& str,int& fI){
	vector index;
//	cout<

在第一个代码文件的exe文件中输入Java文件所在目录

单斜杆  \  也是可以的

【代码提取】提取一个文件夹里面的所有Java文件的类名函数名和变量名_第1张图片

回车以后生成对应的txt文件

【代码提取】提取一个文件夹里面的所有Java文件的类名函数名和变量名_第2张图片

Java文件所在目录

【代码提取】提取一个文件夹里面的所有Java文件的类名函数名和变量名_第3张图片

生成的txt文件

【代码提取】提取一个文件夹里面的所有Java文件的类名函数名和变量名_第4张图片

以上两个代码文件的exe文件存放方式。1.exe是第一个代码,createCode.exe是第二个代码

【代码提取】提取一个文件夹里面的所有Java文件的类名函数名和变量名_第5张图片


你可能感兴趣的:(C语言,Java代码信息提取)