Pessoal veja o problema que estou enfrentando. O Hugo e o TerraSkill e o AnsiC me deram uma grande ajuda e consegui gravar um arquivo de dados para cálculo de índice de massa corpórea. Mas ainda falta dois detalhes:
Primeiro: Preciso gravar variáveis tipo int formatadas com 3 dígitos (qual a máscara do fprintf?). Preciso gravar variáveis tipo double com seis dígitos e três deles são decimais, além do ponto de divisão entre inteiro e decimal (tem alguma mascará do fprintf?)
Segundo: Preciso ler esses dados corretamente de acordo com a formatação acima (tem máscara para o fscanf?). Além disso, os dados numéricos precisam ser numéricos e não string, pois vou fazer contas com eles.
Vejam o que já estou fazendo (abaixo segue o programa e o arquivo gerado por ele).
Atenciosamente,
Ronaldo
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct registro {
char nome[80];
int idade;
double peso;
double altura;
};
main() {
struct registro pessoa[10];
printf("Dados para o arquivo: \n");
int c;
for(int i = 0; i < 4; i++) {
while ( (c = getchar()) != '\n' && c != EOF ) { }
printf("\n\n Nome: ");
scanf("%79[^\n]", &pessoa[i].nome);
while ( (c = getchar()) != '\n' && c != EOF ) { }
printf("\n Idade: ");
scanf("%d", &pessoa[i].idade);
while ( (c = getchar()) != '\n' && c != EOF ) { }
printf("\n Peso: ");
scanf("%lf", &pessoa[i].peso);
while ( (c = getchar()) != '\n' && c != EOF ) { }
printf("\n Altura: ");
scanf("%lf", &pessoa[i].altura);
}
FILE *ponteiro;
ponteiro = fopen("imc.txt", "a");
if(!ponteiro) {
printf("\nErro ao abrir arquivo!\n");
fclose(ponteiro);
exit(0);
}
else
printf("\nArquivo aberto com sucesso\n");
for(int i = 0; i < 4; i++) {
fprintf(ponteiro, "%-80s\n", pessoa[i].nome);
fprintf(ponteiro, "%d", pessoa[i].idade);
fprintf(ponteiro, "%lf", pessoa[i].peso);
fprintf(ponteiro, "%lf",pessoa[i].altura);
}
fclose(ponteiro);
return(0);
}
Veja o arquivo gerado pelo programa:
Ronaldo Rodrigues Godoi Filho do Neto do Pai
4882.5000001.700000aaaaa bbbbb ccccc ddddd
4990.0000001.600000b
212.0000000.800000L asdjlkfj alksdjf lkas djflkajsdlkfjalksd fjl
3558.0000001.550000
Os dados estão certos, não tem problema os números terem seis casas decimais, mas note que não há como diferenciar cada campo. Eu tenho que saber o tamanho do campo quando gravo e quando leio.