2012-09-19 29 views
2

您好我想問一下如何從字符串中解析多個由「/」和空格分隔的浮點數。如何使用具有多個分隔符的istringstream

該文件的文本格式是「f 1/1/1 2/2/2 3/3/3 4/4/4」 我需要將這行文本中的每個整數解析爲幾個int變量,然後用它來構造一個「臉」對象(見下文)。

int a(0),b(0),c(0),d(0),e(0); 
int t[4]={0,0,0,0}; 
//parsing code goes here 
faces.push_back(new face(b,a,c,d,e,t[0],t[1],t[2],t[3],currentMaterial)); 

我可以用的sscanf()實現,但我已經通過我的UNI講師警告從了,所以我要尋找一個替代。我也不允許其他第三方庫,包括boost。

正則表達式和用stringstream()解析已被提及,但我真的不知道太多,並會感謝一些建議。

+0

你想分析12個整數,在四組三個,分成九個變量,五個單獨的和四個數組?這怎麼能讓人覺得呢? –

+0

儘管問題最初看起來不像重複,但您似乎想要做的事情已在之前的答案中進行了介紹:http://stackoverflow.com/a/2909187/179910 –

回答

1

如果你正在閱讀性病文件:: ifstream,沒有必要對於std :: istringstream(儘管使用兩者非常相似,因爲它們從相同的基類繼承而來)。下面是如何使用的std :: ifstream的做到這一點:

ifstream ifs("Your file.txt"); 
vector<int> numbers; 

while (ifs) 
{ 
    while (ifs.peek() == ' ' || ifs.peek() == '/') 
     ifs.get(); 

    int number; 
    if (ifs >> number) 
     numbers.push_back(number); 
} 
0

你可以使用boost :: split。

樣品的例子是:

string line("test\ttest2\ttest3"); 
vector<string> strs; 
boost::split(strs,line,boost::is_any_of("\t")); 

cout << "* size of the vector: " << strs.size() << endl;  
for (size_t i = 0; i < strs.size(); i++) 
    cout << strs[i] << endl; 

更多信息這裏:

http://www.boost.org/doc/libs/1_51_0/doc/html/string_algo.html

而且相關:

Splitting the string using boost::algorithm::split

+0

我的歉意。它讓我意識到我被告知要避免任何非標準的圖書館(因爲我的講師不會擁有這些圖書館)。 –

1

考慮到你的榜樣f 1/1/1 2/2/2 3/3/3 4/4/4你需要閱讀的是:char int char int char int int char int char int int char int char int

要做到這一點:

istringstream是(STR);

char f, c; 
int d[12]; 

bool success = (is >> f) && (f == 'f') 
      && (is >> d[0]) && (is >> c) && (c == '/') 
      && (is >> d[1]) && (is >> c) && (c == '/') && 
      ..... && (is >> d[11]); 
1

我會做到這一點的方法是change the interpretation of space包括其他分隔符。如果我想要,我會使用不同的std::ostream對象,每個對象都有一個設置爲處理一個分隔符的std::ctype<char>方面,並使用共享std::streambuf

如果你想使用分隔明確你也可以使用合適的操縱跳過分離器或,如果它不存在,則表示失敗的:

template <char Sep> 
std::istream& sep(std::istream& in) { 
    if ((in >> std::ws).peek() != std::to_int_type(Sep)) { 
     in.setstate(std::ios_base::failbit); 
    } 
    else { 
     in.ignore(); 
    } 
    return in; 
} 

std::istream& (* const slash)(std::istream&) = Sep<'/'>; 

的代碼沒有進行測試,並鍵入移動設備,即可能包含小錯誤。你會喜歡這個讀取數據:

if (in >> v1 >> v2 >> slash >> v3 /*...*/) { 
    deal_with_input(v1, v2, v3); 
} 

注:以上使用假設輸入作爲

1.0 2.0/3.0 

即第一個值後面輸入一個空格和第二個值後斜槓。