如何在以前读过的行中找到一些单词并在输出中删除它 - C++ 中的读/写字符串

Posted

技术标签:

【中文标题】如何在以前读过的行中找到一些单词并在输出中删除它 - C++ 中的读/写字符串【英文标题】:How to find some words in previously read lines and delete it in output- read/write strings in c++ 【发布时间】:2014-02-04 05:23:50 【问题描述】:

我正在用 C++ 读取一个文本文件,并将一堆成对的数字从它写入另一个文件。

输入文件的结构是一堆成对的数字和一些行,例如“remove120 43 blah bla”,表示删除以前的成对数字之一,在这种情况下是120 43(肯定存在于前面的一行中) .

所以,每当一行中有一个单词“remove”时,我想在前面的行中找到它的配对数字并将其从我的输出中删除。

附:我过去提供过这个输入文件,但我现在不擅长处理字符串,这让我很困惑。

我是这样开始的:

string s;
ifstream myfile("input.txt");
ofstream output ("output.txt");

if(myfile.is_open())
    while (!myfile.eof())
        getline (myfile, s);
.
.
.

【问题讨论】:

【参考方案1】:

一些代码有助于查看您当前的位置,但根据您的描述,我会设置如下内容:

istream file;
string line;
map pairs;
sstream line_parser;
int one, two

while (file >> line) 
    line_parser.str(line);
    if (line[0] == 'r') 
       line_parser >> line; // take 'remove' out of the stream
       line_parser >> one;
       pairs.erase(pairs.find(one));
     else 
       line_parser >> one;
       line_parser >> two;
       pairs[one] = two;
    

编辑: 这假设您不会有重复的键,否则这些值将被覆盖。任何容器都可以代替地图来保存对

【讨论】:

感谢您的回答。这对我来说似乎很棒,但是我在这里理解 istream 和 sstream 以及使用地图时遇到了麻烦,我会以某种方式弄清楚它们。再次感谢。 对不起,istream应该是ifstream,sstream是另一个std流对象,用于处理内存中的字符串。在这种情况下,它从文件中读取的行中提取单词和整数。至于地图,我只是选择它作为简单的键引用,一个向量可以很容易地替换。 感谢您的解释 +1 用于展示许多相关技术。也就是说,我在问题中看不到任何暗示这些对是键/值的东西。很难建议一个实现,因为问题并没有说明输出的顺序是否需要与输入的顺序相匹配。如果不是,那么 std::set<std::pair<int,int>> 看起来不错,并且与您所做的很接近。 sstream 应该是 stringstream (前者是包含标题),虽然没有 operator[] peek() 应该按您的意愿工作。如果顺序很重要,那么vector 带有可选索引以避免重复的线性搜索......

以上是关于如何在以前读过的行中找到一些单词并在输出中删除它 - C++ 中的读/写字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何在单独的行中打印每个单词。除第一个单词外,每个单词都大写

使用本地网格删除Free-jqGrid中的多行(4.15)

如果单词退出,则删除行并在powershell中打印具有两个单词的行之间的所有行

从行中删除单词,并使用python将行保存到文件中

SQL Server 2012 - 使用 LAG 从以前的行中获取数据

如何在不同的行中添加 alertView 中的按钮?