Como ler um valor do tipo float de um arquivo com C [RESOLVIDO]

1. Como ler um valor do tipo float de um arquivo com C [RESOLVIDO]

João Vitor Rodolfo da Silva
beggarjs

(usa Ubuntu)

Enviado em 13/10/2023 - 13:43h

Olá, estou estudando C e cheguei no conteúdo de arquivos no qual estou tendo um pouco de dificuldade. Tenho o seguinte execício para resolver:

13- Faça um programa que leia um arquivo texto contendo os dados de um aluno. Cada linha do arquivo contém o número de matrícula, o nome e as notas de três provas de um aluno. Os dados devem ser lidos e armazenados em uma estrutura. Em seguida, Exiba os dados lidos em tela.

Estou usando um arquivo com os seguintes dados:

00112233 //Matricula int
jack williams //Nome char
10.0 //
9.5 // Notas float
8.6 //

A matricula e o nome eu até consigo ler normalmente, já os valores das notas não. Já tentei fazer a leitura percorrendo linha a linha do arquivo utilizando a função feof() e o comando de repetição while, e caractere por caractere, porem não funcionou. Se puderem me ajudar a entender onde errei por favor.

#include <stdio.h>
#include <stdlib.h>

struct ST_StudentData{
int Matriculation;
char Name[30];
float TestResults[3];
}Data;

int main(){

FILE *StudentData = fopen("studentdata.txt", "r");
if(StudentData == NULL){
perror("Erro: ");
exit(1);
}

fscanf(StudentData, "%d\n", &Data.Matriculation); //Leio do arquivo
printf("Matrícula: %d\n", Data.Matriculation); //Mostro em tela

fscanf(StudentData, "%s\n", Data.Name); //Leio do arquivo
printf("Nome: %s\n", Data.Name); //Mostro em tela

for(int i = 0; i < 3; i++){
fscanf(StudentData, "%f", &Data.TestResults[i]); //Leio do arquivo
printf("%dº Nota: %.2f\n", (i+1), Data.TestResults[i]); //Mostro em tela
}

fclose(StudentData);
StudentData = NULL;

return 0;
}



  


2. Re: Como ler um valor do tipo float de um arquivo com C

Paulo
paulo1205

(usa Ubuntu)

Enviado em 16/10/2023 - 11:02h

Se o nome contém espaços, não convém usar a conversão %s de scanf() (ou fscanf()).

Com o programa que você mostrou e com o arquivo de entrada que você mostrou, provavelmente a matrícula será lida sem problema, mas o nome será lido como apenas "jack", com "williams" permanecendo como próximo item a ser lido. Como a próxima leitura será de um dado do tipo float, a leitura vai falhar, pois "williams" não pode ser convertido para float por meio da conversão %f.


... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)


3. Re: Como ler um valor do tipo float de um arquivo com C

João Vitor Rodolfo da Silva
beggarjs

(usa Ubuntu)

Enviado em 16/10/2023 - 11:08h

paulo1205 escreveu:

Se o nome contém espaços, não convém usar a conversão %s de scanf() (ou fscanf()).

Com o programa que você mostrou e com o arquivo de entrada que você mostrou, provavelmente a matrícula será lida sem problema, mas o nome será lido como apenas "jack", com "williams" permanecendo como próximo item a ser lido. Como a próxima leitura será de um dado do tipo float, a leitura vai falhar, pois "williams" não pode ser convertido para float por meio da conversão %f.


... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)


Agora faz sentido, muito obrigado!
No lugar de fscanf() vou tentar usar fgets() que pega a string toda.




4. Re: Como ler um valor do tipo float de um arquivo com C [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 17/10/2023 - 05:27h

joaov-rsilva escreveu:

Agora faz sentido, muito obrigado!
No lugar de fscanf() vou tentar usar fgets() que pega a string toda.


É uma boa solução. Porém não é a única solução possível.

De todo modo, convém prestar bastante atenção às regras de funcionamento de fscanf() (e da família de scanf() em geral), sobretudo com relação a conversões que fazem ou que não fazem descarte automático de espaços em branco, e também para forçar o descarte desses espaços. Além disso, é bom sempre testar o valor de retorno da função, para ter certeza de que ela realmente leu o que você gostaria que ela lesse. E pode ser útil também saber quando usar a pseudo-conversão %n.


... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts