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

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

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

Листинг программы
  1. typedef struct BOOK {
  2. char *name;
  3. } book;
  4. int main()
  5. {
  6. FILE *fp;
  7. char *fname = "sometxt";
  8. book nbook;
  9. nbook.name = "Some sucker";
  10. int p;
  11.  
  12. m1: if (NULL==(fp=fopen(fname, "r+"))){
  13. printf("error open file %s\n", fname);
  14. if (NULL==(fp=fopen(fname, "a"))){
  15. printf("error creat file %s\n", fname);
  16. return 1;
  17. }
  18. else {
  19. fclose(fp);
  20. }
  21. goto m1;
  22. }
  23. else {
  24. p=fseek(fp, 4, SEEK_SET);
  25. //printf("p=%d\n", p);
  26. p=ftell(fp);
  27. //printf("p=%d\n", p);
  28. fwrite(&nbook, sizeof(struct BOOK), 1, fp);
  29. fclose(fp);
  30. }
  31. return 0;
  32. }
логика такая. нужно открыть файл для перезаписи внутри. я решил остановиться на fseek для перемещения в нутри файла. по этому надо открыть файл, если произошла ошибка создать файл. ключик "a" разрешает писать только в конец файла. как красиво избавиться от goto ?

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

textual
Листинг программы
  1. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы