В моей программе сейчас есть фрагмент кода, который выглядит так
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
2 ответа
Предложение:
FILE* f = NULL;
if (flag) f = openfile();
for (long i =0; i<maxiterations; i++)
{
// executing the same as before
if (flag) savedata(i, f); // pass in filehandle, obviously the function would be modified
}
if (flag) closefile(f); //close file on handle passed.
Это избавит от лишних проверок:
void foo()
{
// defining local variables
if (flag)
{
openfile();
for (long i = 0; i<maxiterations; i++)
{
// executing the same as before
savedata(i); // obviously the function would be modified
}
closefile();
}
}
Похожие вопросы
Новые вопросы
c++
C ++ - это язык программирования общего назначения. Первоначально он был разработан как расширение C и имеет аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде (который должен быть) скомпилирован с помощью компилятора C ++. Используйте тег для конкретной версии для вопросов, связанных с конкретной версией стандарта [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] или [C ++ 23] и т. Д. .