Ir ao conteúdo
  • Cadastre-se

C Alocar dinamicamente não estou conseguindo


Posts recomendados

Alguem poderia me ajudar em alocar dinamicamente esse codigo? tentei e não consegui, eu tenho que alocar dentro das funções ou no main?

deixei o codigo anexado, me ajuda pf 😕

 

desculpe se ficou mutito grande, o anexo ta ai para maior facilidade.

|| filmes.c ||

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "filmes.h"
#define TAM 30

//PROGRAMADOR JEDERSON YAGO / FRANCISCO RUAN
//DISCIPLINA: ALGORITMOS E ESTRUTURA DE DADOS I


struct ficha{
int codigo;
char filme[TAM];
float duracao;
char categoria[TAM];
char status;
int ativo;
};

struct ficha dados;
FILE *arq;
char resp;

/*Função para abrir o arquivo*/
void AbrirArquivo(char filme[]){

system("cls");

arq = fopen(filme, "rb+"); // associa ao arq fisico e, se arquivo nao existe, deve ser criado, rb = somente para leitura
if (arq == NULL) puts("NULL");
if (arq == NULL)

arq = fopen(filme, "wb+");// abre o arquivo depois - rb = escrita a partir do início do arquivo

puts("ARQUIVO ABERTO.");


}

/*Função para fechar o arquivo*/
void FecharArquivo() {

system("cls");

fclose(arq);

puts("ARQUIVO FECHADO.");

}

//Registra o filme 
void RegistrarFilme(){
char opcao;
do{
//Faz inclusão dos dados para registra o filme
system("cls");

fseek(arq,0,SEEK_END); // procura de uma certa posição do arquivo - arq, 0 = qtd bytes para deslocamento do cursor
//seek_end - começa do final para o início

puts("** INCLUSAO DE FILME ***\n");

printf("Codigo ......:");
fflush(stdin);
scanf("%d",&dados.codigo);

printf("Filme ..:");
fflush(stdin);
gets(dados.filme);

printf("Duracao do filme..:");
fflush(stdin);
scanf("%f",&dados.duracao);

printf("Categoria..:");
fflush(stdin);
gets(dados.categoria);

printf("Status..:");

puts("D = Disponivel");
puts("L = Locado");
fflush(stdin);

dados.status = toupper(getchar());

if((dados.filme == "") || (dados.filme == NULL))// tratamento para nome em branco
{
puts("ERRO DEVIDO A DADOS ERRADOS INSERIDOS");
puts("Deixou o campo FILME em branco");
puts("Os dados nao foram registrados no sistema");
}

else if(dados.codigo == NULL)//tratamento para codigo em branco
{
puts("REGISTRO RESTRINGIDO DEVIDO A DADOS ERRADOS INSERIDOS");
puts("Deixou o campo FILME em branco");
puts("Os dados nao foram registrados no sistema");
}

//Tratamento do status, restringe o usuário a colocar diferente de D ou L
else if((dados.status == 'D') || (dados.status == 'L') /*&& (dados.filme != NULL) || (dados.codigo != NULL)*/)
{
dados.ativo = 1;// Ativo = 1 quer dizer que existe, por que na função de exclusão, usaremos exclusão lógica colocando ativo = 0
fwrite(&dados,sizeof(struct ficha),1,arq);// escreve todos os dados no arquivo
}

else
{
puts("REGISTRO RESTRINGIDO DEVIDO A DADOS ERRADOS INSERIDOS");
puts("Ou você inseriu Status digitado errado, Somente digite D = disponivel ou L = locado");
puts("Deixou alguns dos campos em branco");
puts("Os dados nao foram registrados no sistema");
}

// se for errado o status, ele não registra os dados e dá a opcao de fazer uma nova inclusão
if (ferror(arq))
puts("ERRO!!");
printf("\nDESEJA INCLUIR OUTRO FILME <S/N>? ");
fflush(stdin);
opcao = toupper(getchar());
} //fim primeiro Do

while (opcao == 'S');
}


