如何在以前读过的行中找到一些单词并在输出中删除它 - 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++ 中的读/写字符串的主要内容,如果未能解决你的问题,请参考以下文章
如何在单独的行中打印每个单词。除第一个单词外,每个单词都大写
如果单词退出,则删除行并在powershell中打印具有两个单词的行之间的所有行