我正在为应用程序的自定义选项文件编写c ++解析器。我有一个循环,以形式读取行 option=value
从文本文件中 value
必须转换为 double
。在伪代码中,它执行以下操作:
while(not EOF)
statement <- read_from_file
useful_statement <- remove whitespaces, comments, etc from statement
equal_position <- find '=' in useful_statement
option_str <- useful_statement[0:equal_position)
value_str <- useful_statement[equal_position:end)
find_option(option_str) <- double(value_str)
为了处理字符串拆分和传递给函数,我使用 std::string_view
因为它避免了过度复制并清楚地表明了查看预先存在的片段的意图 std::string
。我已经完成了所有事情 std::string_view value_str
指向的确切部分 useful_statement
包含我想要提取的值,但我无法弄清楚读取的方式 double
从一个 std::string_view
。
我知道 std::stod
哪个不起作用 std::string_view
。它允许我写
double value = std::stod(std::string(value_str));
然而,这很难看,因为它转换为实际上不需要的字符串,即使它在我的情况下可能没有明显的差异,如果必须从文本中读取大量的数字,它可能会太慢文件。
另一方面, atof
将无法正常工作,因为我不能保证null终止符。我可以通过添加来破解它 \0
至 useful_statement
在构造它时,如果代码被更改/重构,这将使代码混淆读者并使其容易破解。
那么,什么是干净,直观和合理有效的方法呢?