I'm doing a function that consists of reading elements of a file I wrote and priting them. The problem is, it seems the first number for every line of the text file is being read and printed in a way I don't understand on how it arrived. It's mostly numbers from 90-110 and zeros.
I tried chaging the variable to chars and floats, but neither worked.
void imprimir_tabela(){
FILE *tabela = fopen("tabela.txt", "r");
if(tabela == NULL){
printf("TABELA INVALIDA OU NAO ACHADA");
printf("erro 404");
exit(404);
}
int numero_atomico;
char abreviacao;
char nome[20];
float massa_atomica;
int grupo;
int periodo;
while(!feof(tabela))
{
fscanf(tabela, "%d %s %s %f %d %d", &numero_atomico, &abreviacao, &nome, &massa_atomica, &grupo, &periodo);
printf("%d - %s - %s - Massa atomica: %0.3f - Grupo: %d - Periodo: %d\n", numero_atomico, &abreviacao, &nome, massa_atomica, grupo, periodo);
}
rewind(tabela);
return 0;
Sample lines of the text file
1 H Hidrogenio 1.008 1 1
2 He Helio 4.003 18 1
3 Li Litio 6.941 1 2
See comments in the code below
void imprimir_tabela(){
FILE *tabela = fopen("tabela.txt", "r");
if(tabela == NULL){
printf("TABELA INVALIDA OU NAO ACHADA");
printf("erro 404");
exit(404);
}
int numero_atomico;
char abreviacao;
char nome[20];
float massa_atomica;
int grupo;
int periodo;
do { // Use to be while(!feof(tabela)) - See link in the comments section
{
// 1 H Hidrogenio 1.008 1 1
// For reference
// 1. Prevent buffer over run
// 3. record return value
int ret = fscanf(tabela, "%d %c %19s %f %d %d\n", &numero_atomico, &abreviacao, &nome, &massa_atomica, &grupo, &periodo);
switch (ret) {
case 6: // Ok
printf("%d - %c - %s - Massa atomica: %0.3f - Grupo: %d - Periodo: %d\n", numero_atomico, abreviacao, &nome, massa_atomica, grupo, periodo);
break;
case EOF: // End of file - we are done
break:
default:
// Report error - take some action - in this case exit
fprintf(stderr, "Error in file %s\n", "tabela.txt");
exit(-1);
// Are we done
} while (ret != EOF);
// rewind(tabela); - Not required
// But this is
fclose(tabela);
return 0;
}
And please fix the indentation - I leave that as an exercise to the reader
At least this problem: reading into char
as if it was enough for a string .
char abreviacao;
// vv --- needs more meory than 1 `char`
fscanf(tabela, "%d %s %s %f %d %d",
&numero_atomico, &abreviacao, &nome, &massa_atomica, &grupo, &periodo);
Same problem with printf()
Also
Limit input width of string
check the return value of scanf()
.
int numero_atomico;
//char abreviacao;
char abreviacao[4]; // Some elements need 3 letters.
char nome[20];
float massa_atomica;
int grupo;
int periodo;
// while(!feof(tabela))
while(fscanf(tabela, "%d %3s %19s %f %d %d",
&numero_atomico, abreviacao, nome, &massa_atomica, &grupo, &periodo) == 6) {
printf("%d - %s - %s - Massa atomica: %0.3f - Grupo: %d - Periodo: %d\n",
numero_atomico, &abreviacao, &nome, massa_atomica, grupo, periodo);
}
// rewind(tabela); // not needed
Recommend also to use double massa_atomica
.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.