C ++比较两个不同文本文件之间的单词

时间:2015-07-02 16:34:47

标签: c++ text-files fstream string-comparison

我有2个文本文件:

  1. 主文件:Library.txt
  2. 要比较的文件:fileToCompare.txt

  3. 主文件( 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的文件大小,比较所有单词需要一个小时。所以我想出了一个方法:

    1. fileToCompare.txt 按字母顺序排序,因此始终从字母“a”开始(如果是)。它像往常一样比较,当它达到字母“b”时,它会在“lib /”目录中创建另一个文本文件 Library2.txt
    2. ofstream所有字词都从字母“b”开始到 Library2.txt 。现在,它不是与主文件进行比较,而是与 Library2.txt 进行比较。或者我现在可以说 Library2.txt 是主文件。
    3. 比较过程从字母“b”开始继续,如果它达到字母“c”,则会创建另一个文本文件 Library3.txt ofstream所有单词从字母开始“ c“等等......直到字的结尾显然从”z“开始,这是比较过程的结束。

    4. 但问题是它不会消除相同的词语,实际上有些词语会消除,但很多人不这样做。我检查了主文件,输出文件中的一些单词是相同的 这是 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;
      }
      

2 个答案:

答案 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按字母顺序排序,您的代码可以利用它。

  1. 从每个文件中读取一个单词。
  2. 如果两个单词相同,请阅读文件中的下一个单词。
  3. 如果fileToCompare.txt中的单词小于Library.txt中的单词,请保留来自Library.txt的单词并从fileToCompare.txt中读取下一个单词。否则,请保留fileToCompare.txt中的单词并阅读下一个单词Library.txt。
  4. 继续这样做,直到没有更多的文字可读。
  5. 最后,如果fileToCompare.txt中还有更多单词,请阅读并打印它们。
  6. 以下程序遵循上述逻辑,似乎对我有用。

    isInstalled