В моей программе сейчас есть фрагмент кода, который выглядит так

 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

0
Federico 30 Авг 2011 в 15:37

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.
1
Tony The Lion 30 Авг 2011 в 11:53

Это избавит от лишних проверок:

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();
    }
}
0
unexplored 30 Авг 2011 в 12:48