В моей программе в настоящее время есть фрагмент кода, который выглядит следующим образом
void foo()
{
// defining local variables
for (long i =0; i<maxiterations; i++)
{
// here the core of the code is executed
// for each iteration an object of a class is created and modified given the conditions imposed
}
if (flag) savedata();
// and here a call to the destructor of the class is called (tested, it destroys all the previously created objects)
}
В настоящее время savedata()
похоже на следующее
void savedata()
{
char filenameI[1024];
sprintf_s(filenameI, 1024, "%s_%i", filename, id);
FILE* File;
errno_t err;
err = fopen_s(&File, filenameI, "w");
if (err!=0)
{
cout << "\nFile" << filenameI << "could not be opened.\nPlease press Ctrl+C to terminate" << endl; // the program is run via Matlab
cin.get();
}
else
{
cout << "Saving file " << filenameI << endl;
}
for (long i =0; i<maxiterations; i++)
{
fprintf(File, "%10li", data); //not the actual line, but fprintf is used in this way
}
fclose(File);
}
Поскольку maxiterations
- это установленное время выполнения и учитывая, что память, необходимая для хранения одного объекта, значительна (т. Е. Мне нужны более высокие значения, но я достиг предела памяти), я думал об изменении кода в следующим образом:
void foo()
{
// defining local variables
if (flag) openfile();
for (long i =0; i<maxiterations; i++)
{
// executing the same as before
if (flag) savedata(i); // obviously the function would be modified
}
if (flag) closefile();
}
Теперь, наконец, мой вопрос:
Используя такой же тип выходного вызова (ФАЙЛ * вместо объекта ofstream), возможно ли достичь того, что мне нужно?
Мои сомнения возникают из-за того, что то, что находится внутри цикла, имеет область видимости только в этом цикле, и поэтому я боюсь, что файл может быть закрыт при выходе из первого оператора if
вместо вызова closefile()
.
Я не прав?
Спасибо всем, кто поможет.
Federico