//Busca filme pelo código e exibe seu status se está locado ou não
int Buscar(int codigo)
{
int nreg = -1;

rewind(arq); //posiciona na primeira estrutura do arquivo

fread(&dados,sizeof(struct ficha),1,arq);//&dados aponta a estrutura a ser lida
//sizeof()o tamanho do arquivo, 1 quantidade de buscas, arq = arquivo

if (!ferror(arq))// se não retorna erro se der erro, entra no if

while (!feof(arq))//feof informa se chegou ao fim do arquivo, se for diferente entra no while
{
nreg++;

if ((dados.codigo) == codigo) // compara se o filme digitado tem na lista, se tem ele busca, ao invés de usar == tem que usar =

return(nreg);

fread(&dados,sizeof(struct ficha),1,arq); //fread, retorna um número inteiro correspondente a quantidade de bytes lidos

}

else

puts("ERROR!!");

return(-1);

}
// Função para buscar filme por categoria
int BuscarPalavra(char categoria[TAM])
{
int nreg = -1;

rewind(arq); //posiciona na primeira estrutura do arquivo

fread(&dados,sizeof(struct ficha),1,arq);//&dados aponta a estrutura a ser lida
//sizeof()o tamanho do arquivo, 1 quantidade de buscas, arq = arquivo

if (!ferror(arq))// se não retorna erro se der erro, entra no if

while (!feof(arq))//feof informa se chegou ao fim do arquivo, se for diferente entra no while
{

nreg++;

if (strcmp(dados.categoria, categoria) == 0) // compara se o filme digitado tem na lista, se tem ele busca, ao invés de usar == tem que usar =

return(nreg);

fread(&dados,sizeof(struct ficha),1,arq); //executa a leitura do arquivo
}

else

puts("ERROR!!");

return(-1);

}

//Função para fazer a locação do filme
void Locar() {

int codigo;
int nreg;

system("cls");

puts("** LOCAR FILME ***\n");

printf("Digite o codigo do filme para registrar a locacao ......:");
fflush(stdin);
scanf("%d",&codigo);

nreg = Buscar(codigo);

if ( nreg >=0 ) // se a busca for maior do que 0 ele achou e apresentará os dados achados e mudará o status automaticamente
{

if(dados.status != 'L')
{

printf("Status ..: %c\n",dados.status);
fflush(stdin);

dados.status = 'L';

printf("Novo Status..= %c: \n", dados.status);
puts("Status L = locado\n");

// Posiciona novamente o cursor sobre o registro desejado.
fseek(arq,sizeof(struct ficha) * nreg, SEEK_SET);//seek_set começa da posição corrente

fwrite(&dados, sizeof(dados), 1, arq);//escreve os novos dados no arquivo

if (!ferror(arq))//se não der erro
{
puts("");
puts("LOCACAO REALIZADA");
}

else
{
puts("ERROR!!");
}

}//fim if que filtra se nao esta locado

else
{
puts("");
puts("Filme ja se encontra em status L = Locado");
puts("Clique em enter para voltar ao menu principal");
}

system("pause");
}

else
puts("FILME NAO ESTA CADASTRADO OU NAO ESTA DISPONIVEL");
fflush(stdin);
getchar();
}

//Função para a devoluçao do filme
void DevolucaoFilme() {

int codigo;
int nreg;

system("cls");

puts("** DEVOLUCAO DO FILME ***\n");

printf("Digite o codigo do filme para registar a devolucao......:");
fflush(stdin);
scanf("%d",&codigo);

nreg = Buscar(codigo);

if ( nreg >=0 ) //if principal de busca se tem na lista o codigo digitado
{
    
if(dados.status != 'D')
{//if que filtra quem nao esta disponivel para devolver

printf("Status ..: %c\n",dados.status);
fflush(stdin);

dados.status = 'D';

printf("Novo Status..: %c -> Disponivel\n", dados.status);
puts("");
// Posiciona novamente o cursor sobre o registro desejado.

fseek(arq,sizeof(struct ficha) * nreg, SEEK_SET);// seek_set procura da posição corrente o cursor

fwrite(&dados, sizeof(dados), 1, arq);

if (!ferror(arq))

{
puts("DEVOLUCAO REALIZADA");
}

else
{
puts("ERROR!!");
}

}//fim if que filtra que nao esta devolvido para mudar o status

else
{
puts("");
puts("Filme ja se encontra em status D = Disponivel ou Devolvido");
puts("Clique em enter para voltar ao menu principal");
}

system("pause");

}//fim if principal de busca se tem na lista o codigo digitado

else
{
puts("FILME NAO ESTA CADASTRADO OU NAO ESTA DISPONIVEL");
fflush(stdin);
getchar();
}

}


//Função para exclui filme
void ExcluirFilme() {

char opcao;
int codigo;

int nreg;

system("cls");

puts("** EXCLUSAO DE FILME ***");

printf("Codigo do filme......:");
fflush(stdin);
scanf("%d",&codigo);

nreg = Buscar(codigo);

if ( nreg >=0 ) {

printf("num %d\n",nreg);
printf("Nome do filme..: %s\n",dados.filme);

printf("CONFIRMA EXCLUSAO DO FILME <S/N>?");
fflush(stdin);

opcao = toupper(getchar());

if (opcao == 'S') {
fseek(arq,sizeof(struct ficha) * nreg, SEEK_SET);//procura os dados da posição corrente (seek_set)
// Exclusão Lógica
dados.ativo = 0;// quando ativo = 0, ele é excluído logicamente
fwrite(&dados, sizeof(dados), 1, arq);//registra novos dados
if (!ferror(arq))

puts("FILME EXCLUIDO.");

else

puts("ERRO!!");
}

}

else

puts("FILME NAO ENCONTRADO.");
fflush(stdin);

getchar();

}

//Função para consultar filme
void ConsultarFilme(){

int codigo;
int nreg;

system("cls");

puts("** CONSULTA DE FILMES ***\n");

printf("Codigo do Filme ......:");
fflush(stdin);
scanf("%d",&codigo);

nreg = Buscar(codigo);

if ( nreg >= 0 ) // se não atingou -1, ele achou um codigo correspondente, e imprimirá o conteúdo, usado pelo função buscar
{
    
if(dados.status == 'D')
{
printf("num %d\n",nreg);
printf("Codigo: %d\n Filme ..: %s\n Categoria: %s\n Duracao: %.2f Hs \n Status: %c -> Disponivel\n", dados.codigo, dados.filme, dados.categoria, dados.duracao, dados.status);
}

else
{
printf("num %d\n",nreg);
printf("Codigo: %d\n Filme ..: %s\n Categoria: %s\n Duracao: %.2f Hs \n Status: %c -> Locado\n", dados.codigo, dados.filme, dados.categoria, dados.duracao, dados.status);
}

}
else
puts("FILME NAO ENCONTRADO.");
fflush(stdin);
getchar();

}

//Função para listar as categoria cadastradas
void listarCategorias()
{
rewind(arq); //posiciona na primeira linha do arquivo // inicia funcao mostra categoria

fread(&dados,sizeof(struct ficha),1,arq); //le os dados

puts("Categorias registradas para fazer a busca");
puts("");

if (!ferror(arq)) //se não der erro pela função ferror

while (!feof(arq)) //feof informa se chegou ao fim do arquivo, se for diferente entra continua no loop do while
{
if (dados.ativo)// o if identifica se o valor é verdadeiro automaticamente que é 1, se 1 ele existe, se 0,

//não existe, na função de exclusão, ter filmes que estarão com ativo = 0 e não aparecerão na listagem

printf("%s \n",dados.categoria);

fread(&dados,sizeof(struct ficha),1,arq); //le os dados selecionados
}

else
{
puts("ERROR!!");
fflush(stdin);
getchar();
}

puts("");

//Fim funcao mostra categorias
}

//Função para listar todos os filmes no arquivo
void ListarFilme()
{
system("cls");

puts("***** LISTA DE FILMES*****\n");

rewind(arq); //posiciona na primeira linha do arquivo

fread(&dados,sizeof(struct ficha),1,arq); //le os dados

if (!ferror(arq)) //se não der erro pela função ferror

while (!feof(arq)) //feof informa se chegou ao fim do arquivo, se for diferente entra continua no loop do while

{

if (dados.ativo)// o if identifica se o valor é verdadeiro automaticamente que é 1, se 1 ele existe, se 0,

//não existe, na função de exclusão, ter filmes que estarão com ativo = 0 e não aparecerão na listagem

printf("Codigo: %d \n Filme: %s: \n Duracao: %.2lf hs\n Categoria: %s\n Status: %c\n Ativo: %d \n\n",dados.codigo,dados.filme,dados.duracao,dados.categoria,dados.status,dados.ativo);

fread(&dados,sizeof(struct ficha),1,arq); //le os dados selecionados

}

else

puts("ERROR!!");
fflush(stdin);
getchar();
}


//Função para listar os filmes por categoria
void ListarFilmeCategoria()
{
char categoria[TAM];// variavel categoria para comparar durante a busca e imprimir caso seja condizente

system("cls");//limpa a tela do menu

puts("***** LISTA DE FILMES POR CATEGORIA*****\n");

// listarCategorias();

listarCategorias();//Funcao lista categorias registradas para facilitar a busca

puts("Digite a categoria de filmes");
scanf("%s",&categoria);

rewind(arq); //posiciona na primeira linha do arquivo, para começar a busca do começo

fread(&dados,sizeof(struct ficha),1,arq);

if (!ferror(arq)) // se for diferente de erro da função ferror

while (!feof(arq)) //feof informa se chegou ao fim do arquivo, se for diferente entra continua no loop do while

{

if (strcmp(dados.categoria, categoria) == 0)// comparando pelo strcmp se for igual, imprime os dados da struct que o cursor está buscando dados

printf("Codigo: %d \n Filme: %s: \n Duracao: %.2lf hs\n Categoria: %s\n Status: %c\n Ativo: %d \n\n",dados.codigo,dados.filme,dados.duracao,dados.categoria,dados.status,dados.ativo);

fread(&dados,sizeof(struct ficha),1,arq); //fread, retorna um número inteiro correspondente a quantidade de bytes lidos
}

else

puts("ERROR!!");
fflush(stdin);
getchar();
}

//Função para excuir todos os filmes do arquivo
void excluirTodos(){
    int op;
    printf("Deseja Realmente excluir todos os filmes? \n [1-Sim ou 2-nao]: ");
    scanf("%d",&op);
    if (op == 1){
        struct  ficha;
        FILE * arquivo;
        arquivo = fopen("FILMES.txt","w");
        printf("Todos excluidos com Exito!");         
        fclose(arquivo);
    }
    getch();
}

/*void libera(){
    free(dados);
}*/

//Função menu
void Menu() {

system("cls");

system("color 1F");

puts("|-----------------------------------------------|");
puts("|  Programador: JEDERSON YAGO / FRANCISCO RUAN  |");
puts("|-----------------------------------------------|");
puts("|         PROGRAMA DE CONTROLE DE LOCADORA      |");
puts("|----------------------MENU---------------------|");
puts("|                                               |");
puts("|           1. Inclusao Filmes                  |");
puts("|           2. Consulta Filmes por codigo       |");
puts("|           3. Locar um Filme                   |");
puts("|           4. Devolver um Filme                |");
puts("|           5. Excluir Filme                    |");
puts("|           6. Listar Filmes                    |");
puts("|           7. Listar Filmes por categoria      |");
puts("|           8. Excluir todos os filmes          |");
puts("|           0. Sair                             |");
puts("|                                               |");
puts("|-----------------------------------------------|\n");
}

//Função para a escolha da opção desejada
void opções(){

int opcao;

do{
Menu();
printf("Selecione uma opcao: ");
scanf("%d", &opcao);

switch(opcao)
//usando switch case, chamamos as funções de acordo com as opções escolhidas
{

case 1: RegistrarFilme(); break;

case 2: ConsultarFilme(); break;

case 3: Locar(); break;

case 4: DevolucaoFilme(); break;

case 5: ExcluirFilme(); break;

case 6: ListarFilme(); break;

case 7: ListarFilmeCategoria(); break;

case 8: excluirTodos();

case 0: puts("Programa finalizado"); break;

default:

puts("Opcao Invalida");

}

} while (opcao != 0);

}



|| filmes.h ||



#define FILMES_H_INCLUDED
#ifndef FILMES_H_INCLUDED

//PROGRAMADOR JEDERSON YAGO / FRANCISCO RUAN
//DISCIPLINA: ALGORITMOS E ESTRUTURA DE DADOS I

typedef struct ficha ficha;

AbrirArquivo(char filme[]);

FecharArquivo();

RegistrarFilme();

Buscar(int codigo);

AlterarStatus();

DevolucaoFilme();

ExcluirFilme();

void excluirTodos();

ListarFilme();


#endif



|| main ||



#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "filmes.h"
#define TAM 30

//PROGRAMADOR JEDERSON YAGO / FRANCISCO RUAN
//DISCIPLINA: ALGORITMOS E ESTRUTURA DE DADOS I

int main(){
system("cls");
AbrirArquivo("FILMES.txt");
opções();
FecharArquivo();
system("pause");

}

Nova pasta (4).rar

Link para o comentário
Compartilhar em outros sites

Alocação dinâmica faz sentido apenas quando deseja-se guardar muitos dados na memória, ou quando a quantidade de dados é indeterminada podendo ser arbitrariamente grande.

 

Este programa usa apenas 1 variável da struct para fazer qualquer coisa, ou seja apenas dados sobre 1 filme está na memória da struct a qualquer momento, nunca lê e armazena em um vetor de structs o arquivo de filmes inteiro, o programa apenas pega do arquivo os dados de 1 filme por vez e realiza as operações necessárias (impressão, alteração, comparação, etc).

 

Então pela lógica usada no programa não é necessário alocar memória dinamicamente, e não faz sentido fazê-lo.

 

Mudar a lógica para trabalhar com todos os dados dos filmes na memória em um vetor de struct alocado dinamicamente, ao invés de lendo 1 por 1 do arquivo toda vez, basicamente requer mudar a lógica do código inteiro, o que seria quase o mesmo que fazer o programa do zero...

 

Mas fazer programas para outros os usuários não é a proposta desse fórum, podemos apenas te ajudar tirando dúvidas ou fazendo correções no seu código.

 

 

Notei também que esse código na verdade é basicamente este código antigo de 2013 modificado:

E não consta a autoria original no seu código.

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!