Erro na passagem do buffer para o arquivo

1. Erro na passagem do buffer para o arquivo

Kim Aragon Escobar
Garfild666

(usa OpenSuSE)

Enviado em 17/06/2008 - 20:45h

Estou com um problema no meu codigo...
ele simplismente não passa os dados do buffer para o arquivo...
e o intereçante eh q o fwrite retorna 1...mas ele não escreve nda no arquivo
ai segue o codigo.
se alguem puder me ajudar...eu agradeço desd jah
muito obrigado pela sua paciencia!


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

//ponteiro do arquivo
FILE *arq, *arq1;

//dados a serem passados para o arquivo
struct dados
{
int codigo,estoque;
char albun[15],artist[15],estilo[15];
float preco;
};

void indice(void);
void sair(void);
void wait(float seconds);
int testl(int test);
void tolowers(char *trns);

int main()
{
struct dados buffer;
char opcao;
char continua='s';
int continua2;

system("clear");
printf("Criando o arquivo em ~/dados\n");
wait(1);
if(!(arq=fopen("dados","a+b")))
{
printf("\nErro fatal!\n");
sair();
}
else
printf("Criação bem sucedida!\n");
wait(2);
system("clear");


while(continua=='s'||continua=='S')
{
indice();
printf("Operacao desejada: ");
__fpurge(stdin);
scanf("%c", &opcao);
system("clear");

switch(opcao)
{
case 'i':
case 'I':
while(continua=='s'||continua=='S')
{
continua2=1;
while(continua2)
{
continua2=0;
printf("Adicione os dados do novo cd:\n");
printf("Codigo: ");
scanf("%i", &buffer.codigo);
if(buffer.codigo<1)
{
printf("Codigo invalido, apenas inteiros positivos.\n");
continua2=1;
printf("Espere...\n");
wait(2);
system("clear");
}
else
if(testl(buffer.codigo))
{
printf("Esse codigo jah existe\n");
printf("Espere...\n");
continua2=1;
wait(2);
}
}
wait(0.5);
system("clear");

continua2=1;
while(continua2)
{
continua2=0;
printf("Adicione os dados do novo cd:\n");
printf("Artista: ");
__fpurge(stdin);
gets(buffer.artist);
wait(0.5);
system("clear");


printf("Adicione os dados do novo cd:\n");
printf("Album: ");
__fpurge(stdin);
gets(buffer.albun);

tolowers(buffer.artist);
tolowers(buffer.albun);

if(testd(buffer.albun, buffer.artist))
{
printf("CD jah cadastrado\n");
printf("Espere...\n");
continua2=1;
wait(2);
system("clear");
}

}
wait(0.5);
system("clear");

printf("Adicione os dados do novo cd:\n");
printf("Estilo: ");
__fpurge(stdin);
gets(buffer.estilo);
wait(0.5);
system("clear");

continua2=1;
while(continua2)
{
continua2=0;
printf("Adicione os dados do novo cd:\n");
printf("preço: ");
scanf("%f", &buffer.preco);
if(buffer.preco<=0)
{
printf("preço invalido, somente preços positivos\n");
continua2=1;
printf("Espere...\n");
wait(2);
}
}
system("clear");
wait(0.5);

continua2=1;
while(continua2)
{
continua2=0;
printf("Adicione os dados do novo cd:\n");
printf("Quantidade em estoque: ");
__fpurge(stdin);
scanf("%i", &buffer.estoque);
if(buffer.estoque<=0)
{
printf("Numero invalido, somente numeros positivos\n");
continua2=1;
printf("Espere...\n");
wait(2);
}
}
system("clear");

printf("Gravando...\n");
wait(2);
fseek(arq, (buffer.codigo-1)*sizeof(struct dados), SEEK_SET);
if(fwrite(&buffer, sizeof(struct dados), 1, arq))
{
printf("Gravado com sucesso!!!\n");
printf("Deseja cadastrar mais cds?(s/n)\n");
__fpurge(stdin);
scanf("%c", &continua);
__fpurge(arq);
system("clear");
}
else
{
printf("Ocorreu um erro na gravação\n");
printf("Incira os dados novamento\n");
printf("Espere...\n");
wait(2);
}
}
continua='s';
break;

case 'l':
case 'L':
while(!feof(arq))
{
if(fread(&buffer, sizeof(struct dados), 1, arq1))
if(buffer.codigo)
{
printf("Artista: ");
puts(buffer.artist);
printf("Album: ");
puts(buffer.albun);
printf("Estilo: ");
puts(buffer.estilo);
printf("Preço: %.1f\n", buffer.preco);
printf("Em estoque: %i\n", buffer.estoque);
}
}
wait(3);
break;

case 's':
case 'S':
// logo();
printf("Obrigado por usar o meu software!!!!\n");
printf("Bye Bye\n");
wait(2);
sair();
}
}
}
//cria o indice
void indice(void)
{
printf(" Indice Tarefa\n");
printf("-> I Inclusão <-\n");
printf("-> L Listar <-\n");
printf("-> S Sair <-\n");
}
//fecha o programa
void sair(void)
{
fclose(arq);
system("clear");
exit(0);
}
//faz a tela travar
void wait (float seconds)
{
clock_t endwait;
endwait = clock () + seconds * CLOCKS_PER_SEC ;
while (clock() < endwait) {}

}
//teste para ver se a posição jah eh ocupada
int testl(int test)
{
struct dados teste;

fseek(arq, (test-1)*sizeof(struct dados), SEEK_SET);
fread(&teste, sizeof(struct dados), 1, arq);
if(teste.codigo==test)
return 1;
else
return 0;
}
//teste paraver se o cd jah foi incluido no arquivo
int testd(char *test, char *test2)
{
struct dados teste;
int n=0;

while(!feof(arq))
{
if(fread(&teste,sizeof(struct dados), 1, arq))
if(!(strcmp(teste.albun, test)))
if(!(strcmp(teste.artist, test2)))
n++;
}

if(n==1)
return 1;
else
return 0;
}
//passa uma string inteira para letra minuscula
void tolowers(char *trns)
{
int i;
for(i=0;i<strlen(trns);i++)
tolower(trns[i]);
}


  


