2014-07-25 30 views
0

字符我有.txt文件,像这里面的文字分隔(这只是一个片段):阅读从字符串多个数据,通过使用sstream

... 
[332, 605]-[332, 592], srednica: 13 
[324, 593]-[332, 605], srednica: 14.4222 
[323, 594]-[332, 605], srednica: 14.2127 
[323, 594]-[331, 606], srednica: 14.4222 
[324, 593]-[324, 607], srednica: 14 
[323, 594]-[323, 607], srednica: 13 
[319, 596]-[319, 607], srednica: 11 
[320, 595]-[320, 607], srednica: 12 
... 

我需要什么,以从获得第一个4号每行并将它们存储为整数。

我已经尝试了水木清华这样的:

ifstream file("punkty_srednice.txt"); 
string line; 
int ax, ay, bx, by; 
while(getline(file, line)) { 
    stringstream s(line); 
    string tmp; 
    s >> tmp >> ax >> tmp >> ay >> tmp >> bx >> tmp >> by >> tmp; 
    cout << ax << " " << ay << " " << bx << " " << by << endl; 
} 

输出(只是其中的一部分):

... 
506 506 -858993460 -858993460 
503 503 -858993460 -858993460 
495 503 -858993460 -858993460 
497 503 -858993460 -858993460 
500 497 -858993460 -858993460 
492 503 -858993460 -858993460 
... 

如u一看到有喜欢的-858993460

我一些陌生号码做了其他尝试,删除tmp,并像这样直行:

s >> ax >> ay >> bx >> by; 

但随后输出只包含垃圾号码,如-858993460

我该如何处理呢?

回答

1

您可以使用std::getline','作为分隔符来获取第一部分和数字。然后用空格替换所有非数字字符(例如,请参阅std::transform)。然后将结果字符串放在std::istringstream中,并从中读取四个数字。


上有什么错你的代码的一些技巧,用绳子使用时大多归结为是,输入操作>>读取空间分隔字符串。

让线路

 
[332, 605]-[332, 592], srednica: 13 

您的反馈会

  1. tmp它将把"[332,"
  2. ax它会把605
  3. tmp它将把"]-[332,"
  4. ay它将把592
  5. tmp它将把"],"
  6. bx尝试读取字符串"srednica"这不是一个有效的数字,输入将失败和设定fail标志输入流,使所有以下输入无效

如何使用std::transform替换字符串到空间中的任何非数字字符:

std::string s = "[332, 605]-[332, 592]"; 
std::cout << "Before: \"" << s << "\"\n"; 

std::transform(std::begin(s), std::end(s), std::begin(s), 
    [](const char& ch) -> char 
    { 
     return (std::isdigit(ch) ? ch : ' '); 
    }); 

std::cout << "After : \"" << s << "\"\n"; 

上面的代码打印

 
Before: "[332, 605]-[332, 592]" 
After : " 332 605 332 592 " 
+0

您是完全地正确!现在我意识到为什么即时获得2个好价值和2个垃圾。我无法找到std :: transform的好例子,所以我逐步替换了'''''''''',''' – ilovkatie

+0

@ user3804906请按照我的答案中的链接。 :) –