解析时忽略txt文件中的某些行
Posted
技术标签:
【中文标题】解析时忽略txt文件中的某些行【英文标题】:Ignoring certain lines in a txt file when parsing 【发布时间】:2019-03-26 21:53:02 【问题描述】:我想从一个 txt 文件中读取文件并将一些行与正则表达式进行比较。 txt 文件的第一行应以字符串#FIRST 开头。 如果字符串应以“#”开头,则应忽略该行并继续。所以计数器应该有它所做的值 1,它应该转到第二个 if 语句 if(counter==1)。但是它不会转到第二个 if 语句。
txt 文件:
#FIRST
#
#haha
我希望代码运行一次后输出会很好。
输出是:
good.
应该是
good.
good.
…………
#include <iostream>
#include <string>
#include <vector>
#include <regex>
#include <fstream>
#include <sstream>
int main()
std::ifstream input("test.txt");
std::regex e("#FIRST");
std::regex b("haha");
int counter;
for (counter = 0; !input.eof(); counter++)
std::cout << counter << "\n";
std::string line;
if (counter == 0)
getline(input, line);
if (std::regex_match(line, e))
std::cout << "good." << std::endl;
counter++;
else
std::cout << "bad." << std::endl;
break;
getline(input, line);
if (line[0] == '#')
continue;
if (counter == 1)
getline(input, line);
if (std::regex_match(line, b))
std::cout << "good." << std::endl;
else
std::cout << "bad." << std::endl;
break;
return 0;
【问题讨论】:
嗨@senpai - 你能发布当前的输出吗? @sanchitarora 我已将其添加到顶部的帖子中 计算getline
电话的发生情况。 counter = 0 => 2, counter = 1 => 2 但你只有 3 行...简单的调试(即打印出行)会帮助你找到这个。
考虑到***.com/questions/4533063/how-does-ifstreams-eof-work,建议对代码进行一些重组
扩展 @J.R.的评论,Why is iostream::eof inside a loop condition considered wrong?
【参考方案1】:
问题在于第一个 if
子句中的 break
语句。在获得输入的第一行后,程序遇到break
语句并立即跳出循环。在 for 循环中没有执行进一步的语句,我相信这是您所看到的行为。您必须将程序重组为:
for loop
getline()
if (counter == <>)
// no break
else if (line[0] == '#')
continue;
else
// whatever else you want to get done
【讨论】:
我使用了你的方法,但我仍然面临同样的问题以上是关于解析时忽略txt文件中的某些行的主要内容,如果未能解决你的问题,请参考以下文章
用 Python 解析 CSV / 制表符分隔的 txt 文件