2014-03-26 43 views
4

我有这样的输入:(50.1003781N, 14.3925125E)它存储在const string & input。我想要做的是提取括号,得到代表GPS协调的数字 - 50.1003781,保存N并为第二个坐标同样做。C++ istringstream和空白

所以这里去我的代码:

istringstream iStream(input); 

char brackets[2]; //To store the brackets 
char types[2]; //To store if it is N/S or W/E 
char delim; //To store "," 
double degrees[2]; 

iStream >> brackets[0] >> degrees[0] >> types[0] >> delim; 

//The delim loads the "," and here goes my problem with whitespace which is next 

iStream >> degrees[1] >> types[1] >> brackets[1]; 

但它无法在装载degrees[1],它逗号之后加载零和tellg()说-1可能是因为空白的。解析的字符串应该是这样的:

cout << brackets[0]; // "(" 
cout << degrees[0]; // "50.1003781" 
cout << types[0]; // "N" 
cout << delim; // "," 
cout << degrees[1]; // "14.3925125" 
cout << types[1]; // "E" 
cout << brackets[1]; // ")" 

我试过skipws和noskipws但没有效果。有人可以帮忙吗?非常感谢。

回答

8

这个问题非常微妙,但它与14.3925125E中的E以科学记数法解析的事实有关。在数学中,E后缀是将其操作数乘以后续数字10乘以其缩写。例如,科学记数法中的5.23E4表示5.23 * 10^4

在你的情况下,由于一个数字没有遵循E后缀,因此将其解析为无效的浮点数字,因此该数字未分配给degrees[1]

我不建议直接将值读入degrees[1],而是将其读入字符串,解析E中的浮点部分,并将其转换并赋值给它们各自的变量。

+0

快速问题,为什么下面的代码不像行为问题中的代码? [code](http://pastie.org/8971910) –

+0

@ viki.omega9您尚未描述两个程序之间的行为差​​异,但仅仅是您可以在科学记数法中将浮点值保存在键入'float'或'double'。你正在提取一个整数,所以它只占用整数部分('10')。而对于程序的第二部分,你提取了错误的变量,你应该做'ss >> extra >> num >> deg'。 [见这里](http://ideone.com/nO4Nyt) – 0x499602D2