2. Re: Erro na passagem do buffer para o arquivo

Fagner Amaral de Souza Candido
f_Candido

(usa Ubuntu)

Enviado em 19/06/2008 - 20:59h

Olá colega,

Tentei compilar seu código, ele apresentou alguns warnings, verifique isso. Em outra situação ocorre que você utiliza a função __fpurge, acredito que para descarregar o buffer. Ocorre outros warnings em relação a isso: acrescente com arquivo de cabeçalho :
#include<stdio_ext.h>, não é padrão, ou seja, não irá funcionar em maquinas Windows, mas em Linux irá resolver seu problema.

Espero ter ajudado,

Abraços


3. Re: Erro na passagem do buffer para o arquivo

Kim Aragon Escobar
Garfild666

(usa OpenSuSE)

Enviado em 20/06/2008 - 09:09h

opa!
no warning ele se refere ao perigo de utilizar o gets...
os fpurge eles so limpam o buffer do teclado neh?!
fora isso...
eu testei a biblioteca...e continua não passando para o arquivo...
mas eh ingraçado q o fwrite retorna 1 como se tivesse passado a informação para o arquivo
mas
não passa o arquivo esta intacto!
se alguem puder me ajudar!
isso ai eh um trabalho final da disciplina de algoritmo e programação..
muito obrigado por sua ajuda....
se alguem puder ajudar sou muito agradecido!


4. Re: Erro na passagem do buffer para o arquivo

Fagner Amaral de Souza Candido
f_Candido

(usa Ubuntu)

Enviado em 20/06/2008 - 11:28h

Na verdade fpurge, não serve para limpar o lixo. Ele descarrega o buffer, consequentemente, o buffer fica vazio. Ah, outra observação:
if(testd(buffer.albun, buffer.artist))
Não encontrei essa função nos protótipos, pode me informar?
Ao persistirem os sintomas poste aí.



