Сбой 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) или, по крайней мере, выполните некоторую проверку длины.
Кроме того, вы возвращаете адрес локальной переменной на основе стека, которая уничтожается после выхода из функции.