Сбой 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()

изображение ошибки

это приводит меня к этой строке invalid_parameter.cpp:

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

Путь правильный, почему не создается файл? Почему это терпит крах?

2 ответа

Ваша программа не должна идти в fclose если это всегда ноль.

Вы уверены, что строка text достаточно долго? Почему бы вам не использовать strlen() из path а также filename получить минимальный необходимый вам символ?

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

И вы уверены, что выбранный вами путь верен?

Кодовая последовательность

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) или, по крайней мере, выполните некоторую проверку длины.

Кроме того, вы возвращаете адрес локальной переменной на основе стека, которая уничтожается после выхода из функции.

Другие вопросы по тегам