• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

nando_ice

[Resolvido] Ficheiros em c++

7 mensagens neste tópico

preciso de ajuda estou a fazer um programa k consiste na criacao de uma esturar de uma companhia de gas... tenho um problemas na minha funcao inserir sempre k tento inserir um novo ele cria-me outro fixeiro, alguem me pode ajudar?'?? aki vai o exerto do programa se precisarem de mais alguma coisa digam!!

cumps fernando lopes

void inserir(void)
{
char resp;

FILE *f;

if ((f=fopen("dadoscliente.dat","w+"))==NULL)
{
	f=fopen("dadoscliente.dat","w");
}

do {
	printf("Codigo Cliente: ");
	scanf("%d",&reg.codigo);
	printf("Nome: ");
	fflush(stdin);
	gets(reg.nome);
	printf("Rua: ");
	fflush(stdin);
	gets(reg.rua);
	printf("Numero porta: ");
	fflush(stdin);
	scanf("%d",&reg.numporta);
	printf("Andar: ");
	fflush(stdin);
	gets(reg.andar);
	printf("Localidade: ");
	fflush(stdin);
	gets(reg.localidade);
	printf("Numero garrafas compradas: ");
	fflush(stdin);
	scanf("%d",&reg.numgarrafas);

	fseek(f,0,SEEK_END);
	fwrite(&reg,sizeof(reg),1,f);

	printf("Novo cliente? (s/n)");
	do {
		scanf("%c",&resp);
	}while (resp!='n' && resp!='s');

}while (resp!='n');
fclose(f);
}
 
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem vindo ao fórum nando_ice.

Usa a ferramenta GeSHi para postares código, assim o teu código fica mais legível para os leitores, como podes ver agora.

Sobre o teu problema, deve-se ao modo de abertura do ficheiro, o que deves querer é isto:

fopen("dadoscliente.dat","a+")

Dá uma leitura nesta thread: Portugal-a-Programar  |  Linguagens  |  C  |  structs e ficheiros

Espero ter resolvido o problema, cumpr. bk@ero :cheesygrin:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

mas kando ponho o +a depois ira-me dar um erro que nao ocorre no c++ e nao me executar a funcao eliminar pk nao cria o "fixeiro temp.dat" e depois nao muda de nome para "dadoscliente.dat".

remove("dadosclliente.dat");
rename("temp.dat, dadoscliente");

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

mas kando ponho o +a depois ira-me dar um erro que nao ocorre no c++ e nao me executar a funcao eliminar pk nao cria o "fixeiro temp.dat" e depois nao muda de nome para "dadoscliente.dat".

remove("dadosclliente.dat");
rename("temp.dat, dadoscliente");

Não percebi, podias explicar melhor o teu problema? Eu não vejo no código isso do remove e rename.

Tu para apagares/mudares de nome dum ficheiro, tens de o encerrar primeiro.

Por isso essas instruções devem aparecer depois do fclose(f).

Cumpr. bk@ero  :hmm:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

essa parte estava na funcao eliminar e funcionava bem mas cada vez k eu metia a+ na minha funcao inserir  havia um tipo de conflito! aparecia acess violation, logo tive de optar por outros meios

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

o brinkaero esta certo, tens de abrir o ficheiro em modo append. ( a+ ) senao ele escreve sp no principio, isso de te dar erro deve ser por outra causa...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
void inserir(void)
{
char resp;

FILE *f;

if ((f=fopen("dadoscliente.dat","r+"))==NULL)
{
	f=fopen("dadoscliente.dat","w");
	reg.codigo=0;
}
else{
		fseek(f,0,SEEK_END);
		fseek (f,ftell(f)-sizeof(reg),SEEK_SET);
		fread(&reg,sizeof(reg),1,f);
}

do {
	reg.codigo=reg.codigo+1;				
	printf("Codigo de cliente: %d\n",reg.codigo);
	printf("Nome: ");
	fflush(stdin);
	gets(reg.nome);
	printf("Rua: ");
	fflush(stdin);
	gets(reg.rua);
	printf("Numero porta: ");
	fflush(stdin);
	scanf("%d",&reg.numporta);
	printf("Andar: ");
	fflush(stdin);
	gets(reg.andar);
	printf("Localidade: ");
	fflush(stdin);
	gets(reg.localidade);
	printf("Numero garrafas compradas: ");
	fflush(stdin);
	scanf("%d",&reg.numgarrafas);

	fseek(f,0,SEEK_END);
	fwrite(&reg,sizeof(reg),1,f);

	printf("Novo cliente? (s/n)");
	do {
		scanf("%c",&resp);
	}while (resp!='n' && resp!='s');

}while (resp!='n');
fclose(f);
}
 

tenho aki o codigo e agora funciona a 100%, nao preciso do "a+" tb podes por no "fseek(f,0,SEEK_END);" e ele ira sempre para o ultimo registo...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora