TransWikia.com

Excluir registro em arquivo texto

Stack Overflow em Português Asked by Luigi Wagner on November 13, 2021

Estou fazendo um programa que consiste no registro de filmes/séries, modificação de informações e exclusão de registros especificados.

Estou tendo grande dificuldade na concepção das funções de excluir e modificar filmes e séries.

Primeiramente, segue a definição das estruturas de filmes e séries:

#include<stdio.h>
#include<stdlib.h>

//Estruturas principais

typedef struct filmes
{
    char nome[50];
    char diretor[30];
    char elenco[80];
    int ano;
    char genero[20];

}Filmes;

typedef struct series
{
    char nome[50];
    char criador[30];
    char elenco[80];
    int ano;
    int numeroTemporadas;
    char genero[20];

}Series;

//Cabeçalho das funções de funções.h

//FILMES
void adicionarFilme(Filmes *filmes, int *posF, int *nFilmes, FILE *arq);
void modificarFilme();
void removerFilme();
void imprimeFilmes(Filmes *filmes, int *nFilmes);
void managementFilmes(int codigo, Filmes *filmes, int *posF, int *nFilmes, FILE *arq);
int buscaFilme(FILE *arq, Filmes filmes);

//SÉRIES
void adicionarSerie(Series *series, int *posS, int *nSeries, FILE *arq);
void modificarSerie();
void removerSerie();
void imprimeSeries(Series *series, int *nSeries);
void managementSeries(int codigo, Series *series, int *posS, int *nSeries, FILE *arq);

Como o arquivo filmes.c é essencialmente o mesmo que series.c, segue apenas este para efeito de acompanhamento:

#include<stdio.h>
#include<stdlib.h>
#include "estruturas.h"
#include<string.h>

void adicionarFilme(Filmes *filmes, int *posF, int *nFilmes, FILE *arq)
{
    *nFilmes = *nFilmes + 1;

    filmes = (Filmes *) realloc(filmes, *nFilmes * sizeof(Filmes));

    if(!filmes)
    {
        exit(1);
    }

    printf("nntNome: ");
    scanf(" %[^n]s", filmes[*posF].nome);
    printf("nntDiretor: ");
    scanf(" %[^n]s", filmes[*posF].diretor);
    printf("nntElenco: ");
    scanf(" %[^n]s", filmes[*posF].elenco);
    printf("nntAno: ");
    scanf("%d", &filmes[*posF].ano);
    printf("nntGenero: ");
    scanf(" %[^n]s", filmes[*posF].genero);

    fprintf(arq, "ntFilme: %s", filmes[*posF].nome);
    fprintf(arq, "ntDiretor: %s", filmes[*posF].diretor);
    fprintf(arq, "ntElenco: %s", filmes[*posF].elenco);
    fprintf(arq, "ntAno: %d", filmes[*posF].ano);
    fprintf(arq, "ntGenero: %snn", filmes[*posF].genero);

    *posF = *posF + 1; //incrementa posição do vetor
}

void modificarFilme()
{
        //como faço essa função?
}

void removerFilme()
{
        //como faço essa função?
}

void imprimeFilmes(Filmes *filmes, int *nFilmes)
{
    int i;
    int x = 1;

    printf("ntFILMESn");
    for(i = 0; i < *nFilmes ; i++)
    {
        printf("ntNOME:t%s", filmes[i].nome);
        printf("ntDIRETOR:t%s", filmes[i].diretor);
        printf("ntELENCO:t%s", filmes[i].elenco);
        printf("ntANO:t%d", filmes[i].ano);
        printf("ntGENERO:t%s", filmes[i].genero);

        printf("nn");
        x++;
    }
}

