Открытие файла в операторе if - PullRequest
0 голосов
/ 03 января 2019

Я унаследовал некоторые старые подпрограммы C, которые я поддерживаю благодаря небольшим знаниям.Я пытаюсь добавить регистрацию в одну из подпрограмм, которую я сделал, но я хочу иметь возможность включать и выключать регистрацию с помощью параметра в файле INI.Я также сделал это, но мне нужно остановить создание файла журнала, когда ведение журнала отключено.Я бы хотел, чтобы файл не создавался в первую очередь, если ведение журнала отключено.

Если я включаю ведение журнала, все работает отлично.но если я отключаю ведение журнала, он создает файл, но ничего не записывает в него.

int LOG_ENABLED=FALSE;


... some code here to set LOG_ENABLED to either TRUE or FALSE...


char filename[50];
struct tm * timenow;
time_t now = time(NULL);
timenow = gmtime(&now);
strftime(filename, sizeof(filename), "/logfiles/program1/log/%y%m%d_%H%M%S.log", timenow);


if (LOG_ENABLED == TRUE)
{
    FILE *output_file = fopen(filename, "a");
}

Когда я компилирую это, он выдает много ошибок, но если я вынимаю условие 'if'он компилируется нормально, но все равно выдает мне лог-файл с нулевым байтом.

Я счастлив, что LOG_ENABLED объявлен ОК, так как я использую его в другом месте программы для управления записью данных в журнал.

Что я пропустил?

Спасибо.

Ответы [ 3 ]

0 голосов
/ 03 января 2019

Это хороший урок о переменных областях.Когда вы объявляете переменную внутри фигурных скобок, как показано ниже, она существует только внутри этого блока.

if (LOG_ENABLED == TRUE)
{
    FILE *output_file = fopen(filename, "a");
}

Это не очень полезно для вас, вы хотите объявить ее вне блока и присвоить ей значение внутриблок.Скорее всего, вы хотите, чтобы он был объявлен на глобальном уровне, чтобы к нему имел доступ весь файл, или, по крайней мере, любые функции, которые должны записываться в файл, имеют доступ.

FILE *output_file = NULL;
if (LOG_ENABLED == TRUE)
{
    output_file = fopen(filename, "a");
}

И, скорее всего, позжеесли вы захотите использовать его, у вас будет что-то вроде

if(output_file)
{
     fprintf(output_file,"hello world\n");
}
0 голосов
/ 03 января 2019

Вам нужно переместить определение за пределы этого блока:

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    const char *file = "/Path/to/file";
    FILE *output_file;
    if ( 1 )
    {
        output_file = fopen( file, "r");
        if ( output_file == NULL )
        {
            printf("Error, deal with...\n" );
            exit( EXIT_FAILURE );
        }
    }
    fclose( output_file );

    return 0;
}
0 голосов
/ 03 января 2019

Переменная output_file является локальной для блока if, в котором она определена, и выходит из области действия, когда вы покидаете блок.Поэтому в любом месте после этого, где вы используете output_file, жалуйтесь, что переменная не определена.

Определите output_file вне блока if.

FILE *output_file = NULL;
if (LOG_ENABLED == TRUE)
{
    output_file = fopen(filename, "a");
}

Обязательно проверьтеесли output_file установлен на NULL в любом месте, где вы используете его позже, или на что-то вроде stdout, так что вывод идет на консоль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...