【发布时间】:2017-01-19 08:19:22
【问题描述】:
我正在做一个从文本文件中读取数据的任务,我必须将数据放入一个向量中,同时过滤掉以 0 和 cmets 开头的数字。除了过滤 cmets 外,我什么都没有。我理论上应该有效,但我只是在执行它时遇到了麻烦。这是问题代码:
vector<string> nums_after;
for(int i = 0; i < nums_before.size(); i++)
{
string current = nums_before[i];
if (current.front() == '(')
{
current.erase(current.find("(*"), current.find("*)"));
}
if (current.front() == '0')
{
continue;
}
nums_after.push_back(current);
}
我的示例文件如下所示:
101481
10974
1013
(* comment *)0
28292
35040
35372
0000
7155
7284
96110
26175
但是我的代码只过滤掉了 (*,甚至没有过滤掉星号后面的空格。我想我只是在组合 erase() 和 find() 函数时遇到了麻烦。有人有什么建议吗?
编辑:意识到我的问题是注释行被分解为三个单独的行:(*、comment 和 *)0。我现在怀疑我的 getline 函数有问题。这是它的样子:
int main() {
string line;
string fileName;
cout << "Enter the name of the file to be read: ";
cin >> fileName;
ifstream inFile{fileName};
istream_iterator<string> infile_begin {inFile};
istream_iterator<string> eof{};
vector<string> nums_before {infile_begin, eof};
while (getline(inFile, line))
{
nums_before.push_back(line);
}
这正好在第一块代码之前。
【问题讨论】:
-
你应该如何处理嵌套 cmets 的问题?
10 03 (* 05 11 (* 10 03 *) 10 01 *) 03 100需要不同的解析方法,具体取决于您的说明。编辑:你也只解析整数吗? -
我应该摆脱 cmets 之间的任何内容,但我的程序应该能够处理的文本文件没有嵌套 cmets
-
检查我的答案。您需要知道,擦除需要擦除开始位置和要擦除的字符数量,而不是结束位置 - 不是
(begin, end),而是(begin, end - begin)- 这将删除begin和end之间的所有字符,但它不会触及找到结束字符,因此您需要添加它们的计数,在您的示例中为 2。