读取以行分隔的字符串列表时跳过空行
Skipping blank lines when reading line delimited list of strings
我正在尝试使用boost::spirit解析一个简单的文本文件。文本文件是以行分隔的字符串列表。我可以让它大部分工作,除了当涉及到空白行时,我想跳过它。
我已经尝试了几种方法,但我要么停止解析空白行,要么将空行包含在我的结果中。
有没有办法告诉我的语法跳过空白行?
法典
std::ifstream ifs("one.txt");
ifs >> std::noskipws;
std::vector< std::string > people;
if (parse(
istream_iterator(ifs),
istream_iterator(),
*(as_string[+print >> (eol | eoi)]),
people))
{
std::cout << "Size = " << people.size() << std::endl;
for (auto person : people)
{
std::cout << person << std::endl;
}
}
一.txt
Sally
Joe
Frank
Mary Ann
Bob
我得到什么
Sally
Joe
Frank
Mary Ann
我想得到什么
Sally
Joe
Frank
Mary Ann
Bob
奖励:我可以同时从语法中的行中删除前导或尾随空格吗?当然,我需要保留玛丽安的空间。
if (qi::phrase_parse(
first, last,
-qi::as_string[qi::lexeme[+(qi::char_ - qi::eol)]] % qi::eol,
qi::blank,
people))
我将参考 提升精神船长问题 了解更多背景。快速笔记:
if (qi::phrase_parse(
// ^ ----- use a skipper to parse phrases whith a skipper (`qi::blank` here)
first, last,
-qi::as_string[qi::lexeme[+(qi::char_ - qi::eol)]] % qi::eol,
// | | | ^---- 1.
// +---- 2. | +---- 4.
// 5. ----v 3. ----+
qi::blank,
people))
- 匹配以换行符分隔的项目列表
- "-"使项目可选(忽略空行)
-
lexeme
在子表达式中包含空格(但它仍然预跳过,因此只有空格的行计为空行;如果您不希望发生预跳过,请使用no_skip
) -
+
需要至少 1 个匹配项,因此空名称不被视为名称 blank
skipper 跳过空格,但不跳过换行符;这是因为换行符对语法很重要。另请注意,lexeme
仍保留内部空格
在科里鲁现场观看
更新 作为对评论的回应,增加的复杂性是由于跳过空格。如果您很高兴事后修剪空格,请务必使用
if (parse(first, last, - as_string[+(char_ - eol)] % eol, people))
在科里鲁也看到它
相关文章:
- C++:如何使函数只返回作为列表一部分的字符串
- C++ 创建包含链表和字符串的对象的链接列表时出错
- 在 c++ 中多次更改字符串列表
- C++未知长度字符串的数组,其行为类似于 Python 字符串列表
- 如何将包含括号的字符串列表平展为单个列表?
- 无法在声明时使用初始值设定项列表初始化常量字符*/字符串数组的向量
- C++完全复制要字符串的字符列表,而不会忽略多个空格
- (C++) 字符串文本与参数列表不匹配
- C++使用旧编译器GCC 4.4.0在结构列表中查找字符串
- 如何存储字符串列表
- 如何在数组或链接列表中查找特定字符串
- C++ EnumWindows,将列表存储在字符串数组中
- 给定字符串和单词 S 的列表,检查列表中是否存在 S
- C 需要帮助的作业程序,该程序在文件列表中读取并在每个双重的双重列表中添加一个字符串
- 查找可变参数列表的字符串格式指定符
- 在链接列表中添加字符串的简单方法
- 嵌套列表(字符串向量的向量)初始化失败
- 通过单词列表将两个字符串移动以比较每个单词
- 链接的列表字符串分类问题
- 穿过链接列表以查找字符串