KWIC的实现(C++)
KWIC(Key Word in Context)
写完了之后才发现这个题目不是仅仅是写出来而已,而是要按照相应的软件体系结构去写,但是也没心思去再改了,反正就这个样子。
我这个有点接近管道过滤器的风格(使用 set 偷懒)。
我没测出来bug,在指定的输出格式下,当然,对其他的输出格式这段代码应该是毫无抵抗力的。
#include<iostream>
#include<string>
#include<set>
#include<vector>
#include<stdlib.h>
#include<stdio.h>
#include<fstream>
using namespace std;
//kwic
void InPut(const char* filename,vector<string>& vv)
{
FILE* fp = fopen(filename, "r+");
if (fp == nullptr)
{
printf("文件打开失败!\n");
exit(1);
}
char buff[256] = { 0 };
while (!feof(fp))
{
fgets(buff, 255, fp);
string tmp(buff);
tmp.pop_back();
vv.push_back(move(tmp));
}
fclose(fp);
}
void Circular_Shifter(vector<string>& vv, set<string>& ss)//变换//排序
{
for (int i = 0;i < vv.size();i++)
{
string tmp = vv[i];
while (ss.find(tmp) == ss.end())
{
ss.insert(tmp);
for (int i = 0;i < tmp.size() && tmp[i] != ' ';i++)
{
if (i == 0)tmp.push_back(' ');
tmp.push_back(tmp[i]);
}
auto begin = tmp.begin();
auto last = begin;
for (;*last != ' ';)
{
last++;
}
if (*last == ' ')last++;
tmp.erase(begin, last);
}
}
}
//void Alphabetizer(set<string>& ss)//排序
//{}
void OutPut(const char *filename,set<string>& ss)//输出
{
/*for (auto& x : ss)
{
std::cout << x << std::endl;
}*/
//FILE* fp=fopen(filename, "w");
std::ofstream swrite(string(filename), ostream::app);
for (auto& len : ss)
{
swrite << len << endl;
}
swrite.close();
}
int main()
{
vector<string> vv;
InPut("a.txt",vv);
set<string> ss;
Circular_Shifter(vv,ss);
//Alphabetizer(ss);
OutPut("b.txt",ss);
return 0;
}
测试