我正在尝试为每个程序执行创建一个日志文件。
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;
}
当我调试这段代码时,问题出现了,logFile总是为空。当程序到达fclose()
我需要这行invalid_parameter.cpp:
if (IsProcessorFeaturePresent(PF_FASTFAIL_AVAILABLE))
{
__fastfail(FAST_FAIL_INVALID_ARG);
}
路径是正确的,为什么不创建文件?为什么会崩溃?
答案 0 :(得分:1)
代码序列
strcpy(text, filename);
strcat(path, text);
strcat(path, ".txt");
只是危险,因为你附加到基于堆栈的缓冲区(path
)未验证的输入字符串(filename
)...结果可能是堆栈覆盖会破坏你的logFile
可变...
如果您坚持使用MS paltform,请使用strcat_s
和strcpy_s
(https://msdn.microsoft.com/en-us/library/d45bbxx4.aspx,https://msdn.microsoft.com/en-us/library/td1esda9.aspx)或至少进行一些长度检查。
此外,还返回基于本地堆栈的变量的地址,该变量在函数退出后被销毁。
答案 1 :(得分:1)
如果程序始终为空,则不应转到fclose
。
您确定字符串text
足够长吗?
为什么不使用strlen()
path
和filename
来获取所需的最少字符?
int len = strlen(path) + strlen(filename) + 5; //5 == ".txt" & '\0'
char text[len] = "";
你确定你设定的路径是对的吗?