Logo Hardware.com.br
FreedCloth030
FreedCloth03... Novo Membro Registrado
12 Mensagens 2 Curtidas

Arquivos, vetores, structs etc

#1 Por FreedCloth03... 01/11/2015 - 01:00
Preciso de ajuda em um trabalho da faculdade.
Minha maior dificuldade está nas operações com arquivos.
O trabalho é bem grandinho, mas , vou passar só uma parte do código que estou tentando fazer (indo por partes). Essa primeira parte está trabalhando com arq em txt. O resto será em .bin.
Essa primeira parte trata do cadastro, listagem e remoção de categorias.
Consegui fazer com que o programa cadastre e liste as categorias, todavia, ainda não tenho ideia de como fazer a remoção.
E o professor resolveu estabelecer determinadas regras para o desenvolvimento do código:
Segue abaixo:
1 - Todas as funções devem estar implementadas.
2 - Os arquivos devem ser abertos e fechados somente nas funções que os utilizarem (na main() não!)
4 - Nenhuma das funções abaixo deve ter scanf(), exceto as de leitura de structs.
8 - Não alterar os structs (nome e campos) nem as funções (nome, parâmetros e tipo).
9 - Está permitido o acréscimo de funções.
P.S.: Ainda não adicionei nenhuma função. As que estão no códigos foram todas que o professor passou. Só criei Bloco de código delas

10 - Não utilizar variáveis globais além das que jã estão presentes.

Enfim, preciso de ajuda com a remoção e dicas de como posso melhorar este codigo. Aqui no meu pc ele compilou e fez tudo direitinho, mas, eu aprendi que nem tudo que compila está certo. Agradeço ao(s) ajudante(s) (Jesus ama vcs!!!).

Segue o código que eu escrevi:
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>

typedef struct _Categoria{
char nome_cat[20];
int num_cat;
}Categoria;

#define TAM_CATEGORIA 4096/sizeof(Categoria) //170 (TAMANHO EM INTEIROS);

Categoria categorias[TAM_CATEGORIA];

FILE *txtCategoria;

