Ir ao conteúdo

Duvidas ler arquivo .txt


rlrocha

Posts recomendados

Postado

Boa noite pessoal, ainda sou "iniciante" em C. O professor me passou um trabalho para fazer onde o programa tinha que fazer o seguinte.

1º Cadastrar pessoas e calcular o imc delas.

-nome

-altura

-peso

2º Gravar essas pessoas em um arquivo .txt

3º Abrir/ler esse arquivo .txt

4º listar as pessoas por imc.

Pensei ter conseguido fazer o programa, pode testar que esta rodando bonitinho.. porém o professor disse que eu tinha que listar as pessoas pelo imc puxando essas pessoas do arquivo .txt que foi gravado. Ai foi onde minha cabeça travou :confused: spaoisoaispoaispoais. Alguem por gentileza poderia me indicar uma sugestão de como fazer? Obrigado :D

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

struct reg{

char nome[80];

float altura, peso, imc;

};// struct registro

void cadastro(struct reg[]);

void grava(struct reg[]);

void abre();

void listagem(struct reg[]);

int menu();

main(){ system ("color 0F"); //porpurina

int i;

struct reg pessoa[1000];

for ( ; ;){

i=menu();

switch(i){

case 1: cadastro(pessoa);

break;

case 2: grava(pessoa);

break;

case 3: abre(pessoa);

break;

case 4: listagem(pessoa);

break;

case 5:

printf("\n\n\t\tAV1 DESENVOLVIDA por:\n\n");

system ("color 0B");

printf("\t\tRafael Lopes \n");

sleep(5000);

exit(1);

}// switch

}// for do switch

}// main

int menu()

{

int i;

system("cls");

printf("\t\t=========================================\n");

printf("\t\t| Menu |\n");

printf("\t\t=========================================\n");

printf("\n \t \t1- Cadastro \n ");

printf("\n \t \t2- Grava \n ");

printf("\n \t \t3- Abre \n ");

printf("\n \t \t4- Listagem \n ");

printf("\n \t \t5- Sair\n\n ");

printf("\t \tDigite a opcao desejada: ");

scanf("%d", &i);

if(i<1 || i >= 6 ) {

printf("\n\t \t* Valor invalido, tecle ENTER e tente novamente *");

fflush(stdin);

getch();

system("cls");

return i; }

system("cls");

return i;

}

void abre(struct reg pessoa[1000]){// FUNÇÃO QUE ABRE O ARQUIVO

int i=0,j=0;

char dados[100000];

FILE *arq;

arq=fopen("dados.txt","rt");

i++;

fscanf(arq,"%[\t\r\n \x11-\x7E]",dados);

printf(" NOME: IMC:\n");

printf("%s\n",dados );

fflush(stdin);

getch();

}

void cadastro(struct reg pessoa[1000]){ // ENTRADA DA FUNCAO QUE CADASTRA E CALCULA O IMC

int i=0,j,k;

float tempf, tempt; // var para ordena

char temp[80]; // var para ordena

printf("\n ...::ENTRE COM OS NOMES E TECLE ENTER PARA FINALIZAR::...\n"); // CADASTRAR PESSOA

for(;;){//comeco do FOR

printf("\n Nome %d: ",i+1);

fflush(stdin);

gets(pessoa.nome);

if(!pessoa.nome[0])

break;

printf("\n Altura: ");

scanf("%f",&pessoa.altura);

printf("\n Peso: ");

scanf("%f",&pessoa.peso);

printf("\n---------------------------\n");

i++;

} //fim DO FOR

fflush(stdin);

printf ("\n Calculando o IMC"); // CALCULAR O IMC

for(j=0; j<i; j++)

pessoa[j].imc = pessoa[j].peso/(pessoa[j].altura*pessoa[j].altura);

system("cls");

printf ("\n Listagem por ordem de entrada");

printf ("\n \t\t NOME \t\t IMC \n");

for (j=0;j<i;j++)

printf ("\t\t %s \t\t %.2f \n",pessoa[j].nome,pessoa[j].imc);

getch();

} // FIM DA FUNCAO DE CADASTRO E CALCULO IMC

void grava(struct reg pessoa[1000]){ // COMEÇO DA FUNÇÃO GRAVA

int i=0,j=0;

FILE *arq;

arq = fopen("dados.txt","wt");

if(arq != NULL ){

while(pessoa.nome[0])

i++;

for (j=0; j<i; j++){

fprintf(arq,"%s %f\n", pessoa[j].nome, pessoa[j].imc);

}

printf("Os dados foram gravados com sucesso.");

getch();

}// FIM DO IF ARQUIVO

fclose(arq);

}/// FIM DA FUNCAO GRAVA

