2013-02-07 91 views
1

輸入getline後,我的輸入文件中的第一行數字被忽略,程序從第二行開始直到結束。'getline'後從文件中讀取第一行的問題

下面的代碼:

while (!file.eof()) 
{ 
    getline(file, lineBuffer); 
    if(lineBuffer.length()==0) 
    { 
     continue; //ignore empty lines 
    } 
    else 
    { 
     // file.open("test.txt"); 
     while (file >> A >> B >> N) 
     { 

      for(int count=1; count<=N; count++) 
      { 
       if(count%A == 0 && count%B == 0) { cout << "FB "; } 

       else if(count%A == 0) { cout << "F "; } 

       else if(count%B == 0) { cout << "B "; } 

       else { cout << count << " "; } 

      } 
      cout << endl; 
     } 
    } 
} 

輸入文件中包含的整數的3行並且只有第二行和第三等被處理。我已經廣泛地研究過這個問題,但沒有人提到類似於我的情況。通常他們會處理試圖在getline函數之後獲得用戶輸入的人。任何想法將不勝感激。

+0

您是否檢查了'linebuffer'數據?和'test.txt'中是什麼? – 2013-02-07 08:43:05

+0

你能顯示一個示例輸入文件嗎? –

+0

關於這個問題有上千個問題:-(在測試'eof()'之前,你必須嘗試獲取一些數據,當你使用'getline'時,檢查結果是否成功。行也會拋棄'lineBuffer'內容,您在其中找到'lineBuffer.length()!= 0' ...,它包含您缺少的第一組A,B,N結果。 'while(file >> A ...)''循環,它會開始工作,你可能想要(你沒有說你期望的,但我認爲它是處理第一行) –

回答

1

getline(file, lineBuffer)file中讀取一行並將其存儲在lineBuffer中。如果您想使用它,則應該處理lineBuffer而不是從file(其中第一行已被跳過)讀取。要使其工作,只需刪除內部while以外的所有代碼。這將一次從文件中讀取3個數字,當提取其中一個失敗時停止。

+0

首先,我忘了提及這是一個編碼對我嘗試的CodeEval挑戰。我的印象是,這個測試用例代碼是不可避免的,必須在那裏,但我相信它只是可選的......以下是來自提交頁面的代碼輸入窗口的代碼: /*示例代碼在測試用例中: ifstream文件; (file.of()) getline(file,lineBuffer); if(lineBuffer.length()== 0) continue; //忽略所有的空行 其他 {// 做的東西在這裏 } } */ –

+0

@StephenPaul如果您使用的代碼模板,那麼您需要處理'lineBuffer'而不是從'file'閱讀更多的數字。 – Angew

0

上述代碼是真實還是示例?

如果它是真實的,則不需要跳過空行。操作員>>將跳過你的空格。

沒有任何lineskipping下面的代碼執行只是「ABN」線一樣閱讀:

// outer loop is not needed, either remove it, or include error checking 
// while (!file.eof() && !file.fail()) 
{ 
    while (file >> A >> B >> N) 
    { 
     for(int count=1; count<=N; count++) 
     { 

      if(count%A == 0 && count%B == 0) { cout << "FB "; } 
.... 

如果由於某種原因,你不能刪除,則對getline可言,記住函數getline讀取的行ALWAYS(當然,除非流指針達到了結尾)。這意味着你的代碼跳過空行,然後讀取第一個非空行,注意行不是空的並打破循環。請注意,它已讀取行,因此,您的第一行數據現在位於行緩衝區中,而不再在流中。現在你必須要麼沒有記錄整個行(如果你的流支持它)或回倒流的行長(如果你的流支持它)或 - 只讀取行的數據 - 例如使用istringstream類。

一般來說,混合getline和operator >>是可行但棘手的(特別是當你第一次通過>>然後想跳過1或2行時),因爲它們在緩衝方面表現有點不同,空格處理。如果你真的想要這個,請搜索這個主題 - 有很多示例如何同步它們。

+0

提示OP:要混合它們,你通常會繼續使用getline將行讀入到一個字符串中,然後使用該字符串初始化一個「istringstream」,從中解析出你的每行值.... –

+0

我會放棄'而(!file.eof())'。你第一次輸入它總是如此。第二次,如果讀取失敗的文件結束以外的東西,你有一個無限循環。 –

+0

啊,對,errorflags ..我會更新代碼 – quetzalcoatl

相關問題