Ajuda C [RESOLVIDO]

1. Ajuda C [RESOLVIDO]

Bell Coutinho
BellCoutinho

(usa Arch Linux)

Enviado em 11/11/2018 - 11:36h

Pessoal, quando eu leio o arquivo, o ultimo elemento é lido duas vezes, qual é o meu erro?


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

typedef struct _login {
char name[100];
char password[16];
} Login;

void show_file(FILE *);

int main(int argc, char *argv[]) {
FILE *fp;
Login system_user;
Login aux;

if ((fp = fopen("Files/password.txt", "a+b")) == NULL) {
fprintf(stderr, "Arquivo não pode ser aberto");
exit(EXIT_FAILURE);
}

printf("Digite o seu nome: ");
fflush(stdin);
fgets(system_user.name, 100, stdin);

printf("Digite sua senha: ");
fflush(stdin);
fgets(system_user.password, 16, stdin);

fwrite(&system_user, sizeof(Login), 1, fp);
rewind(fp);
show_file(fp);

fclose(fp);

exit(EXIT_SUCCESS);
}

void show_file(FILE *fp)
{
Login aux;
while (1) {
fread(&aux, sizeof(Login), 1, fp);
puts(aux.name);
puts(aux.password);
if (feof(fp)) {
break;
}
}
}


Desde já obrigado.


  


2. MELHOR RESPOSTA

Uilian Ries
uilianries

(usa Linux Mint)

Enviado em 11/11/2018 - 12:43h

é por causa do feof

feof valida o EOF do arquivo (ver man feof) e não o stream do arquivo.
Quem está trabalhando sobre o stream neste caso é o fread, que quando tenta ler pela segunda vez, verifica que chegou ao final e somente após marca o EOF. Como o aux está bufferizado, ele é impresso duas vezes.

Você poderia usar algo como:


while(fread(&aux, sizeof(Login), 1, fp) != 0) {
puts(aux.name);
puts(aux.password);
}


Esta não é a melhor maneira, pois não está validando o caso de erro, mas resolve o seu problema.

3. Re: Ajuda C [RESOLVIDO]

Bell Coutinho
BellCoutinho

(usa Arch Linux)

Enviado em 11/11/2018 - 13:40h

uilianries escreveu:

é por causa do feof

feof valida o EOF do arquivo (ver man feof) e não o stream do arquivo.
Quem está trabalhando sobre o stream neste caso é o fread, que quando tenta ler pela segunda vez, verifica que chegou ao final e somente após marca o EOF. Como o aux está bufferizado, ele é impresso duas vezes.

Você poderia usar algo como:


while(fread(&aux, sizeof(Login), 1, fp) != 0) {
puts(aux.name);
puts(aux.password);
}


Esta não é a melhor maneira, pois não está validando o caso de erro, mas resolve o seu problema.



Obrigado. ^^






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts