SOS - estruturas e ficheiros binarios "c/c++"

bushin

Membro
Pessoal preciso de ajuda, o programa esta a gravar lixo ou seja qdo introduzo o 1º valor = 1 e 2º valor = 1, o resultado final deveria ser 2,3 e 3. fechando o programa e voltando a executar o programa escolhendo a segunda opçao mostrar dados anteriores ele estoira ou seja estoira na função void le_valores(struct struct_empresa *p)


Código

#include <stdio.h>
#include <Windows.h>
#include <conio.h>

struct struct_empresa;

struct struct_empresa{

float liq_geral;
float liq_reduzida;
float liq_imediata;
}dados[3];

void liquidez(void);
void le_valores(struct struct_empresa *);
void guardar_valores(struct struct_empresa);


void main(void){
struct struct_empresa x;


int opcao;

printf("(prima 1) para calcular a liquidez\n");

printf("(prima 2)mostrar dados anteriores\n\n");




do{
printf("(Escolha a opcao) ");
opcao=getch();
switch (opcao){
case '1':
system("cls");
liquidez();
break;

case'2':
system("cls");
struct struct_empresa *data;
le_valores(data);
printf("liquidez geral %d\n liq_reduzida: %d\n liq_imediata: %d\n",data->liq_geral, data->liq_reduzida, data->liq_imediata);
break;
default:
printf( "Op%c%co inv%clida!!! ",135,132,160);getch();
printf( " ");
break;
}
} while (opcao!='27');
}



void liquidez(){
float prim;
float seg;
float liq_g;
float liq_r;
float liq_i;
struct_empresa liquid;

printf("introduza o primeiro numero: \n");
scanf("%.2f",&prim);
fflush(stdin);
printf("introduza o segundo numero: \n");
scanf("%.2f",&seg);
//liquidez geral
liq_g=prim+seg;
liquid.liq_geral=liq_g;

printf("liquidez geral: %.2f\n",liquid.liq_geral);

//liquidez reduzida
liq_r=(prim*2)+seg;
liquid.liq_reduzida=liq_r;
printf("liquidez reduzida: %.2f\n",liquid.liq_reduzida);

//liquidez imediata
liq_i=prim+(seg*2);
liquid.liq_imediata=liq_i;
printf("liquidez imediata: %.2f\n",liquid.liq_imediata);

guardar_valores(liquid);

}


void guardar_valores(struct struct_empresa liquid){

FILE *Liq;
Liq=fopen("experiencia.dat","wb");

if (!Liq)
{
printf("Erro a guardar ....!!");
}


fwrite(&liquid,sizeof(struct struct_empresa),1,Liq);
fclose(Liq);

}


void le_valores(struct struct_empresa *p){

FILE *Liq;

if((Liq=fopen("experiencia.dat","rb"))==NULL)
printf("Erro\n");

fread((struct struct_empresa*)p,sizeof(struct struct_empresa),1,Liq);

//printf("liquidez geral %d\n liq_reduzida: %d\n liq_imediata: %d\n",p->liq_geral, p->liq_reduzida, p->liq_imediata);
fclose(Liq);
}
 
Tive a fazer o debug, para te ajudar, e um dos teus problemas está no scanf da funçao liquidez().

Em vez de:

PHP:
printf("introduza o primeiro numero: \n");
scanf("%.2f",&prim);
fflush(stdin);
printf("introduza o segundo numero: \n");
scanf("%.2f",&seg);

deves por

PHP:
printf("introduza o primeiro numero: \n");
scanf("%f",&prim);
fflush(stdin);
printf("introduza o segundo numero: \n");
scanf("%f",&seg);

(mudar de %.2f pra %f)

Isto já faz com que os valores apareçam direitos. Eu sei que estás a tentar limitar a duas casas decimais, mas deve haver outra maneira de fazer (ja nao pego nisto ah muito tempo) que não essa.

Em relaçao à leitura do ficheiro, vou ver agora... já ca venho fazer EDIT.

EDIT: sorry mate.. não consegui ver onde estava o erro nisto dos ficheiros.. já não pegava nisto ah bue.. Eu assim q tiver tempo procuro pelos meus exercicios antigos q tem la carradas de cenas c ficheiros... Boa Sorte!
 
Última edição:
Ele deve limitar o número de casas decimais é na apresentação, na inserção de valores não deve restringir isso (e pelos vistos nem consegue).
 
Ele deve limitar o número de casas decimais é na apresentação, na inserção de valores não deve restringir isso (e pelos vistos nem consegue).

Exactamente.. E' mesmo isso.. Ja' nao me lembrava hehe..

Eu fiz o debug daquilo, mas como ja' nao pego nisto ha bue, ja nao sei onde esta' o erro..
 
SOS- urgente!!

ja consegui resolver alguns problemas, mas continua a estoirar qdo consulto os dados anteriores :confused:

#include <stdio.h>
#include <Windows.h>
#include <conio.h>

struct struct_empresa;

struct struct_empresa{

float liq_geral;
float liq_reduzida;
float liq_imediata;
};

void liquidez(void);
void guardar_valores(struct struct_empresa liquid);
void mostrar_dados(void);



int main(){


//struct struct_empresa data;
int opcao;

printf("(prima 1) para calcular a liquidez\n");

printf("(prima 2)mostrar dados anteriores\n\n");

do{
printf("(Escolha a opcao) ");
opcao=getch();
switch (opcao){
case '1':
system("cls");
liquidez();
break;
case'2':
system("cls");
mostrar_dados();
break;
default:
printf( "Op%c%co inv%clida!!! ",135,132,160);getch();
printf( " ");
break;
}
} while (opcao!='27');
return (0);
}

void liquidez(void){
float prim;
float seg;
float liq_g;
float liq_r;
float liq_i;
struct_empresa liquid;

printf("introduza o primeiro numero: \n");
scanf("%f",&prim);
fflush(stdin);
printf("introduza o segundo numero: \n");
scanf("%f",&seg);
//liquidez geral
liq_g=prim+seg;
liquid.liq_geral=liq_g;

printf("liquidez geral: %f\n",liquid.liq_geral);

//liquidez reduzida
liq_r=(prim*2)+seg;
liquid.liq_reduzida=liq_r;
printf("liquidez reduzida: %f\n",liquid.liq_reduzida);

//liquidez imediata
liq_i=prim+(seg*2);
liquid.liq_imediata=liq_i;
printf("liquidez imediata: %f\n",liquid.liq_imediata);

guardar_valores(liquid);

}

void guardar_valores(struct struct_empresa liquid){

FILE *Liq;
Liq=fopen("experiencia.dat","wb");

if (!Liq)
{
printf("Erro a guardar ....!!");
}

fwrite(&liquid,sizeof(struct struct_empresa),1,Liq);
fclose(Liq);

}

void mostrar_dados(void){

FILE *Liq;

struct_empresa *p;


if((Liq=fopen("experiencia.dat","rb"))==NULL){
printf("Erro\n");
}

fread(p,sizeof(struct struct_empresa),1,Liq);

printf("liquidez geral %f\n liq_reduzida: %f\n liq_imediata: %f\n",p->liq_geral, p->liq_reduzida, p->liq_imediata);


fclose(Liq);

}
 
Back
Topo