在if语句中打开文件

时间:2019-01-03 17:36:58

标签: c

我已经继承了一些旧的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声明为OK,因为我在程序的其他地方使用它来控制将数据写入日志。

我错过了什么?

谢谢。

3 个答案:

答案 0 :(得分:1)

变量output_fileif块的局部变量,它在其中定义,并且在离开该块时超出范围。因此,在此之后使用output_file的任何地方都会抱怨该变量未定义。

output_file块之外定义if

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

请确保在以后使用的任何地方检查output_file是否设置为NULL,还是将其设置为stdout之类,以便将输出发送到控制台。

答案 1 :(得分:1)

这是关于可变范围的一个很好的课程。当您在下面的括号内声明变量时,该变量仅存在于该块中。

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");
}

答案 2 :(得分:0)

您需要将定义移到该块之外:

#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;
}