2012-12-10 165 views
0

我有一个包含类似的信息的行和列的文件:如何将一行输入分隔为多个变量?

104857 Big Screen TV 567.95 
573823 Blender   45.25 

我需要将此信息解析成三个独立的内容,其中包括左边的识别数字的字符串,包含项目名称的字符串,和一个包含价格的双变量。信息总是在相同的列中找到,即按照相同的顺序。

我无法完成此操作。即使不从文件中读取,并只使用一个样本串,我尝试只是输出混乱的烂摊子:

string input = "104857 Big Screen TV 567.95"; 
string tempone = ""; 
string temptwo = input.substr(0,1); 
tempone += temptwo; 
for(int i=1 ; temptwo != " " && i < input.length() ; i++) 
{ 
    temptwo = input.substr(j,j); 
    tempone += temp2; 
} 
cout << tempone; 

我试着调整上面的代码很长一段时间,但没有运气,我可以”现在还没有其他办法可以做到这一点。

+0

你可以在文件中进行更改并添加列分隔符像104857 |大屏幕电视| 567.95 ...之后会很容易。 –

+0

没有不幸的不是。 –

回答

4

您可以使用std::find_first_ofstd::find_last_of找到第一个空格和最后一个空格。你可以使用它来更好地将字符串拆分为3 - 第一个空格出现在第一个变量之后,最后一个空格出现在第三个变量之前,其间的所有内容都是第二个变量。

+0

做得非常好... –

0

如何以下伪代码:

string input = "104857 Big Screen TV 567.95"; 
string[] parsed_output = input.split(" "); // split input string with 'space' as delimiter 

// parsed_output[0] = 104857 
// parsed_output[1] = Big 
// parsed_output[2] = Screen 
// parsed_output[3] = TV 
// parsed_output[4] = 567.95 

int id = stringToInt(parsed_output[0]); 
string product = concat(parsed_output[1], parsed_output[2], ... ,parsed_output[length-2]); 
double price = stringToDouble(parsed_output[length-1]); 

我希望,这是明确的。

0

试试打破文件的组件:

  • 你知道一些永远是第一位的,我们也知道了一些没有空格。
  • 后的数字可以有空格的字符串,但不会包含任何数字(我假设)
  • 这个标题之后,你将拥有更多的数字(无空格)

从这些组件中,你可以推断出:

抓取第一个数字就像使用文件流<<读取一样简单。 获取字符串需要您检查,直到您到达一个数字,一次抓取一个字符并将其插入到字符串中。最后的数字就像第一个,使用文件流<<

这似乎是功课,所以我会让你把其余的一起休息。

0

我会尝试一个正则表达式的东西沿着这些线路:

^([0-9]+)\s+(.+)\s+([0-9]+\.[0-9]+)$ 

我不是在正则表达式的语法很不错,但([0-9]+)对应的数字序列(这是id),([0-9]+\.[0-9]+)是浮点数(价格)和(.+)是通过“空格”字符序列与两个数字分开的字符串:\s+。 下一步将检查您是否需要使用“.50”或“10”等价格。

相关问题