Jump to content

Resolução do programa


JonyBoy

Recommended Posts

Boa Noite,

Gostaria de colocar entre programa a dar em C, ma penso que isto eta a ler um ficheiro em txt e eu queria apenas que guarda-se e depois pudesse pesquisar selecionado essa opção.

Alguém consegue ajudar ?

É urgente quem poder ajudar agradecia muito.

// Programa para guardar filmes.
// Menu iniciar que pergunta ao utilizador se deseja ler ou gravar


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

//definir nome do arquivo

#define arquivo  "c:\\Filmes\\filmes.txt"

// funções utilizadas

int    menu           ();
void   ler            (FILE*);
int    gravar         (FILE*);
int    escrever_dados (FILE*);

int main(void)
{
//reservar espaço na memoria;
FILE *file = (FILE*)malloc(sizeof(file));

int select = 0;

while (select==0)
{
    //Escolha das funções do menu;
    //Aqui a função menu retorna o dado selecionado e executa a respectiva função;
    //Vai executar enquanto o menu não retornar o valor 3;
    switch(select = menu())
    {
    case 1:
        ler(file);
        break;

    case 2:
        gravar(file);
        break;

    case 3:
           return 0;
    default:
        break;

    }
}
return 0;
}
int menu()
{
printf("\n Digite uma das opcoes:\n   ler, gravar ou fim:");

char palavra [50];

//Espera pela palavra inserida pelo teclado e guarda a mesma na variavel "palavra"
scanf("%s",palavra);
//limpa o buffer do teclado;
fflush (stdin);
//converter todas as letras da variavel para maiusculas;
strupr(palavra);

//Ira aparecer entao a palavra digitada;
//Caso não seja a que se pretende ira retornar '0';
//Ira voltar ao menu para que o utilizador volte a inserir nova opção;
if        (!strcmp(palavra, "LER")     ==1)  return 1;
else if   (!strcmp(palavra, "GRAVAR")  ==1)  return 2;
else if   (!strcmp(palavra, "FIM")     ==1)  return 3;
else                                         return 0;

}

void ler (FILE*file)
{
  system    ("cls");
  printf    ("\n\n");

  file     = fopen (arquivo,"r");

  // Se o arquivo não abrir ira retornar 0, entao o negado(!) e para inverter e entrar na condição para mostrar a mensagem de erro.
  if (!file)
  {
   printf("\n\n Arquivo não encontrado!\n\n");
  }
  else
  {
   char c;

   //Verifica se o primeiro arquivo e igual a EOF(-1), o que indica o final do arquivo;
   if((c = getc (file))==EOF)
   {
       printf("Arquivo esta vazio!");
   }

   //Faz a leitura do arquivo carater a carater e mostra no ecra ate ao fim;
   while((c = getc(file))!= EOF)
   {
       printf("%c",c);
   }
  }
  //pausa
  getchar();
}

int gravar (FILE *file)
{
// "a": insere no fim; se não existir arquivo ele criara com "w";
if( (file = fopen(arquivo, "a") )||(file = fopen(arquivo,"w")))

{
    while(escrever_dados(file)){}
    return 0;
}
}

int escrever_dados(FILE *file)
{
char       codigo[20];
char       filme [20];
char       genero[20];
char       sair  [20];

printf     ("\n\nCodigo:");
//limpa buffer do teclado;
fflush      (stdin);
//captura a string;
gets        (codigo);
//copia a string para a variavel sair;
strcpy      (sair, codigo);
//comparar valor da string com a palavra FIM, caso seja = sai e retorna o valor '0';
// caso sejam diferentes então continua;
if(!strcmp(strupr(sair),"FIM")) return 0;

printf    ("Filme:");
fflush    (stdin);
gets      (filme);
strcpy    (sair, filme);

if(!strcmp(strupr(sair),"FIM")) return 0;

printf    ("Genero:");
fflush    (stdin);
gets      (genero);
strcpy    (sair, genero);

if(!strcmp(strupr(sair),"FIM")) return 0;

fprintf    (file,"\nCodigo:%s",codigo);
fprintf    (file,"    Filme:%s",filme);
fprintf    (file,"        Genero:%s",genero);

return 1;


}
Link to comment
Share on other sites

Terei de ver o código com mais calma, mas para já reparei em algumas coisas que alteraria.

 

1. strcmp:

if (!strcmp(palavra, "LER") == 1)

Não sei se a negação de 0 em C está definido na ISO como sendo indelevelmente 1. Sugiro a utilização de uma das seguintes opções para garantir que funciona qualquer que seja o compilador e standard utilizado por ele:

// opção 1
if (!strcmp(palavra, "LER"))

// opção 2
if (strcmp(palavra, "LER") != 0)

 

2. Leitura de strings:

Não recomendo usar o scanf() para a leitura de strings. Por outro lado, o comportamento de fflush(stdin) não está definido. O uso de gets() também não é aconselhado. Infelizmente a leitura de strings consegue ser uma pequena dor de cabeça em C, mas a solução que uso pessoalmente passa pelo seguinte:

a) Usar fgets() para ler o input do utilizador;

char linha[50];
fgets(linha, 50, stdin);

b) Substituir o \n lido do teclado e troca-o por \0:

/* Elimina o LF final de uma string obtida por fgets. */
void strlf(char* s) {
   for (; *s != '\0'; s++);
   s--;
   *s = '\0';
}

// Como usar:
strlf(line);

c) Limpar o buffer de entrada.

/* Limpa o buffer de entrada.
   A usar depois de um scanf e antes da leitura de uma string do stdin. */
void clear_buffer(FILE* stream) {
   char c;
   while (c = fgetc(stream), (c != EOF) && (c != '\n'))
      ;
}

// Como usar:
clear_buffer(stdin);

 

3. Condição de saída:

Verifica se queres que o ciclo corra enquanto a opção for 0 ou enquanto a opção for diferente de 0:

while (select == 0) { }

 

4. Alocação de memória heap:

Diria que este malloc() não está bem feito:

FILE *file = (FILE*) malloc(sizeof(file));

Precisas mesmo de alocar na memória heap? Não vejo a necessidade de tal, mas sugiro esta solução para alocar corretamente a memória:

// Opção 1:
FILE *file = malloc(sizeof(FILE));

// Opção 2:
FILE *file = malloc(sizeof(*file));

 

5. Manipulação de ficheiros:

Vejo vários fopen() no código, mas não dei conta de nenhum fclose(). O ficheiro tem de ser encerrado e não o deves abrir várias vezes seguidas sem antes o ter fechado.

Mais, aqui estás a fazer dois fopen() seguidos:

if ((file = fopen(arquivo, "a")) || (file = fopen(arquivo,"w")))

A opção "a" cria o ficheiro se ele não existir. Portanto, não precisas deste processo. Basta fazer isto:

file = fopen(arquivo, "a");  // cria o ficheiro se não existir

 

Para já é o que posso apontar do pouco que vi do teu código.

Cumprimentos.

Knowledge is free!

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.