首页 > 解决方案 > 如何使用c ++删除文件中由双引号分隔或由逗号分隔的重复短语

问题描述

我使用此功能删除文件中的重复单词但我需要它来删除重复的表达式

例如函数当前正在做什么如果我有表达式“Hello World”“美丽的世界”该函数将从两个表达式中删除单词“world”

并且我需要这个函数来替换整个表达式,例如在文件中多次找到它时

如果我有“Hello World”“Hello World”“美丽世界”“美丽世界”这样的表达方式

该函数将删除表达式“Hello world”和“beautiful world”,并只留下一个,但不会触及单词“world”,因为该函数会将引号内的所有内容视为一个单词

这是我现在使用的代码

#include <string>
#include <sstream>
#include <iostream>
#include <unordered_set>

void Remove_Duplicate_Words(string str)
{
ofstream Write_to_file{ "test.txt" };

// Used to split string around spaces. 
istringstream ss(str);

// To store individual visited words 
unordered_set<string> hsh;

// Traverse through all words 
do
{
    string word;
    ss >> word;

    // If current word is not seen before. 
    while (hsh.find(word) == hsh.end()) {
        cout << word << '\n';
        Write_to_file << word << endl; // write to outfile 
        hsh.insert(word);
    }

} while (ss);
}


int main()
{
    ifstream Read_from_file{ "test.txt" };
    string file_content{ ist {Read_from_file}, ist{} };

    Remove_Duplicate_Words(file_content);

return 0;
}

如何删除重复的表达式而不是重复的单词?

不幸的是,我在这方面的知识非常基础,通常我所做的就是尝试各种事情直到我成功。我也尝试在这里做,但我不知道该怎么做任何帮助将不胜感激

标签: c++

解决方案


需要一点点字符串解析。

您的示例通过阅读标记来工作,这些标记类似于单词(但不完全是)。对于您的问题,标记变为单词或引用的字符串。您对令牌的定义越复杂,问题就越困难。尝试首先将标记视为同一行中的单词或引用的字符串。跨行引用的字符串可能更复杂一些。

这是一个类似的 SO 问题,可以帮助您入门:Reading quoted string in c++。您需要做类似的事情,但是您的引用字符串可以出现在行中的任何位置,而不是设置位置。所以你读到了这样的令牌:

  1. 阅读下一个单词标记(就像你现在所做的那样)
  2. 如果最后读取的标记是引号字符 ("),则读取到下一个 (") 作为单个标记
  3. 仅在不存在时检查设置和输出令牌(如果引用了令牌,请不要忘记输出引号)
  4. 将令牌插入集合。
  5. 重复直到EOF

希望有帮助


推荐阅读