int leCategoria(Categoria *categoria)
{
int i;
for (i = 0; i < TAM_CATEGORIA; i++)
{
printf("\nNumero: &quot;
scanf("%d",&categorias[i].num_cat);
if (categorias[i].num_cat==1010)
{
break;
}
printf("\nNome: &quot;
scanf("%s",categorias[i].nome_cat);
}
}


void cadastraCategoria(Categoria categoria)
{
int i;
printf("\n----------CADASTRO DE CATEGORIA----------&quot;
printf("\nDIGITE 1010 EM Numero PARA SAIR\n&quot;
leCategoria(&categoria);
txtCategoria = fopen("categorias.txt","a+&quot;
for (i=0; i< TAM_CATEGORIA;i++)
{
if (categorias[i].num_cat!= 1010 && categorias[i].num_cat !=0)
{
fprintf(txtCategoria,"%d\t%s\n",categorias[i].num_cat, categorias[i].nome_cat);
}
}
fclose(txtCategoria);
system("clear || cls&quot;
printf("\nCATEGORIAS CADASTRADAS COM SUCESSO\n&quot;

}

void listaCategoria()
{
int num;
char nome[20];
printf("\n----------LISTA DE CATEGORIAS----------\n&quot;
printf("\nNúmero\tNome\n&quot;
txtCategoria = fopen("categorias.txt","r&quot;
if (txtCategoria == NULL)
{
printf("\nERRO AO ABRIR O ARQUIVO\n\7&quot;
exit(0);
}
while(fscanf(txtCategoria,"%d\t%s\n",&num,nome)!=EOF)
{
printf("%d\t%s\n",num,nome);
}
fclose(txtCategoria);
}

void removeCategoria(int num_categoria);//não como proceder aqui.

int main ()
{
setlocale(LC_ALL,"Portuguese&quot;
Categoria var_cat;
cadastraCategoria(var_cat);
listaCategoria();
return 0;
tpcvasco
tpcvasco General de Pijama Registrado
2.9K Mensagens 330 Curtidas
#2 Por tpcvasco
01/11/2015 - 23:33
Pelo q eu entendi, tudo isso já foi te dado de mão beijada, então não tem graça. Tente começar o remover e ajudamos a partir daí.
"Milhouse: - Médicos e bombeiros são heróis.
Bart Simpson: - Olha, as casas continuam pegando fogo e as pessoas continuam doentes. Os verdadeiros heróis são os Schwarzenegger's, os Stallone's, e, em menores proporções, os Vandame's..."
FreedCloth030
FreedCloth03... Novo Membro Registrado
12 Mensagens 2 Curtidas
#4 Por FreedCloth03...
02/11/2015 - 04:13
E ai!
Eis aqui o que eu tentei fazer para a função remover;
minha ideia foi zerar todos os vetores, ou seja, "limpa-los". }(para isso foi criada a função zeraVetor())
depois, carregar tudo o que estava escrito nos arquivos para os vetores limpos.(para isso foi criada a função carrega_Arq_Vetor())
E só então realizar a função de remoção.
tal função procederia deste modo:
Depois que os vetores ficassem limpos e carregados com todo o conteudo do arquivo, eu excluiria o arquivo anterior(ja que os dados foram passados pros vetores) e recriaria outro arquivo (modo de abertura "w") com o mesmo nome e escrevendo tudo o que estava nos vetores exceto o que eu desejava excluir.
Aqui comigo funcionou. Mas, não sei se é o código, ou ideia, mais ideal para a situação.
Enfim,
perguntas pertintes;
tem algum modo melhor de se fazer isso?? Seguido as regras que o professor passou.
Quanto ao codigo em geral, em que posso melhora-lo?
(esse código ainda não é pra entrega, obviamente, por isso podem faltar printf's como: digite o numero, ou erro ao remover categoria..etc)

VLWS!boa.gif


Segue o codigo abaixo:

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

typedef struct _Categoria{
char nome_cat[20];
int num_cat;
}Categoria;

#define TAM_CATEGORIA 4096/sizeof(Categoria) //170 (TAMANHO EM INTEIROS);

Categoria categorias[TAM_CATEGORIA];

FILE *txtCategoria;

int leCategoria(Categoria *categoria)
{
int i;
for (i = 0; i < TAM_CATEGORIA; i++)
{
printf("\nNumero: &quot;
scanf("%d",&categorias[i].num_cat);
if (categorias[i].num_cat==1010)
{
break;
}
printf("\nNome: &quot;
scanf("%s",categorias[i].nome_cat);
}
}


void cadastraCategoria(Categoria categoria)
{
int i;
printf("\n----------CADASTRO DE CATEGORIA----------&quot;
printf("\nDIGITE 1010 EM Numero PARA SAIR\n&quot;
leCategoria(&categoria);
txtCategoria = fopen("categorias.txt","a+&quot;
for (i=0; i< TAM_CATEGORIA;i++)
{
if (categorias[i].num_cat!= 1010 && categorias[i].num_cat !=0)
{
fprintf(txtCategoria,"%d\t%s\n",categorias[i].num_cat, categorias[i].nome_cat);
}
}
fclose(txtCategoria);
system("clear || cls&quot;
printf("\nCATEGORIAS CADASTRADAS COM SUCESSO\n&quot;

}

void listaCategoria()
{
int num;
char nome[20];
printf("\n----------LISTA DE CATEGORIAS----------\n&quot;
printf("\nNúmero\tNome\n&quot;
txtCategoria = fopen("categorias.txt","r&quot;
if (txtCategoria == NULL)
{
printf("\nERRO AO ABRIR O ARQUIVO\n\7&quot;
exit(0);
}
while(fscanf(txtCategoria,"%d\t%s\n",&num,nome)!=EOF)
{
printf("%d\t%s\n",num,nome);
}
fclose(txtCategoria);
}
void zeraVetor()
{
int i;
for (i=0;i<TAM_CATEGORIA;i++)
{
categorias[i].num_cat = 0;
strcpy(categorias[i].nome_cat," &quot;
}
}
int carrega_Arq_Vetor()
{
int i;
txtCategoria = fopen ("categorias.txt","r&quot;
if(txtCategoria == NULL)
{
printf("\nErro ao abrir o arquivo!!\n&quot;
exit(1);
}

for (i=0;i<TAM_CATEGORIA;i++)
{
if(fscanf(txtCategoria,"%d\t%s\n",&categorias[i].num_cat,categorias[i].nome_cat) != EOF)
{

}
}
return 1;
fclose(txtCategoria);
}
void removeCategoria()
{
printf("\n----------REMOÇÃO DE CATEGORIAS---------\n&quot;
int i,num_categoria;
printf("\nNumero: &quot;
scanf("%d",&num_categoria);
zeraVetor();
if (carrega_Arq_Vetor()==1)
{
txtCategoria = fopen("categorias.txt","w&quot;
for (i=0;i<TAM_CATEGORIA;i++)
{
if (num_categoria != categorias[i].num_cat)
{
if (categorias[i].num_cat != 0)
{
fprintf(txtCategoria,"%d\t%s\n",categorias[i].num_cat, categorias[i].nome_cat);
}
}
else
{
printf("\nCategoria removida com sucesso\n&quot;
}
}
}
else
{
printf("\n\nAlguma coisa deu errada na função \'carrega_Arq_Vetor\'()\n\n&quot;
}
fclose(txtCategoria);
}

int main ()
{
setlocale(LC_ALL,"Portuguese&quot;
Categoria var_cat;
cadastraCategoria(var_cat);
listaCategoria();
removeCategoria();
listaCategoria();
return 0;
}
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal