2008-11-19 42 views
0

我需要使用C++在带空格的文本中读入数字值。将混合数据的文件读入C++字符串

例如,看起来像数据:

text1 
1.0 
text two 
2.1 
text2 again 
3.1 

不能与2个"infile >>"语句读入。我没有任何运气getline 要么。我最终希望用这两个数据元素填充struct。有任何想法吗?

回答

1

标准IO库不会为您单独完成此工作,您需要对数据进行一些简单的解析以确定文本结束位置和数值开始的位置。如果你可以做一些简化的假设(比如说每行只有一个文本/数字对,并且错误恢复最小),那么将整个事件整理成一个字符串然后手动扫描就不会太糟糕。否则,你最好使用正则表达式或解析库来处理这个问题,而不是重新发明轮子。

0

如果你能确定你的输入格式良好的,你可以尝试这样的例子:

#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; 
     } 
    } 
} 

如果您还必须验证输入(而不是仅仅试图解析东西看起来像一个双重的),你将不得不写一些解析器,这不难,但无聊。

+0

也许我不记得std :: string的操作符>>的语义是否正确,但是没有在文本字段中收集任何空格? – 2008-11-19 18:30:26

1

为什么?您可以使用getline提供空格作为行分隔符。如果下一个是数字,则拼接提取的部分。

0

伪代码。

这应该工作。不过,它假设你有文字/数字。你也必须做一些简单的工作,让所有的打字都很开心。

while(! eof) 
    getline(textbuffer) 
    getline(numberbuffer) 
    stringlist = tokenize(textbuffer) 
    number = atof(numberbuffer)