2015-02-11 49 views
0

所以我有一個文件,其中前3行將始終引用「狀態」,其餘部分將引用「轉換」我知道前3行將始終以相同的格式,並在同一行上的投入,但「過渡」的個數之間的標籤是未知的,但在文件中讀取和解析輸入

for(int i = 0; i < 3; i++){ 
    myFile >> junk; 
    myFile >> stateNum; 
    myFile >> designation; 
    //make object and put in container 
} 

現在在線4

所以我處理的「狀態」永遠啓動我需要處理「轉換」,所以如果我的輸入文件看起來像

state 1 a 
state 2 b 
state 3 c 
trans a b c d & 
trans d s i & 3 
... 
trans 4 e & d g 

其中同一行上的所有空格都是製表符,狀態/轉換進入junk,因爲它們不是必需的,因爲我知道1-3是狀態,其餘是轉換。我現在如何從行4開始並繼續直到文件結束?基本上,if條件做我使用,使這項工作

if(???){ 
    myFile >> junk; 
    myFile >> one; 
    myFile >> two; 
    ... 
    myFile >> five; 
    //create object and place in container 
} 

,其中一,二,......五個早些時候宣佈,一個,...,五對應5個條目後「反式」

+1

什麼讀線成一條線串(函數getline),並與istringstream解析參數(使用當前行字符串)? – 2015-02-11 22:23:19

+0

如果你的輸入行的語法確實如圖所示,'trans'不是*「垃圾」。以*開始的行* not *不能是一個轉換,並且循環讀取轉換應該終止。 – WhozCraig 2015-02-11 23:00:17

+0

@WhozCraig輸入非常受控,文本文件中不會有錯誤。如果這是產品代碼或我完全同意,但我知道在這種情況下格式將永遠是正確的 – 2015-02-12 19:07:24

回答

0

嘗試將

myFile >> junk; 
myFile >> stateNum; 
myFile >> designation; 

循環之前,然後再讀一個循環內的每個過渡,因爲你while循環不知道有多少個會。

+0

以及我需要循環與垃圾,stateNum和指定繞過3次,所以我可以寫出來9次,但它很高興在一個循環中,尤其是因爲在循環內我有3個'if'語句,取決於名稱 – 2015-02-11 22:23:48

+0

啊,好的,我沒有仔細閱讀你的問題 - 對於循環類型是有意義的然後(但使用getline三次並解析該行會更整潔)。一旦完成三條狀態線的循環,您將需要一個用於轉換的while循環。 – 2015-02-11 22:27:31

0

正如迪特爾說,你應該通過線路上使用stringstream的和函數getline

string line; 

while (getline (myFile, line)){ 
//this will loop until the end of the file 
    stringstream line_stream(line); 
    string word; 
    while (line >> word){ 
    //this will loop until there are words (transitions) on the line) 
    //(your code) 
}