Based on your reasoning, follow a code (tested) capable of writing to a text file called lista_filmes.txt
the content of a lista
of filmes
:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
typedef struct filme_s
{
char cinema[100];
char titulo[100];
int genero;
int duracao;
int idade_minima;
} filme_t;
typedef struct lista_filmes_s
{
int num_filmes;
filme_t * filmes;
} lista_filmes_t;
int gravar_para_ficheiro( const char * ficheiro, lista_filmes_t * lista )
{
FILE * fp = NULL;
int i = 0;
fp = fopen( ficheiro, "w+" );
if(!fp)
return -1;
for( i = 0; i < lista->num_filmes; i++ )
{
fprintf( fp, "FILME #%d\n\n", i + 1 );
fprintf( fp, "\tNome do cinema: %s\n",lista->filmes[i].cinema );
fprintf( fp, "\tTitulo: %s\n", lista->filmes[i].titulo );
fprintf( fp, "\tGenero: %d\n", lista->filmes[i].genero );
fprintf( fp, "\tDuracao: %d\n", lista->filmes[i].duracao );
fprintf( fp, "\tIdade Minima: %d\n", lista->filmes[i].idade_minima );
fprintf( fp, "\n");
}
fclose(fp);
return 0;
}
int main( void )
{
lista_filmes_t lst; /* Lista de filmes */
/* Aloca memoria na lista para acomodar 3 filmes */
lst.filmes = malloc( sizeof(filme_t) * 3 );
lst.num_filmes = 3;
/* Cadastro Filme #1 */
strcpy( lst.filmes[0].cinema, "Cinesystem");
strcpy( lst.filmes[0].titulo, "Back to the Future");
lst.filmes[0].genero = 5;
lst.filmes[0].duracao = 116;
lst.filmes[0].idade_minima = 0;
/* Cadastro Filme #2 */
strcpy( lst.filmes[1].cinema, "Kinoplex");
strcpy( lst.filmes[1].titulo, "2001: A Space Odyssey");
lst.filmes[1].genero = 5;
lst.filmes[1].duracao = 142;
lst.filmes[1].idade_minima = 12;
/* Cadastro Filme #3 */
strcpy( lst.filmes[2].cinema, "Kinoplex");
strcpy( lst.filmes[2].titulo, "Contact");
lst.filmes[2].genero = 5;
lst.filmes[2].duracao = 149;
lst.filmes[2].idade_minima = 8;
/* Grava lista de filmes no arquivo */
int ret = gravar_para_ficheiro( "lista_filmes.txt", &lst );
/* Verifica se houve erro */
if( ret < 0 )
{
fprintf( stderr, "Fatal: Erro de criacao/gravacao de arquivo!\n");
return 1;
}
/* Libera memoria ocupada pela lista de filmes */
free( lst.filmes );
/* Sucesso */
return 0;
}
Contents of the recorded file:
FILME #1
Nome do cinema: Cinesystem
Titulo: Back to the Future
Genero: 5
Duracao: 116
Idade Minima: 0
FILME #2
Nome do cinema: Kinoplex
Titulo: 2001: A Space Odyssey
Genero: 5
Duracao: 142
Idade Minima: 12
FILME #3
Nome do cinema: Kinoplex
Titulo: Contact
Genero: 5
Duracao: 149
Idade Minima: 8
Which error is displayed?
– Don't Panic
The program simply closes, it seems the error saying that the program has stopped working, and goes below.
– Pedro Torres Moreira
Could post the full code?
– Geraldão de Rívia
where is the statement of
listafilmes
?– lemoce
I don’t think the instruction
index = lista->filmes[i];
whatever you want, but I advise you to put the definition of the structures to be easy to see– Isac
The full code is a little big, about 600 lines, I’ll put the file for you to use and you can see the situation better
– Pedro Torres Moreira