Как избежать использования оператора goto? - C (СИ)

Узнай цену своей работы

Формулировка задачи:

typedef struct BOOK {
    char *name;
} book;
 
int main()
{
    FILE *fp;
    char *fname = "sometxt";
    book nbook;
    nbook.name = "Some sucker";
    int p;

m1: if (NULL==(fp=fopen(fname, "r+"))){
        printf("error open file %s\n", fname);
        if (NULL==(fp=fopen(fname, "a"))){
            printf("error creat file %s\n", fname);
            return 1;
        }
        else {
            fclose(fp);
        }
        goto m1;
    }
    else {
        p=fseek(fp, 4, SEEK_SET);
        //printf("p=%d\n", p);
        p=ftell(fp);
        //printf("p=%d\n", p);
 
        fwrite(&nbook, sizeof(struct BOOK), 1,  fp);
        fclose(fp);    
    }
    return 0;
}
логика такая. нужно открыть файл для перезаписи внутри. я решил остановиться на fseek для перемещения в нутри файла. по этому надо открыть файл, если произошла ошибка создать файл. ключик "a" разрешает писать только в конец файла. как красиво избавиться от goto ?

Решение задачи: «Как избежать использования оператора goto?»

textual
Листинг программы
while (NULL==(fp=fopen(fname, "r+")))

Объяснение кода листинга программы

В представленном коде выполняется попытка открыть файл с помощью функции fopen. Если файл не может быть открыт, то программа будет выполнять цикл while, пока не удастся открыть файл. Вот список элементов кода:

  1. NULL==(fp=fopen(fname,r+)) - проверка, удалось ли открыть файл. Если файл не может быть открыт, то fp будет равно NULL.
  2. (fp=fopen(fname,r+)) - попытка открыть файл с помощью функции fopen. Если файл открывается успешно, то fp будет содержать дескриптор файла.
  3. fname - имя файла, который нужно открыть.
  4. r+ - режим открытия файла. В данном случае используется режим чтения и записи r+

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 3.857 из 5
Похожие ответы