关闭我最近创建的文件时fclose崩溃

时间:2016-05-20 08:17:56

标签: 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(logFile);
  return text;
}

当我调试这段代码时,问题出现了,logFile总是为空。当程序到达fclose()

时程序会崩溃

error image

我需要这行invalid_parameter.cpp:

if (IsProcessorFeaturePresent(PF_FASTFAIL_AVAILABLE))
{
 __fastfail(FAST_FAIL_INVALID_ARG);
}

路径是正确的,为什么不创建文件?为什么会崩溃?

2 个答案:

答案 0 :(得分:1)

代码序列

strcpy(text, filename);
strcat(path, text);
strcat(path, ".txt");

只是危险,因为你附加到基于堆栈的缓冲区(path)未验证的输入字符串(filename)...结果可能是堆栈覆盖会破坏你的logFile可变...

如果您坚持使用MS paltform,请使用strcat_sstrcpy_shttps://msdn.microsoft.com/en-us/library/d45bbxx4.aspxhttps://msdn.microsoft.com/en-us/library/td1esda9.aspx)或至少进行一些长度检查。

此外,还返回基于本地堆栈的变量的地址,该变量在函数退出后被销毁。

答案 1 :(得分:1)

如果程序始终为空,则不应转到fclose

您确定字符串text足够长吗? 为什么不使用strlen() pathfilename来获取所需的最少字符?

int len = strlen(path) + strlen(filename) + 5; //5 == ".txt" & '\0'
char text[len] = "";

你确定你设定的路径是对的吗?