2011-12-02 38 views
4

我對此有一個字符串後跟最多4個整數, EX另一個字符串文本行的文本文件:有沒有更好的方法來解析這樣的文本行?

clear "clear water.png" 5 7 
wet "wet water.png" 9 5 33 17 
soft "soft rain falling.png" 

我看到它的唯一方法是:

讀,直到空間被發現

組字符串溼

讀,直到雙引號

讀取直到第二雙引號

設置第二串以潤溼water.png

而不是線

的結束

讀取直到空間

放串通過串流

推所得整數轉換成int的向量

有沒有更好的方法來做到這一點?

感謝

+3

? – 2011-12-02 23:01:54

回答

5

這是scanf和公司真正閃耀的那類任務。

char first_string[33], second_string[129]; 

sscanf(input_string, 
    "%32s%*[^\"]%*c%128[^\"]%*c %d %d %d %d", 
    first_string, 
    second_string, 
    &first_int, 
    &second_int, 
    &third_int, 
    &fourth_int); 

你可能想要做的是,在if語句,這樣就可以測試返回值,告訴你有多少領域的轉化(例如,所以你知道你到底有多少整數讀)。

編輯:也許有些解釋會有幫助。我們來仔細分析一下:

%32s將字符串讀入第一個空格(或32個字符,以先到者爲準)。
%* [^ \ 「]忽略輸入到第一"
%* C忽略輸入的一個更字節(報價本身)
%128 [^ \」]讀取在報價中的字符串(即,直到下一個報價字符)。
%* c忽略結束報價 %d讀取一個int(我們已經完成了四次)。

每個%d之前的空間實際上是不必要的 - 它會跳過空格,但是如果沒有空格,%d無論如何都會跳過前導空格。我已經將它們包括在內,以使其更具可讀性。

+0

這不是一個標準的'scanf'。 – ybungalobill

+0

我發現這是一個很好的答案! – Andro

+0

雖然我對scanf沒有很高的評價,並且它不是慣用的C++,但是我*有*對此表示贊同。 – Jon

0

根據您可以在double-quote試圖分裂然後space拆分輸入字符串的限制。

1

醜陋的,沒有錯誤檢查,但在任何非標準庫沒有依賴關係:

string s; 
while(getline(fin, s)) 
{ 
    string word, quoted_string; 
    vector<int> vec; 

    istringstream line(s); 
    line >> word; 
    line.ignore(numeric_limits<streamsize>::max(), '"'); 
    getline(line, quoted_string, '"'); 
    int n; 
    while(line >> n) vec.push_back(n); 

    // do something with word, quoted_string and vec... 
} 
更好的邏輯,簡便,性能,還是什麼方面
相關問題