Я хочу выполнить проверку на ошибку в функции openFile
в C и при ошибке: 2 я хочу снова рекурсивно вызвать ту же функцию.
Я не получаю правильного ответа, если я хочу сделать fputs() после открытия файла, я получаю сообщение об ошибке (неверный файловый дескриптор)
Вот мой код:
void openFile(FILE **fstream, char* path, char* mode) {
*fstream = fopen(path, mode);
if(*fstream == NULL) {
printf("\nError number %2d : ",errno);
perror("Error opening file: ");
switch (errno) {
case 2:
printf("Creating file %s now...\n", path);
*fstream = fopen(path, "a+"); //Creating file in append-mode
if (fstream == NULL) {
perror("Couldn't open the file!\nError");
exit(EXIT_FAILURE);
}
fclose(*fstream); //Closing filestream
openFile(fstream, path, mode); //Recursive call of openFile() to re-open in read-mode
/* freopen(path,mode,fstream) */ //Doesn't work either
break;
default:
exit(EXIT_FAILURE);
break;
}
} else if (*fstream != NULL) {
printf("Successfully opened %s\n", path);
}
}
Звонок:
openFile(&fp, path,"r");
if (fputs("blabla\nblabla\n",fp) == EOF) {
perror("Unable to write file with fputs()");
}
Что я делаю неправильно? Думаю дело в рекурсивном вызове функции, но что тут делать? я не понимаю..
Выход:
> .\a
Content of path: test.txt
Error number 2 : Error opening file: : No such file or directory
Creating file test.txt now...
Successfully opened test.txt
Unable to write file with fputs(): Bad file descriptor
PS: я новичок в C, я много читал и читал об указателях на YouTube, но я не понимаю ошибки.
заранее спасибо
ENOENT
должна равняться значению2
. Вместо этого используйте символические именованные константы. Также будет легче понять, какую ошибку вы обрабатываете. - person Some programmer dude   schedule 04.11.2018FILE*
, кроме как сделать ваш код более трудным для чтения. - person Swordfish   schedule 04.11.2018FILE
. Параметр совершенно бесполезен, и функция должна возвращатьFILE*
. - person Swordfish   schedule 04.11.2018FILE*
действительно позволит избежать передачиFILE**
, однако в целом этого не всегда можно избежать из-за ограничения единственного возвращаемого значения функции. - person EOF   schedule 04.11.2018switch (errno) { case 2:
— это2
должно бытьENOENT
или что-то подобное. Не записывайте номера ошибок (значенияerrno
) буквально; это ограничивает надежность и ясность вашего кода. (Однако проверкаerrno == 0
допустима.) - person Jonathan Leffler   schedule 04.11.2018