我已经继承了一些旧的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,因为我在程序的其他地方使用它来控制将数据写入日志。
我错过了什么?
谢谢。
答案 0 :(得分:1)
变量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
之类,以便将输出发送到控制台。
答案 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;
}