Сохранение стека в бинарный файл и чтение-вывод на экран из него - 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.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д