将混合数据文件读入 C++ 字符串
Posted
技术标签:
【中文标题】将混合数据文件读入 C++ 字符串【英文标题】:Reading a file of mixed data into a C++ string 【发布时间】:2008-11-19 17:40:57 【问题描述】:我需要使用 C++ 读取带有空格的文本,后跟一个数值。
例如,看起来像这样的数据:
text1
1.0
text two
2.1
text2 again
3.1
不能用 2 个"infile >>"
语句读入。我对getline
没有任何运气
任何一个。我最终想用这两个数据元素填充struct
。有什么想法吗?
【问题讨论】:
【参考方案1】:标准 IO 库不会单独为您执行此操作,您需要对数据进行某种简单的解析,以确定文本的结束位置和数值的开始位置。如果您可以做出一些简化的假设(例如说每行只有一个文本/数字对,并且错误恢复最少),那么将整个内容 getline() 变成一个字符串然后手动扫描它也不会太糟糕。否则,您最好使用正则表达式或解析库来处理这个问题,而不是重新发明***。
【讨论】:
【参考方案2】:为什么?您可以使用 getline 提供空格作为行分隔符。如果 next 是数字,则缝合提取的部分。
【讨论】:
【参考方案3】:如果您可以确定您的输入格式正确,您可以尝试以下示例:
#include <iostream>
#include <sstream>
int main()
std::istringstream iss("text1 1.0 text two 2.1 text2 again 3.1");
for ( ;; )
double x;
if ( iss >> x )
std::cout << x << std::endl;
else
iss.clear();
std::string junk;
if ( !(iss >> junk) )
break;
如果您确实必须验证输入(而不仅仅是尝试从中解析任何看起来像 double 的内容),您将不得不编写某种解析器,这并不难,但很无聊。
【讨论】:
也许我没有正确记住 std::string 的操作符的语义>>,但这不是无法在文本字段中收集任何空格吗? 是的,流的运算符>>都跳过了空格(physical-thought.blogspot.com/2008/06/…)。 是的,它会跳过空格,但作者只对数字感兴趣。我在这里写的只是从流中解析出所有以空格分隔的数字的“快速而肮脏”的方式。【参考方案4】:伪代码。
这应该可行。但是,它假设您有成对的文本/数字。你也必须做一些调整才能让所有的打字都开心。
while( ! eof)
getline(textbuffer)
getline(numberbuffer)
stringlist = tokenize(textbuffer)
number = atof(numberbuffer)
【讨论】:
以上是关于将混合数据文件读入 C++ 字符串的主要内容,如果未能解决你的问题,请参考以下文章