открытие файла (и закрытие его позже), только если установлен флаг - PullRequest
0 голосов
/ 30 августа 2011

В моей программе в настоящее время есть фрагмент кода, который выглядит следующим образом

 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 ]

1 голос
/ 30 августа 2011

предложение:

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.
0 голосов
/ 30 августа 2011

Это исключит дополнительные проверки:

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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...