2009-11-12 57 views
0

我試圖創建由動態索引(d = {0,...,NUM_DEMES-1})下標的輸出文件。目前,我只獲取第一個值的輸出文件(d = 0)。動態輸出文件名(C++)

#include <sstream> 
#include <string> 

void Simulation::updateSimulation(double t) 
{ 
... 
ofstream abundanceStream; 
ofstream abHeaderStream;  

if (step == 1) { 
    for (int d = 0; d < NUM_DEMES; d++) { 
    abundanceStream.open(makeFilename("Abundances_", d).c_str(),ios::out); 
    abHeaderStream.open(makeFilename("Abundances_IDs_", d).c_str(),ios::out); 
    } 
} 

for (int d = 0; d < NUM_DEMES; d++) { 
    abundanceStream.open(makeFilename("Abundances_", d).c_str(),ios::app); 
    abHeaderStream.open(makeFilename("Abundances_IDs_", d).c_str(),ios::app); 
} 
} 

string Simulation::makeFilename(const string& basename, int index) 
{ 
    ostringstream result; 
    result << basename << index; 
    return result.str(); 
} 

這會創建Abundances_0和Abundances_IDs_0但沒有別的。我可以寫入這些文件。我可以創建其他文件名就好了,但文件不會顯示。

我可能錯過了關於流的基本信息,但我一直無法弄清楚什麼。

編輯

下面的代碼打印到屏幕右邊的文件名:

for (int d = 0; d < NUM_DEMES; d++) { 
    abundanceStream.open(makeFilename("Abundances_", d).c_str(),ios::app); 
    abundanceStream << "stuff\n"; 
    cout << makeFilename("Abundances_", d).c_str() << endl; 
    abHeaderStream.open(makeFilename("Abundances_IDs_", d).c_str(),ios::app); 
    abHeaderStream << "more stuff\n"; 
    cout << makeFilename("Abundances_IDs_", d).c_str() << endl; 
    } 

但 「東西」 和 「更多的東西」 只出現在Abundances_0和Abundances_IDs_0。

+0

每次調用result.str()的值是多少?以及NUM_DEMES設置爲什麼? – 2009-11-12 19:43:54

+0

NUM_DEMES的價值是什麼? – 2009-11-12 19:44:21

+0

對不起。 NUM_DEMES = 2,並且d正在遞增。 Result.str()也檢出(即,cout << result.str()打印它應該的內容,並且打印makeFilename(...)的結果也給出正確的文件名)。 – Sarah 2009-11-12 19:48:39

回答

4

您總是在使用同一個對象。您可以在「使用」後關閉流或爲每個文件使用不同的對象。

+0

忘記了這個非常重要的原則。謝謝。 – Sarah 2009-11-12 19:53:49

4

一旦打開了一個流,除非先關閉它,否則調用open將失敗。因此,要麼在每個循環的末尾添加對abundanceStream.close()abHeaderStream.close()的調用,要麼在循環內確定流對象的範圍,以便每次都得到一個新對象。

+0

謝謝。這顯然是對的! – Sarah 2009-11-12 19:54:48