生成下面这段代码的流程图:template <typename T> bool read_file(string filename,T * table) { char filenames[100]; memset(filenames,'\0',sizeof(filenames)); for(int i = 0; i < filename.length(); i++) filenames[i] = filename[i]; cout<<"filename: "<<filenames<<endl<<endl; fstream file(filenames); //打开文件 string words; if(!file) { cout<<"文件打开失败"<<endl; return 0; } string s; while(getline(file,words)) //逐行读取 { for(int i=0;i<=words.size();i++) { if(words[i]>=65&&words[i]<=90 || words[i]>=97&&words[i]<=122 || words[i]=='_') //A-Z,a-z,_ 是关键字的成分 s.push_back(words[i]); else { int k = Find(s); //二分查找关键字s if(k != -1) { if(typeid(table) == typeid(HashTable *)) //开放地址法 table[hash_found(keyword[k],(HashTable *)table)].num += 1; else if(typeid(table) == typeid(HashNode *)) //链地址法 hash_founds(keyword[k],(HashNode *)table)->num += 1; } s.clear(); } } } file.close(); return 1; }
时间: 2024-02-15 18:10:11 浏览: 56
很抱歉,我无法生成代码的流程图,但我可以为您解释代码的执行流程。
1.定义一个模板函数read_file,该函数可以读取指定文件中的内容,并将其中出现的关键字记录到哈希表或哈希链表中。
2.函数接收两个参数:filename和table。filename是待读取的文件名,table是用于记录关键字的哈希表或哈希链表。
3.定义一个字符数组filenames,长度为100,用于存储filename的值。
4.使用memset函数将filenames数组中的所有元素初始化为'\0'。
5.使用for循环将filename中的每个字符依次存储到filenames数组中。
6.输出filenames数组中存储的文件名。
7.定义一个fstream对象file,使用filenames中存储的文件名打开文件。
8.定义一个字符串变量words,用于存储从文件中读取的一行内容。
9.如果文件打开失败,则输出提示信息并返回0。
10.定义一个字符串变量s,用于暂存从words中分离出来的关键字。
11.使用while循环逐行读取文件中的内容,直到读取到文件末尾。
12.使用for循环遍历读取到的每个字符,如果该字符是字母或下划线,则将其存储到s字符串中。
13.如果遍历到的字符不是字母或下划线,则表示s字符串中存储的是一个完整的关键字,使用Find函数查找该关键字在关键字数组中的位置。
14.如果找到了该关键字,则根据传入的table类型,使用开放地址法或者链地址法将该关键字记录到哈希表或哈希链表中。
15.清空s字符串中的内容,为下一个关键字做准备。
16.关闭文件。
17.返回1,表示文件读取成功。
阅读全文