Abraços,


5. Re: Erro na passagem do buffer para o arquivo

Kim Aragon Escobar
Garfild666

(usa OpenSuSE)

Enviado em 20/06/2008 - 15:47h

Então quer dizer q quando faço o fpurge ele limpa os dados q estão no buffer da minha estrutura?


6. Re: Erro na passagem do buffer para o arquivo

Fagner Amaral de Souza Candido
f_Candido

(usa Ubuntu)

Enviado em 20/06/2008 - 16:04h

Limpar não seria a palavra exata. Ela simplesmente descarrega stdin. Pronto. Por isso que diriamos que o buffer fique limpo.


Abraços


7. Re: Erro na passagem do buffer para o arquivo

Kim Aragon Escobar
Garfild666

(usa OpenSuSE)

Enviado em 21/06/2008 - 14:05h

então vc acha q o problema do programa esta no fpurge???
se for como eu poderia fazer para ele funcionar legau???
e cara vlwsão pela ajuda q vc tah dando!


8. Re: Erro na passagem do buffer para o arquivo

Fagner Amaral de Souza Candido
f_Candido

(usa Ubuntu)

Enviado em 21/06/2008 - 18:26h

Olá, que isso estamos aqui pra isso: ajudar. Bom, você um dos comentários: tem uma função não declarada. Observe isso. Bom, verifique o retorno das suas funções, por exemplo: fwrite... Outra observação é debugar suas variáveis. Vou ser mais claro: Antes de colocar o fwrite, por curiosidade imprima suas variáveis antes. Veja se o arquivo está legal....


Abraços


Ao persistirem os sintomss continue postando...


9. Re: Erro na passagem do buffer para o arquivo

Fagner Amaral de Souza Candido
f_Candido

(usa Ubuntu)

Enviado em 21/06/2008 - 18:33h

Olhando o código mais de perto, mais duas observações: Por enquanto não use o fseek, antes de gravar, como você abriu o arquivo do tipo "a+b", basta dar um fwrite. Outra observação é: Quando você trata de fechar o arquivo, caso ocorra alqum erro, não há necessidade de fecha-lo pois nada foi aberto.


Abraços


10. Re: Erro na passagem do buffer para o arquivo

Kim Aragon Escobar
Garfild666

(usa OpenSuSE)

Enviado em 21/06/2008 - 20:06h

eu uso o fseek pois no trabalho tenho q organizar as estruturas em ordem randomica de acordo com o preço do produto...e sobre o fwrite ele sempre retorna valor diferente de 0 pois esta dentro de um if e o if eh ativado com base no falso booleano correto?...
e como sempre eh ativado o if na execução eh provavel q ele me retorne um valor diferente de 0 poir isso deveria estar gravando eu acho?
mas a realidade eh q não grava...

vou tentar colocar na tela as dados da estrutura antes de coloca-la para o arquivo para ver se os dados não se perdem!

se tiveres alguma outra ideia!...



11. Re: Erro na passagem do buffer para o arquivo

Fagner Amaral de Souza Candido
f_Candido

(usa Ubuntu)

Enviado em 21/06/2008 - 23:18h

Realmente sua gravação esta estranha. Mas tenho algumas sugestões... mais... srsrsr
Os ponteiros para arquivos, não os deixe globais. Transforme-os em locais, automáticos.
Não é muito interessante escolher uma posição no arquivo para o dado, ao invés disso use hash. Uma técnica simples e muito eficiente. Procure um pouco sobre hash.
Abraços


12. Re: Erro na passagem do buffer para o arquivo

Kim Aragon Escobar
Garfild666

(usa OpenSuSE)

Enviado em 21/06/2008 - 23:58h

realmente mandei imprimir os numeros
e esta ocorrendo algum erro!
quando pega o codigo o preço e o estoque
...
pod ser isso q esta dando o erro principal
e vc falou dessi hash?
oq seria?
eu não aprendi nda sobre isto em minha cadeira de programação...
tenho como encontrar algum tutorial disto aq no viva o linux?



01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts