关闭最近创建的文件时fclose崩溃
我试图为每个程序的执行创建一个日志文件关闭最近创建的文件时fclose崩溃,c,fopen,fclose,C,Fopen,Fclose,我试图为每个程序的执行创建一个日志文件 char * createLogFile(char *filename) { char path[100] = "logs_folder/"; char text[100] = ""; strcpy(text, filename); strcat(path, text); strcat(path, ".txt"); FILE *logFile; logFile = fopen(path, "w"); fclose(logFi
char * createLogFile(char *filename) {
char path[100] = "logs_folder/";
char text[100] = "";
strcpy(text, filename);
strcat(path, text);
strcat(path, ".txt");
FILE *logFile;
logFile = fopen(path, "w");
fclose(logFile);
return text;
}
当我调试这段代码时,问题来了,日志文件总是空的。当程序到达fclose()
它将我带到无效的_parameter.cpp的这一行:
if (IsProcessorFeaturePresent(PF_FASTFAIL_AVAILABLE))
{
__fastfail(FAST_FAIL_INVALID_ARG);
}
路径正确,为什么不创建文件?为什么会崩溃?代码序列
strcpy(text, filename);
strcat(path, text);
strcat(path, ".txt");
这很危险,因为您将未经验证的输入字符串(filename
)附加到基于堆栈的缓冲区(path
)。。。结果可能是堆栈覆盖,这会破坏日志文件变量
如果您坚持使用MS paltform,请使用strcat_s
和strcp_s
(,)或至少进行一些长度检查
此外,还可以返回基于堆栈的局部变量的地址,该变量在函数退出后会被销毁。代码序列
strcpy(text, filename);
strcat(path, text);
strcat(path, ".txt");
这很危险,因为您将未经验证的输入字符串(filename
)附加到基于堆栈的缓冲区(path
)。。。结果可能是堆栈覆盖,这会破坏日志文件变量
如果您坚持使用MS paltform,请使用strcat_s
和strcp_s
(,)或至少进行一些长度检查
此外,您还返回一个基于堆栈的本地变量的地址,该变量在函数退出后被销毁。如果始终为空,则程序不应转到fclose
您确定字符串文本足够长吗?
为什么不使用path
和filename的strlen()
来获得所需的最小字符数
int len = strlen(path) + strlen(filename) + 5; //5 == ".txt" & '\0'
char text[len] = "";
您确定设置的路径正确吗?如果程序始终为空,则不应转到fclose
您确定字符串文本足够长吗?
为什么不使用path
和filename的strlen()
来获得所需的最小字符数
int len = strlen(path) + strlen(filename) + 5; //5 == ".txt" & '\0'
char text[len] = "";
您确定设置的路径正确吗?如果为null,则检查是我粘贴的调试代码:(.整个错误没有该检查,返回如果为null,则检查是我粘贴的调试代码:(.整个错误没有该检查,返回
@SergeBallesta如果nullcheck是我粘贴的调试代码:(.整个错误没有检查和返回–抱歉,我刚刚编辑了帖子。然后答案在调试代码中!因此我的评论是:请测试日志文件是否为null,如果为null,请显示perror或strerror.logFile的输出确实为null。当前目录中是否存在目录logs\u文件夹
如果没有,则不会创建该目录,并且出于测试目的,您会收到此错误,暂时将其放在一个完整的绝对路径中。“当前目录”是一个过时的麻烦。@SergeBallesta如果nullcheck是我粘贴的调试代码:(.整个错误没有检查和返回–抱歉,我刚刚编辑了帖子。然后答案在调试代码中!因此我的评论是:请测试日志文件是否为null,如果为null,请显示perror或strerror.logFile的输出确实为null。当前目录中是否存在目录logs\u文件夹
没有,它没有被创建,并且您得到这个错误出于测试目的,暂时放在一个完整的绝对路径中。“当前目录”是一个过时的麻烦。路径是正确的。如果我尝试执行char[len]
表达式必须有一个常量值。您可以这样malloc字符串。路径是正确的。如果我尝试执行char[len]
expression必须有一个常量值。您可以对字符串进行malloc处理。