Если fopen
возвращает NULL
, открытие не удалось. errno
будет содержать код ошибки , а strerror(errno)
вернет краткое описание причины сбоя при открытии.
#include <errno.h>
#include <string.h>
...
int main(void)
{ FILE* inFile = NULL;
char infileName[32] = {'\0'};
gather_input(infileName); // infileName is an output parameter for this
if (!(inFile = open_input_file(infileName))) {
fprintf(stderr, "Error opening '%s': %s\n",
infileName, strerror(errno));
} else {
// open successful
...
}
}
Off-тема
gather_input
лучше убедиться, что infileName
завершен нулем, чтобы предотвратить переполнение буфера. Самый простой способ сделать это - определить размер буфера имени файла в качестве макроса и установить последний символ равным 0.
#define FILENAMELEN 32
void gather_input(char infileName[]) {
...
infileName[FILENAMELEN-1]=0;
}
int main(void)
{ FILE* inFile = NULL;
char infileName[FILENAMELEN] = {'\0'};
Это не очень гибко. Вместо этого вы можете передать размер буфера имени файла в gather_input
.
#define LENGTH(a) (sizeof(a) / sizeof(a[0]))
void gather_input(char infileName[], size_t len) {
...
infileName[len-1]=0;
}
int main(void)
{ FILE* inFile = NULL;
char infileName[32] = {'\0'};
gather_input(infileName, LENGTH(infileName)); // infileName is an output parameter for this
Альтернативой установке последнего символа, если используются стандартные функции работы со строками, является использование функций strl*
(strlcpy
и strlcat
), а не их неограниченных родственников. Если вы не используете strl*
, вы должны использовать strncpy
и strncat
.