Jump to content

Gravar dados em ficheiro


alphasil
 Share

Recommended Posts

Olá

Tenho de fazer um trabalho em que pede para criar um menu com 3 opções em que a primeira e segunda opção chamam uma função.

Até aí consigo, mas depois, acontece algo estranho, aparecem duas frases seguidas

Introduza o nome do ficheiro:

Introduza o Nome do Filme:

mal ponho um nome...aparecem mais duas frases.

Introduza o género do Filme:

Introduza o ano do Filme:

e não passa daqui, ou seja, não escreve nada num ficheiro....

alguma dica?

#include <stdio.h>

void func_adiciona_filme()
{
char titulo [30];
char genero [15];
char nome[100];
char ano[4];
FILE *f;

printf("Introduza o nome do ficheiro: \n");
gets(f);
printf("Introduza o Nome do Filme: \n");
scanf("%c", titulo);
printf("Introduza o género do Filme: \n");
scanf("%c", genero);
printf("Introduza o ano do Filme: \n");
scanf("%c", ano);
f = fopen(strcat(nome,".txt"),"a+");
if(f==NULL)
printf("Não foi possível abrir o ficheiro: %s\n", nome);
fputc(titulo,f);
fputc(genero,f);
fputc(ano,f);
fflush(f);
fclose(f);

}

void main()
{
int op;
printf("Menu \n");
printf("1 - Adicionar filme \n");
printf("2 - Acionar Cliente \n");
printf("0 - Sair \n");
printf("Introduza a sua opção:\n");
scanf("%d", &op);
switch(op)
{
case 1:
	func_adiciona_filme();
	break;
case 2:
	printf("Escolheu 2");
	break;
case 0:
	exit(1);
		break;
default: printf("Opção inválida");
break;
}
}


gmc11

 

Link to comment
Share on other sites

O teu problema primario é o eterno problema do scanf()! O scanf() deixa os ENTERs pendurados para serem lidos (ou ignorados) pela instrucao de input seguinte.

O meu conselho é usares fgets() seguido de sscanf() ou strtol() em vez do scanf().

Alem disso ... XIIIIIIIIIIIIIIIIIIIIIIII ... tantas coisitas a melhorar 😉

1) Nao uses gets(). A funcao gets() é impossivel de usar com seguranca. Alem disso essa funcao deixou de existir oficialmente desde Dezembro de 2011, embora os compiladores ainda nao estejam actualizados e aceitem-na.

2) A string de conversao para o scanf() com o valor "%c" pede ao scanf para ler um caracter (por exemplo 'A'). Ela mete esse caracter na primeira posicao do array e nao termina o array: ou seja, depois dos scanf()s os arrays titulo, genero e ano nao sao strings!.

3) O array ano esta definido com 4 elements. Esses 4 elementos sao suficientes para 3 digitos e o terminador necessario para strings. Verifica se 3 digitos te chegam ... e verifica tambem os tamanhos dos outros arrays.

4) A variavel nome nao tem um valor valido quando tentas fazer strcat().

5) O fclose() faz tambem um fflush() implicito. Nao precisas de chamar as duas funcoes.

6) void main ... nao!!! grrrrrrrrrrrrrr excepto em implementacoes sem sistema operativo a funcao main deve devolver um int.

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Link to comment
Share on other sites

Olá

Obrigado pela resposta, já tinha feito uma alterações e agora aparece. Mas continua a dar o problema das duas frases seguidas...mas grava.

#include <stdio.h>

void func_adiciona_filme()
{
char titulo [30];
char ch, nome[30];
char genero [30];
char ano [30];

FILE *f;
f = fopen(strcat(nome,".txt"),"a+");
if(f==NULL)
{
	printf("Não foi possível abrir o ficheiro: %s\n", nome);
	exit(1);
}
do
{
fflush(stdin);
printf("Introduza o nome do filme (exit para sair): \n");
gets(titulo);
if (strcmp(titulo, "exit")!=0)
{
	printf("Introduza o genero do filme: \n");
	 strtol(genero);
	printf("Introduza o ano do filme: \n");
	 strtol(ano);
	fprintf(f, "Filme: %s Genero: %s  Ano: %s  \n", titulo, genero, ano);
	fflush(f);
}
else break;
}
while(strcmp(titulo, "exit")!=0);
rewind(f);

//Leitura

while (feof(f)==0)
{
	ch=getc(f);
	printf("%c", ch);
}
fclose(f);

}
void func_adiciona_cliente()
{

}
main()
{
int op;
printf("Menu \n");
printf("1 - Adicionar filme \n");
printf("2 - Adicionar Cliente \n");
printf("0 - Sair \n");
printf("Introduza a sua opção:\n");
scanf("%d", &op);
switch(op)
{
case 1:
	func_adiciona_filme();
	break;
case 2:
	func_adiciona_cliente();
	break;
case 0:
	exit(1);
		break;
default: printf("Opção inválida");
break;
}
}

Se ponho fgets aparece-me este erro

too few arguments to function ‘fgets’

e com o sscanf() aparacem-me as 3 perguntas seguidas....

cumps

gmc11

 

Link to comment
Share on other sites

Quando te sugeri usar fgets() e sscanf() e strtol() pus os links para a documentacao dessas mesmas funcoes. Le a documentacao e usa as funcoes de acordo com o especificado.

Nao facas programacao por tentativa e erro: consulta a documentacao.

What have you tried?

Não respondo a dúvidas por PM

A minha bola de cristal está para compor; deve ficar pronta para a semana.

Torna os teus tópicos mais atractivos e legíveis usando a tag CODE para colorir o código!

Link to comment
Share on other sites

No primeiro menu, onde está "scanf("%d", &op);" mudava para "op = getch();" e os "case n:" para "case 'n':"

Quanto ao resto, comigo o programa estoira quando chega a "f = fopen(strcat(nome,".txt"),"a+");". As variável char na função func_adiciona_filme() estão cheias de lixo uma vez que não foram inicializadas.

Link to comment
Share on other sites

Acho que leres o ano do filme, género e titulo com %c apenas vai ler um caracter, se é que não me falha a memória. Sugeria que utilizasses %s

sim ... ler o buffer com o %c le somente um caracter, no entanto com %s para imediatamente quando aparecer um caractere de espaço. usa simplesmente o fgets como te foi dito (sem esqueçer de retirar o caracter '\n' final)

IRC : sim, é algo que ainda existe >> #p@p
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
 Share

×
×
  • 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.