Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
关闭最近创建的文件时fclose崩溃_C_Fopen_Fclose - Fatal编程技术网

关闭最近创建的文件时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处理。