Сохранение стека в бинарный файл и чтение-вывод на экран из него - 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.