Неверный дескриптор файла после рекурсивной функции для открытия файла в C - PullRequest
0 голосов
/ 04 ноября 2018

Я хочу сделать проверку ошибок в openFile функции в C и на errno: 2 Я хочу, чтобы рекурсивно вызывать снова ту же функцию.

Я не получаю правильный ответ, если я хочу выполнить fputs () после открытия файла, я получаю сообщение об ошибке (Bad file descriptor)

Вот мой код:

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, я читал и много рассказывал об указателе, но я не понимаю ошибки.

Заранее спасибо

1 Ответ

0 голосов
/ 04 ноября 2018

Вы открыли файл с "r", но пытаетесь записать. Вам нужно "w" вместо.

...