void listagem(struct reg pessoa[1000]){ // FUNCAO PARA LISTAR PESSOAS POR IMC

int i=0,j=0;

int esc=0;

printf("\t\t=========================================\n");

printf("\t\t| IMC - Indice de Massa Corporal |\n");

printf("\t\t=========================================\n");

printf("\t\t-----------------------------------------\n");

printf("\t\t| SELECIONE A LISTAGEM QUE DESEJA |\n");

printf("\t\t-----------------------------------------\n\n\n");

printf(" 1. IMC ACIMA DE 35 -MUITO ACIMA DO PESO \n");

printf(" 2. IMC ACIMA 25 ATE 35 -ACIMA DO PESO NORMAL \n");

printf(" 3. IMC ACIMA 18 ATE 25 -PESO NORMAL. \n");

printf(" 4. IMC MENOR DE 18 -PESO ABAIXO DO NORMAL. \n");

printf(" 5. LISTAR TODOS \n");

scanf("%i",&esc);

system("cls");

if (esc==1){

printf("ACIMA DE 35 -MUITO ACIMA DO PESO. \n ");

while(pessoa.nome[0])

i++;

for (j=0; j<i; j++){

if ( pessoa[j].imc > 35)

printf("%s esta com o imc %.2f\n",pessoa[j].nome,pessoa[j].imc);

} // FIM DO FOR

} // FIM DO IF

if (esc==2){

printf("ACIMA 25 ATE 35 -ACIMA DO PESO NORMAL. \n ");

while(pessoa.nome[0])

i++;

for (j=0; j<i; j++){

if (pessoa[j].imc >=25 && pessoa[j].imc <35)

printf("%s esta com o imc %.2f\n",pessoa[j].nome,pessoa[j].imc);

} // FIM DO FOR

} // FIM DO IF

if (esc==3){

printf("ACIMA 18 ATE 25 -PESO NORMAL. \n ");

while(pessoa.nome[0])

i++;

for (j=0; j<i; j++){

if ( pessoa[j].imc >=18 && pessoa[j].imc <25)

printf("%s esta com o imc %.2f\n",pessoa[j].nome,pessoa[j].imc);

} // FIM DO FOR

} // FIM DO IF

if (esc==4){

printf("MENOR DE 18 ABAIXO DO -PESO NORMAL. \n ");

while(pessoa.nome[0])

i++;

for (j=0; j<i; j++){

if ( pessoa[j].imc <18)

printf("%s esta com o imc %.2f\n",pessoa[j].nome,pessoa[j].imc);

} // FIM DO FOR

} // FIM DO IF

if (esc==5) {

while(pessoa.nome[0])

i++;

for (j=0; j<i; j++){

printf("\nnome: %s imc: %.2f", pessoa[j].nome, pessoa[j].imc);

}

}

if(esc<1 || esc >=6) {

printf("Valor invalido");

}

getch();

}

Postado
Boa noite pessoal, ainda sou "iniciante" em C. O professor me passou um trabalho para fazer onde o programa tinha que fazer o seguinte.

1º Cadastrar pessoas e calcular o imc delas.

-nome

-altura

-peso

2º Gravar essas pessoas em um arquivo .txt

3º Abrir/ler esse arquivo .txt

4º listar as pessoas por imc.

Pensei ter conseguido fazer o programa, pode testar que esta rodando bonitinho.. porém o professor disse que eu tinha que listar as pessoas pelo imc puxando essas pessoas do arquivo .txt que foi gravado. Ai foi onde minha cabeça travou :confused: spaoisoaispoaispoais. Alguem por gentileza poderia me indicar uma sugestão de como fazer? Obrigado :D

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

struct reg{

char nome[80];

float altura, peso, imc;

};// struct registro

void cadastro(struct reg[]);

void grava(struct reg[]);

void abre();

void listagem(struct reg[]);

int menu();

main(){ system ("color 0F"); //porpurina

int i;

struct reg pessoa[1000];

for ( ; ;){

i=menu();

switch(i){

case 1: cadastro(pessoa);

break;

case 2: grava(pessoa);

break;

case 3: abre(pessoa);

break;

case 4: listagem(pessoa);

break;

case 5:

printf("\n\n\t\tAV1 DESENVOLVIDA por:\n\n");

system ("color 0B");

printf("\t\tRafael Lopes \n");

sleep(5000);

exit(1);

}// switch

}// for do switch

}// main

int menu()

{

int i;

system("cls");

printf("\t\t=========================================\n");

printf("\t\t| Menu |\n");

printf("\t\t=========================================\n");

printf("\n \t \t1- Cadastro \n ");

printf("\n \t \t2- Grava \n ");

printf("\n \t \t3- Abre \n ");

printf("\n \t \t4- Listagem \n ");

printf("\n \t \t5- Sair\n\n ");

printf("\t \tDigite a opcao desejada: ");

scanf("%d", &i);

if(i<1 || i >= 6 ) {

printf("\n\t \t* Valor invalido, tecle ENTER e tente novamente *");

fflush(stdin);

getch();

system("cls");

return i; }

system("cls");

return i;

}

void abre(struct reg pessoa[1000]){// FUNÇÃO QUE ABRE O ARQUIVO

int i=0,j=0;

char dados[100000];

FILE *arq;

arq=fopen("dados.txt","rt");

i++;

fscanf(arq,"%[\t\r\n \x11-\x7E]",dados);

printf(" NOME: IMC:\n");

printf("%s\n",dados );

fflush(stdin);

getch();

}

void cadastro(struct reg pessoa[1000]){ // ENTRADA DA FUNCAO QUE CADASTRA E CALCULA O IMC

int i=0,j,k;

float tempf, tempt; // var para ordena

char temp[80]; // var para ordena

printf("\n ...::ENTRE COM OS NOMES E TECLE ENTER PARA FINALIZAR::...\n"); // CADASTRAR PESSOA

for(;;){//comeco do FOR

printf("\n Nome %d: ",i+1);

fflush(stdin);

gets(pessoa.nome);

if(!pessoa.nome[0])

break;

printf("\n Altura: ");

scanf("%f",&pessoa.altura);

printf("\n Peso: ");

scanf("%f",&pessoa.peso);

printf("\n---------------------------\n");

i++;

} //fim DO FOR

fflush(stdin);

printf ("\n Calculando o IMC"); // CALCULAR O IMC

for(j=0; j<i; j++)

pessoa[j].imc = pessoa[j].peso/(pessoa[j].altura*pessoa[j].altura);

system("cls");

printf ("\n Listagem por ordem de entrada");

printf ("\n \t\t NOME \t\t IMC \n");

for (j=0;j<i;j++)

printf ("\t\t %s \t\t %.2f \n",pessoa[j].nome,pessoa[j].imc);

getch();

} // FIM DA FUNCAO DE CADASTRO E CALCULO IMC

void grava(struct reg pessoa[1000]){ // COMEÇO DA FUNÇÃO GRAVA

int i=0,j=0;

FILE *arq;

arq = fopen("dados.txt","wt");

if(arq != NULL ){

while(pessoa.nome[0])

i++;

for (j=0; j<i; j++){

fprintf(arq,"%s %f\n", pessoa[j].nome, pessoa[j].imc);

}

printf("Os dados foram gravados com sucesso.");

getch();

}// FIM DO IF ARQUIVO

fclose(arq);

}/// FIM DA FUNCAO GRAVA

void listagem(struct reg pessoa[1000]){ // FUNCAO PARA LISTAR PESSOAS POR IMC

int i=0,j=0;

int esc=0;

printf("\t\t=========================================\n");

printf("\t\t| IMC - Indice de Massa Corporal |\n");

printf("\t\t=========================================\n");

printf("\t\t-----------------------------------------\n");

printf("\t\t| SELECIONE A LISTAGEM QUE DESEJA |\n");

printf("\t\t-----------------------------------------\n\n\n");

printf(" 1. IMC ACIMA DE 35 -MUITO ACIMA DO PESO \n");

printf(" 2. IMC ACIMA 25 ATE 35 -ACIMA DO PESO NORMAL \n");

printf(" 3. IMC ACIMA 18 ATE 25 -PESO NORMAL. \n");

printf(" 4. IMC MENOR DE 18 -PESO ABAIXO DO NORMAL. \n");

printf(" 5. LISTAR TODOS \n");

scanf("%i",&esc);

system("cls");

if (esc==1){

printf("ACIMA DE 35 -MUITO ACIMA DO PESO. \n ");

while(pessoa.nome[0])

i++;

for (j=0; j<i; j++){

if ( pessoa[j].imc > 35)

printf("%s esta com o imc %.2f\n",pessoa[j].nome,pessoa[j].imc);

} // FIM DO FOR

} // FIM DO IF

if (esc==2){

printf("ACIMA 25 ATE 35 -ACIMA DO PESO NORMAL. \n ");

while(pessoa.nome[0])

i++;

for (j=0; j<i; j++){

if (pessoa[j].imc >=25 && pessoa[j].imc <35)

printf("%s esta com o imc %.2f\n",pessoa[j].nome,pessoa[j].imc);

} // FIM DO FOR

} // FIM DO IF

if (esc==3){

printf("ACIMA 18 ATE 25 -PESO NORMAL. \n ");

while(pessoa.nome[0])

i++;

for (j=0; j<i; j++){

if ( pessoa[j].imc >=18 && pessoa[j].imc <25)

printf("%s esta com o imc %.2f\n",pessoa[j].nome,pessoa[j].imc);

} // FIM DO FOR

} // FIM DO IF

if (esc==4){

printf("MENOR DE 18 ABAIXO DO -PESO NORMAL. \n ");

while(pessoa.nome[0])

i++;

for (j=0; j<i; j++){

if ( pessoa[j].imc <18)

printf("%s esta com o imc %.2f\n",pessoa[j].nome,pessoa[j].imc);

} // FIM DO FOR

} // FIM DO IF

if (esc==5) {

while(pessoa.nome[0])

i++;

for (j=0; j<i; j++){

printf("\nnome: %s imc: %.2f", pessoa[j].nome, pessoa[j].imc);

}

}

if(esc<1 || esc >=6) {

printf("Valor invalido");

}

getch();

}

