2009-11-12 4 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, но больше ничего. Я могу писать в эти файлы. Я могу просто создать другие имена файлов, но файлы просто не отображаются.

Возможно, у меня что-то не хватает в потоках, но я не смог понять, что.

EDIT

Следующий код выводит на экране вправо имена файлов:

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? –

+0

Каково значение NUM_DEMES? –

+0

Извините. NUM_DEMES = 2, а d - правильно. Result.str() также отлично проверяет (т. Е. Cout << result.str() печатает то, что ему нужно, и печать результатов makeFilename (...) также дает правильные имена файлов). – Sarah

ответ

4

Вы всегда пользуетесь теми же объектами. Вы можете закрыть потоки после «использования» или использовать разные объекты для каждого файла.

+0

Забыл этот очень важный принцип. Спасибо. – Sarah

4

После того, как вы открыли поток, другой вызов open завершится неудачей, если вы не закроете его первым. Поэтому либо добавляйте вызовы к abundanceStream.close() и abHeaderStream.close() в конце каждого цикла, либо обласкайте объекты потока внутри цикла, чтобы каждый раз получать новый.

+0

Спасибо. Очевидно, это правильно! – Sarah

Смежные вопросы