2011-04-20 43 views
2

我有我缺少明顯的東西,但似乎無法來解決下面的一種感覺:C++的ofstream不工作如預期

請參閱下面的代碼。它所做的只是循環20次,並將循環的索引寫入文件。在每三次寫入文件之後,文件關閉,並開始一個新文件(使用檢查3次寫入的IF循環。)

它對第一個文件正常工作並按預期寫入。然後,IF開始執行在第一時間和當前文件被關閉,並啓動一個新

注:在這一點上我可以寫入新文件罰款

那麼IF結束並丟棄處理回用於循環。但現在寫入文件不起作用(沒有錯誤,沒有寫入)

因此,該文件在成功寫入I F塊創建它。然後IF塊結束。然後FOR循環結束當前傳球並開始新的傳球。現在寫作不起作用。

任何人都可以幫助,我可以找到辦法做我需要做的不同,但我只想了解爲什麼會發生這種情況?

int main() 
{ 
    unsigned int test_rowcounter = 0; 
    unsigned int test_filenumber = 0; 
    char filenamebuilder[50] = ""; 

    sprintf(filenamebuilder, "testing_file%d",test_filenumber); 
    strcat(filenamebuilder,".tsv"); 
    ofstream fsTestOutput; 
    fsTestOutput.open(filenamebuilder, fstream::out); 

    //Loop 20 times writibng the loop index value to a file 
    for(unsigned int f=0;f<20;f++) 
    {    
     fsTestOutput << f; //This write only works for the original file 
     test_rowcounter++; 

     //If three rows have been written to a file then start a new file 
     if(test_rowcounter == 3) 
     { 
      test_rowcounter = 0; 
      test_filenumber++; // increment the number that is added to the 
           // base filename to create a new file 

      //Close the previous file and open a new one 
      fsTestOutput.close();   
      sprintf(filenamebuilder, "testing_file%d",test_filenumber); 
      strcat(filenamebuilder,".tsv"); 
      ofstream fsTestOutput; 
      fsTestOutput.open(filenamebuilder, fstream::out); 
      // This next line works, the data is written 
      // for all files at this point 
      fsTestOutput << "FILE JUST CHANGED,"; 
     } 
    } 
} 

回答

8

當您創建新文件時,您在if聲明中聲明第二個ofstream fsTestOutput

這第二ofstream具有範圍您的本地if語句,所以它會你if內正常工作。但是,當你離開if聲明和頭回for循環,新ofstream的實例超出範圍,和你的代碼將恢復使用原來的(你已經關閉,因此無輸出!)

if(test_rowcounter == 3) 
    { 
     test_rowcounter = 0; 
     test_filenumber++; 
     //Close the previous file and open a new one 
     fsTestOutput.close();   
     sprintf(filenamebuilder, "testing_file%d",test_filenumber); 
     strcat(filenamebuilder,".tsv"); 
     ofstream fsTestOutput; // GET RID OF THIS 
     fsTestOutput.open(filenamebuilder, fstream::out); 
     fsTestOutput << "FILE JUST CHANGED,"; 
    } 
+0

感謝您的幫助,確實解決了它。我沒有意識到IF語句有其自己的範圍。 – Columbo 2011-04-20 09:30:30

+0

@Columbo不客氣。 :) – razlebe 2011-04-20 09:31:46

+4

@Columbo:'{'和'}'內的任何東西都是它自己的範圍。你可以在沒有'if','while'或'for'的情況下擁有'{...}'結構。如果它不是它自己的範圍,那麼你會得到重新宣佈的錯誤。 :) – 2011-04-20 09:41:19

4

嘗試刪除ofstream fsTestOutput;從循環內部開始,基本上你會在錯誤的範圍內創建一個ofstream。

+0

謝謝Sasqiha,我看到你的回答與我已經打勾的回答相同。 – Columbo 2011-04-20 09:33:31

+0

@Columbo他離我辦公桌三英尺遠。我會給他買一杯咖啡。 :) – razlebe 2011-04-20 10:17:43

+0

大聲笑,歡呼聲。 – Columbo 2011-04-20 10:21:03