2015-04-07 41 views
0

我有一個文本文件,如下所示:的fstream和sstream處理:輸入重複

1 A Rocket-1 1.2 
2 B Rocket-2 2.3 
3 C Rocket-3 3.4 
Invalid Format Line 
4 D Rocket-4 4.5 
5 E Rocket-5 5.6 

正如你所看到的,格式其次是:<int> <char> <string literal> <float>

我想提取從各個數據類型每行並打印它們。我這樣做:

#include <iostream> 
#include <fstream> 
#include <sstream> 
#include <string> 

using namespace std; 

int main() { 
    ifstream in; 
    in.open("input.txt"); 
    if (in) { 
     while (getline(in, x)) { 
      istringstream iss(x); 
      iss >> i >> c >> s >> f; 
      cout << "\n\nInteger:" << i << ", Character: " << c << ", String: " 
       << s << ", Float: " << f << endl << endl; 
     }  
    } 
    else { 
     cout << "\nError reading input file\n"; 
    } 
    cin.get(); 
    return 0; 
} 

輸出是:

Integer:1, Character: A, String: Rocket-1, Float: 1.2 

Integer:2, Character: B, String: Rocket-2, Float: 2.3 

Integer:3, Character: C, String: Rocket-3, Float: 3.4 

Integer:3, Character: C, String: Rocket-3, Float: 3.4 

Integer:4, Character: D, String: Rocket-4, Float: 4.5 

Integer:5, Character: E, String: Rocket-5, Float: 5.6 

正如你可以看到,其中一條線(3)被重複。 每當我有一個無效格式的行,我只想忽略它,順利(沒有崩潰)轉換到下一個有效的格式行。請在我的代碼中建議更改以處理此問題。

+0

@nhgrif - mea culpa。 –

回答

0

您可以測試流插入的結果。如果這不是正確的格式,這將是處於無效狀態:

if(!(iss >> i >> c >> s >> f)) // skip the loop if not correct format 
    continue; 
+0

你是男人!謝謝。 –

0

你所面臨的問題是由於一個事實,即無效的字符串被放置在您的istringstream,從中你又試圖根據提取內轉換爲有效的格式。這當然會失敗,所以變量i,c,s和f保留其原始值。如果你想忽略無效行,你應該查詢istringstream的失敗位。沿

if (iss.fail()) { 
    continue; 
} 

線的東西應該做的伎倆。 從http://en.cppreference.com/w/cpp/io/basic_istream/operator_gtgt

如果提取失敗(例如,如果輸入一個字母,其中數字是 預期),值保持爲未修改和failbit設置