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

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

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

Хотел сделать сохранение стека в бинарный файл и чтение-вывод на экран из его же. Набросал код :
#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); 
 
}
Сохранение стека в файл работает, а вот при чтении стека из файла такая ситуация. Интересует откуда берется мусор и почему верхний элемент стека выводится два раза. P.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. Выводится сообщение с предложением ввести число '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
Похожие ответы