2013-05-02 170 views
1

我正在編寫一個程序,涉及從文件中讀取大量的數據,並且遇到了一些困難(作爲一個相對缺乏經驗的程序員)。如果while循環包含在另一個while循環中,則需要滿足哪些條件才能離開循環? 我的具體情況如下圖所示,(emptyLineFound是一個布爾值設置爲真時,空行已發現)雖然while循環內循環,如何兩個條件工作?

while(!file.eof()) { 
    .... 
    while(!emptyLineFound) { 
       .... 
    } 
} 

何種條件優先?他們都必須滿意地離開那段代碼嗎?例如,如果它位於文件的末尾,並且由於沒有行而無法找到空行,它會不會變得混亂?

+0

可怕的格式化道歉。 – 2013-05-02 07:36:27

+0

'while'小'w',而** not **大寫'W'。 – 2013-05-02 07:39:34

+1

而'while(!file.eof())'肯定是不正確的。 – 2013-05-02 07:40:04

回答

3

這兩個部分不必滿足嵌套時退出。

while(!file.eof()) { 

當文件不在流末尾時將繼續運行。

while(!emptyLineFound) { .... } 

未找到空行時繼續運行。

找到空行後,將退出嵌套循環,並且父循環將繼續,直到滿足條件(達到EOF)。

+0

感謝您的回覆。我明白你在說什麼,當找到一條空行時,它會在父循環的其餘部分運行。但是,它很快就會在while循環中運行到同一空行,所以回到相同的情況。值得注意的是,我的行結束檢查只是檢查是否getline ==「」,所以我懷疑當文件末尾沒有更多數據時,空行循環不能留在父結束之前的文件循環。聽起來似乎合理嗎? – 2013-05-02 07:43:30

1
While(ExitCondition) 
{ 
    // you are at this point if ExitCondition fails . 

    while(another-ExitCondition) 
     { 

     // you are at this point if another-ExitCondition fails 


     } 

    // you will come at this point once another-ExitCondition becomes true 
    } 

    // you will be at this point once ExitCondition becomes true . 
0

在你的問題,當emptyLineFoundtrue內循環將結束。外循環將繼續,直到file.eof()true。假定內循環中的某些設置在下一個循環之前將emptyLineFound設置爲false

注意,條件進行測試的代碼到那裏,所以,理論上你可以有這樣的事情:

while(!file.eof()) 
{ 
    while(!emptyLineFound) 
    { 
     ... do some reading ... 
     if (file.eof()) 
     { 
      ... reset file so we can do more reading ... 
     } 
    } 
} 

和循環將永遠持續下去,除非file.eof()是從一開始真的循環。

順便說一下,一般來說,使用!file.eof()作爲循環控制是一個非常糟糕的主意。使用讀取操作本身好得多,例如, while (file >> var) ... - 因爲while (!file.eof())往往會導致額外的迭代,因爲file.eof()不是真的,直到您讀完PAST爲止。

+0

感謝大家的快速回復。我認爲我現在更瞭解它,現在認爲我的問題稍有不同。我的課程讀取學生姓名,課程,標記等,每個學生記錄用空行分隔。到目前爲止,我的代碼可以讀取所有數據,無論有多少記錄或課程,直到最後一條記錄的最後一行,無限讀取。首先,如果只讀取文件的最後一行,會使用file.ignore(numeric_limits :: max(),'\ n')會怎麼做? – 2013-05-02 07:52:43

+0

您可能遇到了不同的問題。任何你實際發佈整體代碼的機會(你可能希望將其剝離以便它只顯示「錯誤」的部分,但是一個完整的程序比「我的代碼的幾行代碼」更好 - 通常情況下,當你這樣做的時候,你經常會發現問題的原因呢!) – 2013-05-02 08:03:35

+0

不幸的是,我無法爲我無法訪問wifi,並在我的手機上發佈信息。但是,如果明天我仍然有問題,我會發布。感謝您的幫助 – 2013-05-02 08:12:03

0

每當外部循環重複時,內部循環重新輸入並重新開始。

0

也許,如果表達不同的代碼變得清晰:

void f() 
{ 
    // ... 
    while (!file.eof()) { 
     // ... 
    } 
} 

int main() 
{ 
    // ... 
    while (!emptyLineFound) { 
     f(); 
    } 
} 

這是語義上與您的程序;它具有相同的整體邏輯。從這裏,你可以清楚地看到,直到f.eof()爲真,並且該主將重複調用f()(並且因此執行「內部」循環)之前,對f()的調用將不會終止,直到emptyLineFound是真的。