2014-07-25 28 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請按照我的答案中的鏈接。 :) –