Сохранение стека в бинарный файл и чтение-вывод на экран из него - C (СИ)

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

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

Хотел сделать сохранение стека в бинарный файл и чтение-вывод на экран из его же. Набросал код :
Листинг программы
  1. #include <conio.h>
  2. #include<iostream>
  3. struct zap
  4. {
  5. char inf[5];
  6. zap *l;
  7. };
  8. FILE *f;
  9. using namespace std;
  10. void push(zap **);
  11. void out (zap **);
  12. void show (zap *);
  13. int main ()
  14. {
  15. zap *s=NULL;
  16. while(true)
  17. {
  18. cout<<"1-add"<<endl;
  19. cout<<"2-Out"<<endl;
  20. char l=getch();
  21. switch(l)
  22. {
  23. case '1': push(&s);break;
  24. case '2': out(&s);show(s); break;
  25. case 27: exit(NULL);
  26. }
  27. }
  28. }
  29. void push(zap **s)
  30. {
  31. zap *s1=*s;
  32. if((f=fopen("test.txt","w+b"))==NULL)
  33. {perror("Error");return;}
  34.  
  35. *s= new zap;
  36. cout<<"Enter n"<<endl;
  37. gets((*s)->inf);
  38. (*s)->l=s1;
  39. s1=*s;
  40. fwrite(*s,sizeof(zap),1,f);
  41. fclose(f);
  42. }
  43. void out(zap **s)
  44. {
  45. if((f=fopen("test.txt","rb"))==NULL)
  46. {perror("Error");return;}
  47. do
  48. {zap *s1=*s;
  49. *s=new zap;
  50. fread(*s,sizeof(zap),1,f);
  51. (*s)->l=s1;
  52. s1=*s;
  53. }while(!(feof(f)));
  54. fclose(f);
  55. }
  56. void show (zap *s)
  57. {
  58. do
  59. {
  60. printf(" %s",s->inf);
  61. s=s->l;
  62. } while(s);
  63. }
Сохранение стека в файл работает, а вот при чтении стека из файла такая ситуация. Интересует откуда берется мусор и почему верхний элемент стека выводится два раза. P.S. Также любые замечания, предложения, пожалуйста говорите, не молчите, надо учиться!

Решение задачи: «Сохранение стека в бинарный файл и чтение-вывод на экран из него»

textual
Листинг программы
  1. // test.cpp: определяет точку входа для консольного приложения.
  2. //
  3.  
  4. #include "stdafx.h"
  5.  
  6. #include <conio.h>
  7. #include <iostream>
  8.  
  9. using namespace std;
  10.  
  11. struct zap
  12. {
  13.     char inf[5];
  14.     zap *l;
  15. };
  16. FILE *f;
  17. using namespace std;
  18. void push(zap **);
  19. //void out (zap **);
  20. void show (zap *);
  21. int main ()
  22. {
  23.     f=fopen("test.txt","w+b");
  24.     zap *s=NULL;
  25.     while(true)
  26.     {
  27.         cout<<"1-add"<<endl;
  28.         cout<<"2-Out"<<endl;
  29.         char l=getch();
  30.         switch(l)
  31.         {
  32.         case '1': push(&s);break;
  33.         case '2': /*out(&s)*/;show(s);  break;
  34.         case 27: exit(NULL);
  35.         }
  36.        
  37.  
  38.     }
  39.     fclose(f);
  40. }
  41. void push(zap **s)
  42. {
  43.     zap *s1=*s;
  44.  
  45.    
  46.  
  47.  
  48.     *s= new zap;
  49.  
  50.     cout<<"Enter n"<<endl;
  51.     gets((*s)->inf);
  52.     (*s)->l=s1;
  53.     s1=*s;
  54.     int i = sizeof(zap);
  55.     fwrite((**s).inf,sizeof(s),1,f);
  56.  
  57. }
  58.  
  59. /*void out(zap **s)
  60. {
  61.  
  62.     //if((f=fopen("test.txt","rb"))==NULL)
  63.     //{perror("Error");return;}
  64.     do
  65.     {zap *s1=*s;
  66.     *s=new zap;
  67.     fread(*s,sizeof(zap),1,f);
  68.     (*s)->l=s1;
  69.     s1=*s;
  70.     }while(!(feof(f)));
  71.  
  72. }*/
  73.  
  74. void show (zap *s)
  75. {
  76.     do
  77.     {
  78.         printf(" %s",s->inf);
  79.         s=s->l;                              
  80.     } while(s);
  81.  
  82.     exit(0);
  83. }

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

В данном коде реализована программа работы со стеком, используя бинарный файл для его сохранения и чтения. Структура данных, используемая в программе, называется zap и содержит указатель на следующий элемент в стеке и массив из 5 символов для хранения информации об элементе. В начале программы открывается файл test.txt в режиме w+b (запись и чтение) с помощью функции fopen. Затем инициализируется указатель на вершину стека s, который начинается с NULL. В основном цикле программы, который выполняется до тех пор, пока пользователь не введет символ '27', происходит следующее:

  1. Выводится сообщение с предложением ввести число '1' для добавления элемента в стек или '2' для вывода текущего содержимого стека.
  2. Пользователь вводит символ, который считывается с помощью функции getch.
  3. В зависимости от введенного символа выполняется соответствующая операция:
    • Если введен символ '1', то вызывается функция push, которая добавляет новый элемент в стек.
    • Если введен символ '2', то вызывается функция show, которая выводит текущее содержимое стека. В функции push выполняется следующее:
  4. Создается новый элемент структуры zap и инициализируется указатель на него.
  5. Вводится информация об элементе с помощью функции gets.
  6. Устанавливается связь нового элемента со старым (вставляется в стек).
  7. Информация об элементе записывается в файл с помощью функции fwrite. В функции show выполняется цикл, который проходит по всем элементам стека и выводит информацию об элементе с помощью функции printf. Код не был полностью реализован, так как функция out не была дописана. Она должна выполнять чтение информации из файла и добавление элементов в стек, аналогично функции push.

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


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

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

7   голосов , оценка 4.143 из 5

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

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

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