Сохранение стека в бинарный файл и чтение-вывод на экран из него - C (СИ)
Формулировка задачи:
Хотел сделать сохранение стека в бинарный файл и чтение-вывод на экран из его же.
Набросал код :
Сохранение стека в файл работает, а вот при чтении стека из файла такая ситуация. Интересует откуда берется мусор и почему верхний элемент стека выводится два раза.
P.S. Также любые замечания, предложения, пожалуйста говорите, не молчите, надо учиться!
Листинг программы
- #include <conio.h>
- #include<iostream>
- struct zap
- {
- char inf[5];
- zap *l;
- };
- FILE *f;
- using namespace std;
- void push(zap **);
- void out (zap **);
- void show (zap *);
- int main ()
- {
- zap *s=NULL;
- while(true)
- {
- cout<<"1-add"<<endl;
- cout<<"2-Out"<<endl;
- char l=getch();
- switch(l)
- {
- case '1': push(&s);break;
- case '2': out(&s);show(s); break;
- case 27: exit(NULL);
- }
- }
- }
- void push(zap **s)
- {
- zap *s1=*s;
- if((f=fopen("test.txt","w+b"))==NULL)
- {perror("Error");return;}
- *s= new zap;
- cout<<"Enter n"<<endl;
- gets((*s)->inf);
- (*s)->l=s1;
- s1=*s;
- fwrite(*s,sizeof(zap),1,f);
- fclose(f);
- }
- void out(zap **s)
- {
- if((f=fopen("test.txt","rb"))==NULL)
- {perror("Error");return;}
- do
- {zap *s1=*s;
- *s=new zap;
- fread(*s,sizeof(zap),1,f);
- (*s)->l=s1;
- s1=*s;
- }while(!(feof(f)));
- fclose(f);
- }
- void show (zap *s)
- {
- do
- {
- printf(" %s",s->inf);
- s=s->l;
- } while(s);
- }
Решение задачи: «Сохранение стека в бинарный файл и чтение-вывод на экран из него»
textual
Листинг программы
- // test.cpp: определяет точку входа для консольного приложения.
- //
- #include "stdafx.h"
- #include <conio.h>
- #include <iostream>
- using namespace std;
- struct zap
- {
- char inf[5];
- zap *l;
- };
- FILE *f;
- using namespace std;
- void push(zap **);
- //void out (zap **);
- void show (zap *);
- int main ()
- {
- f=fopen("test.txt","w+b");
- zap *s=NULL;
- while(true)
- {
- cout<<"1-add"<<endl;
- cout<<"2-Out"<<endl;
- char l=getch();
- switch(l)
- {
- case '1': push(&s);break;
- case '2': /*out(&s)*/;show(s); break;
- case 27: exit(NULL);
- }
- }
- fclose(f);
- }
- void push(zap **s)
- {
- zap *s1=*s;
- *s= new zap;
- cout<<"Enter n"<<endl;
- gets((*s)->inf);
- (*s)->l=s1;
- s1=*s;
- int i = sizeof(zap);
- fwrite((**s).inf,sizeof(s),1,f);
- }
- /*void out(zap **s)
- {
- //if((f=fopen("test.txt","rb"))==NULL)
- //{perror("Error");return;}
- do
- {zap *s1=*s;
- *s=new zap;
- fread(*s,sizeof(zap),1,f);
- (*s)->l=s1;
- s1=*s;
- }while(!(feof(f)));
- }*/
- void show (zap *s)
- {
- do
- {
- printf(" %s",s->inf);
- s=s->l;
- } while(s);
- exit(0);
- }
Объяснение кода листинга программы
В данном коде реализована программа работы со стеком, используя бинарный файл для его сохранения и чтения.
Структура данных, используемая в программе, называется zap и содержит указатель на следующий элемент в стеке и массив из 5 символов для хранения информации об элементе.
В начале программы открывается файл test.txt
в режиме w+b
(запись и чтение) с помощью функции fopen. Затем инициализируется указатель на вершину стека s, который начинается с NULL.
В основном цикле программы, который выполняется до тех пор, пока пользователь не введет символ '27', происходит следующее:
- Выводится сообщение с предложением ввести число '1' для добавления элемента в стек или '2' для вывода текущего содержимого стека.
- Пользователь вводит символ, который считывается с помощью функции getch.
- В зависимости от введенного символа выполняется соответствующая операция:
- Если введен символ '1', то вызывается функция push, которая добавляет новый элемент в стек.
- Если введен символ '2', то вызывается функция show, которая выводит текущее содержимое стека. В функции push выполняется следующее:
- Создается новый элемент структуры zap и инициализируется указатель на него.
- Вводится информация об элементе с помощью функции gets.
- Устанавливается связь нового элемента со старым (вставляется в стек).
- Информация об элементе записывается в файл с помощью функции fwrite. В функции show выполняется цикл, который проходит по всем элементам стека и выводит информацию об элементе с помощью функции printf. Код не был полностью реализован, так как функция out не была дописана. Она должна выполнять чтение информации из файла и добавление элементов в стек, аналогично функции push.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д