void managementFilmes(int codigo, Filmes *filmes, int *posF, int *nFilmes, FILE *arq)
{
    if(codigo == 1)
    {
        adicionarFilme(filmes, posF, nFilmes, arq);
    }
    if(codigo == 2)
    {
        //função de remover/excluir
    }
    if(codigo == 3)
    {
        //função de modificar
    }
    if(codigo == 4)
    {
        imprimeFilmes(filmes, nFilmes);
    }
    if(codigo == 0)
    {
        return;
    }
}

Os registros são feitos em um arquivo txt !

Por fim, segue o programa principal para efeito de referência:

#include<stdio.h>
#include<stdlib.h>
#include "estruturas.h"

void criar(FILE *arq);

int main()
{   
    Filmes *filmes;
    Series *series;

    int posF = 0;
    int posS = 0;

    int numeroFilmes = 0;
    int numeroSeries = 0;

    char codA;
    int codB;

    FILE *arq;  

    do{
        /**********************************
            Código A:

            F - Filmes
            S - Series
            X - Encerra
        ***********************************/
        printf("ntCOMANDOS: ");
        printf("nntF - FilmesnntS - SeriesnntX - Encerrannt");
        scanf("%c", &codA);

        fflush(stdin);

        if(codA == 'F' || codA == 'f')
        {
            /**********************************
                Código B:

                1 - Adicionar filme
                2 - Remover filme
                3 - Modificar informações de um filme
                4 - Imprime registro de filmes
                0 - Sair
            ***********************************/
            printf("ntCOMANDOS: ");
            printf("nnt1 - Adicionar filmennt2 - Remover filmennt3 - Modificar informacoes de um filmennt4 - Imprime registro de filmesnnt0 - Sairnnt");
            scanf("%d", &codB);

            arq = fopen("filmes.txt", "a++");
            if(!arq)
            {
                printf("nntArquivo nao pode ser aberto corretamente!");
                exit(1);
            }

            managementFilmes(codB, filmes, &posF, &numeroFilmes, arq);
            fflush(stdin);
            fclose(arq);
        }


        else if(codA == 'S' || codA == 's')
        {
            /**********************************
                Código B:

                1 - Adicionar série
                2 - Remover série
                3 - Modificar informações de uma série
                4 - Imprime registro de séries
                0 - Sair
            ***********************************/
            printf("ntCOMANDOS: ");
            printf("nnt1 - Adicionar seriennt2 - Remover seriennt3 - Modificar informacoes de uma seriennt4 - Imprime registro de seriesnnt0 - Sairnnt");
            scanf("%d", &codB);

            arq = fopen("series.txt", "a++");
            if(!arq)
            {
                printf("nntArquivo nao pode ser aberto corretamente!");
                exit(1);
            }


            if(codB == 1 && isFirstTimeS == 0)
            {
                series = (Series *) malloc(sizeof(Series));
                isFirstTimeS = 1;
            }

            managementSeries(codB, series, &posS, &numeroSeries, arq);
            fflush(stdin);
            fclose(arq);
        }

        else if(codA == 'x' || codA == 'X')
        {
            break;
        }

        else
            printf("nntCodigo invalido!");

        fflush(stdin);

    }while(codA != 'X' || codA != 'x');

    if(numeroFilmes > 0)
        free(filmes);
    if(numeroSeries > 0)    
        free(series);

    return 0;
}

Se vocês pudessem me ajudar com pelo menos parte do código de fato dessas duas funções em questão, seria de imensa ajuda!

One Answer

  • comentario *

Cara, por você estar trabalhando com Vetor a lógica tem que ser algo assim:

Modificar: 1- Pergunta qual o nome do filme. 2- Varre o vetor comparando. 3- Com o vetor em mãos, passa a função de inserção porém com o conteúdo do encontrado.

Excluir: Mesma lógica de varredura pra encontrar, mas quando encontrar vc pode colocar o ultimo filme nessa posição, caso a ordem dos filmes não importe.

RECOMENDO FORTEMENTE UTILIZAR LINKED LIST EM VEZ DE VETOR!

Answered by M. Bertolazo on November 13, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP