Jump to content

problema a apresentar o que está num ficheiro... como meter varias palavras a contar como uma?


rubenndf91
 Share

Recommended Posts

boas.

eu já consegui fazer o meu programa todo(agenda electronica) mas estou com um problema na leitura de ficheiros.

eu introduzo

-nome

-morada

-codigo postal

-etc

guardo no ficheiro e fecho o programa...tudo certinho até aqui.

quando corro o programa novamente e abro o ficheiro para ler e imprimir no monitor ele dá-me problemas...

o nome aparece certo

a morada(varias palavras) aparece assim:

morada: 1ªpalavra

(depois viria o codigo postal mas em vez disso vem a 2ª palavra da morada)

codigo postal: 2ª palavra da morada

e por ai fora

o codigo postal acontece o mesmo...quando imprimo no monitor

aparece codigo postal 0000

depois noutro topico:-000

quando deveria aparecer 0000-000

como resolvo isto?

void abrir(dados *contacto)
{
FILE *f;
char nome[100], email[50], morada[100], postal[20], numero[20];
int telefone, FP, SD, AM1, ALGA, CM;
//printf("insira o caminho do ficheiro\n");
//scanf("%s", &nfich);
f = fopen("teste.txt", "r");
if (f == NULL)
{
 printf("erro ao abrir ficheiros");
}
else
{
 while (!feof(f))
 {
  fscanf(f, " %s %s %s %s %s %d %d %d %d %d %d", nome, numero, morada, postal, email, &telefone, &FP, &AM1, &SD, &ALGA, &CM);
  strcpy(contacto[i].nome, nome);
  strcpy(contacto[i].numero, numero);
  strcpy(contacto[i].morada, morada);
  strcpy(contacto[i].postal, postal);
  strcpy(contacto[i].email, email);
  contacto[i].telefone = telefone;
  contacto[i].FP = FP;
  contacto[i].AM1 = AM1;
  contacto[i].SD = SD;
  contacto[i].ALGA = ALGA;
  contacto[i].CM = CM;
  i++;
 }
 fclose(f);
}
}
void guardar(dados *contacto)
{
FILE *f;
char nfich[20];
int j = 0;
//printf("Insira a localizacao do ficheiro\n");
//scanf_s(" %s", &nfich);
f = fopen("teste.txt", "a");

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

 fprintf(f, "%s", contacto[j].nome);
 fflush(stdin);
 fprintf(f, "%s ", contacto[j].numero);
 fflush(stdin);
 fprintf(f, "%s ", contacto[j].morada);
 fflush(stdin);
 fprintf(f, "%s ", contacto[j].postal);
 fflush(stdin);
 fprintf(f, "%s ", contacto[j].email);
 fflush(stdin);
 fprintf(f, "%d ", contacto[j].telefone);
 fflush(stdin);
 fprintf(f, "%d ", contacto[j].FP);
 fflush(stdin);
 fprintf(f, "%d ", contacto[j].AM1);
 fflush(stdin);
 fprintf(f, "%d ", contacto[j].SD);
 fflush(stdin);
 fprintf(f, "%d ", contacto[j].ALGA);
 fflush(stdin);
 fprintf(f, "%d ", contacto[j].CM);
 fflush(stdin);
}

printf("Dados guardados com suscesso!!! \n");
fclose(f);
}
void mostrar(dados* contacto)
{
int j = 0;
printf("\t\t  Mostar dados\n\n");
fflush(stdin);
for (j = 0; j<i; j++)
{
 printf("\t%d->   \n\tNome:  %s |", j + 1, contacto[j].nome);
 fflush(stdin);
 printf(" \n\tNumero de Aluno ISEL: %s |", contacto[j].numero);
 fflush(stdin);
 printf(" \n\tMorada: %s |", contacto[j].morada);
 fflush(stdin);
 printf(" \n\tCodigo Postal: %s |", contacto[j].postal);
 fflush(stdin);
 printf(" \n\tE-Mail: %s |", contacto[j].email);
 fflush(stdin);
 printf(" \n\tNumero de telefone: %d |", contacto[j].telefone);
 fflush(stdin);
 printf(" \n\tNota final de FP: %d |", contacto[j].FP);
 fflush(stdin);
 printf(" \n\tNota final de AM1: %d |", contacto[j].AM1);
 fflush(stdin);
 printf(" \n\tNota final de SD: %d |", contacto[j].SD);
 fflush(stdin);
 printf(" \n\tNota final de ALGA: %d |", contacto[j].ALGA);
 fflush(stdin);
 printf(" \n\tNota final de CM: %d\t\n\n\n |", contacto[j].CM);
 fflush(stdin);
}
}

eu meti aquilo que interfere nesta parte do programa

Edited by thoga31
GeSHi
Link to comment
Share on other sites

o teu problema é : o *scanf lê até encontrar o primeiro caracter não alfanumérico ou o fim do texto.

por exemplo:

fprintf(fd, "%s", "happy hippy hippo"); // <--- output : "happy hippy hippo" (3 palavras)
// ...
fscanf(fd, "%s", string); // <--- input "happy hippy hippo" >> resulta somente em : "happy" !!! (1 palavra)

conclusão : nunca poderás fazer da maneira como tens actualmente.

o melhor é fazeres algo deste género:

fprintf("%s\n", "happy hippy hippo"); // <--- output : "happy hippy hippo\n" (3 palavras)
// ...
fgets(buffer, tamanho_do_buffer, fd); // <--- input "happy hippy hippo\n" >> resulta em : "happy hippy hippo\n"

ps : o truque está no caracter '\n' que podes depois remover da string lida

IRC : sim, é algo que ainda existe >> #p@p
Link to comment
Share on other sites

então nestes menus tenho de fazer que troca?

no 1º é para introduzir os dados...o 2º é para os guardar

ah e os fflush posso tira-los todos? meto outra coisa?

void f_adicionar(dados* contacto)
{
if (i<total)
{
printf("\nIntroduza o Nome: ", i + 1);
fflush(stdin);
scanf(" %[^\n]s", contacto[i].nome);
printf("Introduza o Numero de Aluno ISEL: ", i + 1);
fflush(stdin);
scanf(" %s", &contacto[i].numero);
printf("Introduza a Morada: ", i + 1);
fflush(stdin);
scanf(" %[^\n]s", contacto[i].morada);
printf("Introduza o Codigo Postal: ", i + 1);
fflush(stdin);
scanf(" %[^\n]s", contacto[i].postal);
printf("Introduza o email: ", i + 1);
fflush(stdin);
scanf(" %[^\n]s", contacto[i].email);
printf("Introduza o telefone: ", i + 1);
fflush(stdin);
scanf(" %d", &contacto[i].telefone);
printf("Nota Final de FP: ", i + 1);
fflush(stdin);
scanf(" %d", &contacto[i].FP);
printf("Nota Final de AM1: ", i + 1);
fflush(stdin);
scanf(" %d", &contacto[i].AM1);
printf("Nota Final de SD: ", i + 1);
fflush(stdin);
scanf(" %d", &contacto[i].SD);
printf("Nota Final de ALGA: ", i + 1);
fflush(stdin);
scanf(" %d", &contacto[i].ALGA);
printf("Nota Final de CM: ", i + 1);
fflush(stdin);
scanf(" %d\n\n\n", &contacto[i].CM);
i++;
}
else
{
printf("a lista esta cheia");
}
guardar(contacto);
}

void guardar(dados *contacto)
{
FILE *f;
//char nfich[20];
int j = 0;
//printf("insira o caminho do ficheiro\n");
//scanf("%s", &nfich);
f = fopen("teste.txt", "a");

for (j = 0; j<i; j++)
{
fprintf(f, "\n%s ", contacto[j].nome);
fflush(stdin);
fprintf(f, " %s ", contacto[j].numero);
fflush(stdin);
fprintf(f, " %s ", contacto[j].morada);
fflush(stdin);
fprintf(f, " %s ", contacto[j].postal);
fflush(stdin);
fprintf(f, " %s ", contacto[j].email);
fflush(stdin);
fprintf(f, " %d ", contacto[j].telefone);
fflush(stdin);
fprintf(f, " %d ", contacto[j].FP);
fflush(stdin);
fprintf(f, " %d ", contacto[j].AM1);
fflush(stdin);
fprintf(f, " %d ", contacto[j].SD);
fflush(stdin);
fprintf(f, " %d ", contacto[j].ALGA);
fflush(stdin);
fprintf(f, " %d ", contacto[j].CM);
fflush(stdin);
}

printf("Dados guardados com suscesso!!! \n");
fclose(f);
}
Edited by thoga31
GeSHi
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.