我有2个文本文件:
主文件( Library.txt )包含很多单词,但仍然不完整。因此,我在线搜索以查找更多单词并将其保存在 fileToCompare.txt 中。但Library.txt&中必须有许多相同的单词。 fileToCompare.txt,所以要删除我需要将 fileToCompare.txt 与 Library.txt 进行比较的相同单词,以确定哪些单词相同。
我消除相同单词的方法是将每个单词逐一与Library.txt进行比较。这意味着如果第一个单词是“apple”,那么“apple”将在Library.txt中逐个比较每个单词1,当它找到它时,“apple”就是这两个文件中出现的相同单词。如果没有找到,“apple”将在控制台中cout
并保存文本文件(之前要求用户输入文件名以保存不存在的单词)。
我发现如果 fileToCompare.txt 包含很多单词,例如1mb的文件大小,比较所有单词需要一个小时。所以我想出了一个方法:
ofstream
所有字词都从字母“b”开始到 Library2.txt 。现在,它不是与主文件进行比较,而是与 Library2.txt 进行比较。或者我现在可以说 Library2.txt 是主文件。ofstream
所有单词从字母开始“ c“等等......直到字的结尾显然从”z“开始,这是比较过程的结束。
但问题是它不会消除相同的词语,实际上有些词语会消除,但很多人不这样做。我检查了主文件,输出文件中的一些单词是相同的
这是 Library.txt &的下载链接。 fileToCompre.txt 如果您需要它:
Library.txt - > https://www.dropbox.com/s/ihqpaju3b33ysgv/Library.txt?dl=0
fileToCompre.txt - > https://www.dropbox.com/s/pioy77g9mfz9och/fileToCompare.txt?dl=0
我上面解释的可能是令人困惑的,实际上代码非常混乱,我知道这很难理解,一定要带你整整一个晚上弄明白。
#include<iostream>
#include<conio.h>
#include<fstream>
using namespace std;
int main(){
string txt="fileToCompare.txt";
ifstream lib;
lib2.open(txt.c_str());
if(!lib2){
cout<<"\n Oops! "<<txt<<" is missing!\n If such file exists, be sure to check the file extension is .txt\n";
getch();
main();
}
cout<<"\n Enter the file name to save the non-existing words\n (required an extension at the end)\n";
getline(cin,word);
string libPath="lib/"+word,alphaStr="a",libtxt[26]={"Library.txt","lib/Library2.txt","lib/Library3.txt","lib/Library4.txt","lib/Library5.txt","lib/Library6.txt","lib/Library7.txt","lib/Library8.txt","lib/Library9.txt","lib/Library10.txt","lib/Library11.txt","lib/Library12.txt","lib/Library13.txt","lib/Library14.txt","lib/Library15.txt","lib/Library16.txt","lib/Library17.txt","lib/Library18.txt","lib/Library19.txt","lib/Library20.txt","lib/Library21.txt","lib/Library22.txt","lib/Library23.txt","lib/Library24.txt","lib/Library25.txt","lib/Library26.txt"};
const char* wordChar=libPath.c_str();
const char* libManip=libtxt[0].c_str();
int alphaI=1,boolcheck=1;
lib.open(libManip);
outWord.open(wordChar);
while(getline(lib2,libStr2)){
if(libStr2.substr(0,1)!=alphaStr){
lib.close();
lib.open(libManip);
libMO.open(libtxt[alphaI].c_str());
while(getline(lib,libStr)){
if(libStr.substr(0,1)!=alphaStr){
libMO<<libStr<<endl;
}
}
libManip=libtxt[alphaI].c_str();
libMO.close();
lib.close();
alphaI++;
alphaStr=libStr2.substr(0,1);
boolcheck=1;
}
if(boolcheck==1){
lib.close();
lib.open(libManip);
boolcheck=0;
}
while(getline(lib,libStr)){
if(libStr==libStr2){
found=1;
break;
}
}
if(!found){
cout<<"\n "<<libStr2;
outWord<<libStr2<<endl;
countNF++;
}
count++;
found=0;
}
cout<<"\n\n\n Total words: "<<count<<"\n Total words reserved: "<<countNF;
lib2.close();
lib.close();
getch();
return 0;
}
答案 0 :(得分:0)
您应该使用不同的算法/数据结构进行比较。
以下示例使用std::set
。它读取两个文件并将合并的结果写入merged.txt
:
#include <iostream>
#include <set>
#include <string>
#include <fstream>
int main()
{
std::ifstream lib("Library.txt");;
std::set<std::string> lib_set;
std::string word;
while (lib >> word)
{
lib_set.insert(word);
}
std::ifstream check("fileToCompare.txt");
while (check >> word)
{
lib_set.insert(word);
}
std::ofstream merged("merged.txt");
std::set<std::string>::iterator it;
for (it = lib_set.begin(); it != lib_set.end(); ++it)
{
merged << *it << std::endl;
}
}
在我的计算机上为您的数据集执行此操作需要0.8秒。
答案 1 :(得分:0)
由于文件fileToCompare.txt和Library.txt按字母顺序排序,您的代码可以利用它。
以下程序遵循上述逻辑,似乎对我有用。
isInstalled