vou-te dar 1 dica:

verifica este txt:

nome1

1,70

90

nome2

1,60

80

e usa o fgets() para sacares 1 linha(o atoi() converte string em numeros);)

ou penso que podes fazer isto;)

nome1 1,70 90

e usas fscanf() para leres esses valores(nao te esqueças do espaço(na string) entre variaveis;)

espero ter-te ajudado;)

Postado
vou-te dar 1 dica:

verifica este txt:

nome1

1,70

90

nome2

1,60

80

e usa o fgets() para sacares 1 linha(o atoi() converte string em numeros);)

ou penso que podes fazer isto;)

nome1 1,70 90

e usas fscanf() para leres esses valores(nao te esqueças do espaço(na string) entre variaveis;)

espero ter-te ajudado;)

Ola amigo, desculpe não entendi muito bem o que voce sugeriu e tambem ainda nao sei fazer conversão em C.

Vou tentar ser mais especifico.

O programa esta funcionando perfeitamente, porém na hora que eu fecho ele e insiro o comando para reabrir, as variaveis estão vazias, então o i que faz o for roda não roda, eu não sei como fazer esse for rodar o modo mais simples que eu pensei em fazer seria contar as linhas do .txt e passar para o i, porém não sei fazer essa função, eu acabei postando a funcao errada.

a função é essa


void abre(struct reg pessoa[1000]){
int i=5,j,k=0;
FILE *arq;
arq=fopen("dados.txt","r");
printf("%i i<",i);
if(arq == NULL){
printf("Arquivo nao pode ser aberto");
sleep(1000);
}else if(arq != NULL){
while(pessoa[i].nome[0])
i++;
fscanf(arq,"%s %f %i\n", &pessoa[j].nome, &pessoa[j].imc, &k);
for(j=0; j<i; j++)
fscanf(arq,"%s %f\n", &pessoa[j].nome, &pessoa[j].imc);
for(j=0; j<i; j++)
printf("NOME: %s IMC: %f\n",pessoa[j].nome,pessoa[j].imc);
fflush(stdin);

}

Eu preciso que o numero de linhas seja igual a i...

Ageradeco!

Postado
Ola amigo, desculpe não entendi muito bem o que voce sugeriu e tambem ainda nao sei fazer conversão em C.

Vou tentar ser mais especifico.

O programa esta funcionando perfeitamente, porém na hora que eu fecho ele e insiro o comando para reabrir, as variaveis estão vazias, então o i que faz o for roda não roda, eu não sei como fazer esse for rodar o modo mais simples que eu pensei em fazer seria contar as linhas do .txt e passar para o i, porém não sei fazer essa função, eu acabei postando a funcao errada.

a função é essa


void abre(struct reg pessoa[1000]){
int i=5,j,k=0;
FILE *arq;
arq=fopen("dados.txt","r");
printf("%i i<",i);
if(arq == NULL){
printf("Arquivo nao pode ser aberto");
sleep(1000);
}else if(arq != NULL){
while(pessoa[i].nome[0])
i++;
fscanf(arq,"%s %f %i\n", &pessoa[j].nome, &pessoa[j].imc, &k);
for(j=0; j<i; j++)
fscanf(arq,"%s %f\n", &pessoa[j].nome, &pessoa[j].imc);
for(j=0; j<i; j++)
printf("NOME: %s IMC: %f\n",pessoa[j].nome,pessoa[j].imc);
fflush(stdin);

}

Eu preciso que o numero de linhas seja igual a i...

Ageradeco!

desculpa. mas estou a tentar te ajudar;)

fscanf(arq,"%s %f %i\n", &pessoa[j].nome, &pessoa[j].imc, &k);

se bem vi, antes desta linha tu nao inicializas a varaivel j. o que é 1 problema. porque por defeito j nao é 0, mas 1 valor aleatorio que esta na memoria, ou seja lixo.

"Eu preciso que o numero de linhas seja igual a i..."

for(j=0; j<=i; j++)

porque apos o j ser igual a i ainda te mostra o i.

se ainda tiveres problemas, fala. quero ver se te ajudo;)

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!