Jump to content

Recommended Posts

Posted (edited)

Boas pessoal, iniciei o módulo de tratamento de ficheiros e ocorreu-me um erro na leitura de string:

#include <stdio.h>
#include <stdlib.h>
void main(){
FILE *fp;
char nome[15];
fp=fopen("NOMES.txt","w");
if(fp==NULL)
 printf("ERRO\n");
else{
  printf("SUCESSO\n");
  for(int i=0;i<5;i++){
fgets(nome,sizeof(nome),fp);
fputs(nome,fp);
  }
}
fclose(fp);
system("pause");
}

O programa imprime SUCESSO e acaba, passa pelo fgets mas não me deixa escrever...

O ficheiro é criado e fica assim:

ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌøäÁWÌÌÌÌ’É[œý!ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ

Eu não estou a perceber qual é o erro, eu mudei para fscanf também e deu-me outro erro...

Edited by polska

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Posted

estas a criar um ficheiro e depois queres ler algo do mesmo ficheiro ... sabes que não tens nada no ficheiro certo ?

o que fputs esta a fazer é por o lixo que existe na string nome.

experimenta fazer

memset(nome, 0, sizeof(nome);

logo no início que o lixo ja não vai ser imprimido no ficheiro

IRC : sim, é algo que ainda existe >> #p@p
Posted

estas a criar um ficheiro e depois queres ler algo do mesmo ficheiro ...

Tipo, quando uso o "w", é suposto este criar um ficheiro caso não esteja criado, e depois posso escrever na mesma nele, certo?

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Posted

Então o meu programa é suposto estar correto... Ele só passa á frente é o fgets, não percebo porquê

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Posted

Boas pessoal, iniciei o módulo de tratamento de ficheiros e ocorreu-me um erro na leitura de string:

#include <stdio.h>
#include <stdlib.h>
void main(){
FILE *fp;
char nome[15];
fp=fopen("NOMES.txt","w");
if(fp==NULL)
 printf("ERRO\n");
else{
  printf("SUCESSO\n");
  for(int i=0;i<5;i++){
fgets(nome,sizeof(nome),fp);
fputs(nome,fp);
  }
}
fclose(fp);
system("pause");
}

O programa imprime SUCESSO e acaba, passa pelo fgets mas não me deixa escrever...

O ficheiro é criado e fica assim:

ÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌÌøäÁWÌÌÌÌ’É[œý!ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ

Eu não estou a perceber qual é o erro, eu mudei para fscanf também e deu-me outro erro...

Estou um pouco confuso em relação ao teu post polska. Ok, compreendo que queres fazer um modulo de tratamento de ficheiros, mas este código que mostraste não esta a fazer muito sentido, porque:

1 - Se queres escrever coisas num ficheiro, faz uma função para escrever ficheiro. Faz outra para ler do ficheiro. Não mistures as duas coisas num main, fica uma confusão enorme.

2 - Relativamente ao código em si, alguns detalhes:

char nome[15];

Ok, declaraste o nome como sendo do tipo char com capacidade para 16 caracteres, sendo que 15 serão escritos com o nome e um com o '/0' final.

for(int i=0;i<5;i++){
    fgets(nome,sizeof(nome),fp);
    fputs(nome,fp);
  }

Isto e que e totalmente confuso. Tu estas a ler 5 linhas do ficheiro com o fgets(nome, sizeof(nome), fp) de um ficheiro que foi aberto no fopen como "w". Não esta a fazer sentido. Se queres ler de um ficheiro, em primeiro lugar tens de abrir o ficheiro como "r" e certificar-te que ha la conteúdo, para facilitar ate a tua compreensão.

Para alem disso, estas a carregar a variável nome (uma vez que não fazes uma validação para o fgets, neste caso) com lixo. Isto porque a variavel não e inicializada com nenhum valor, não ha input nenhum para a variável e ainda foste ler do ficheiro para essa variável quando nada existia no ficheiro. Carregou com 16 caracteres de lixo.

Ok, resolução porque parece-me que estas confuso com o que e suposto isto fazer (e alguns conselhos de boas praticas que te fazem evitar horas a procura de erros):

1 - Divide o que queres fazer no main em funções. Organizas a tua compreensão, o teu código e evitas cometer erros destes.

2 - Inicializa sempre as variáveis que crias (nem que seja a NULL ou com ' ').

3 - Quando usas uma função de uma biblioteca qualquer, lê a documentação dessa função. Ha muitas que tem valor de retorno da mesma e que te permitem verificar se os resultados são os que queres ainda no código, sem as testares. E importante fazer isto, porque nem todos os erros no C são 100% explícitos e acredita que podes perder horas a procura da correcçao de alguns.

Posted (edited)

Estou um pouco confuso em relação ao teu post polska. Ok, compreendo que queres fazer um modulo de tratamento de ficheiros, mas este código que mostraste não esta a fazer muito sentido, porque:

1 - Se queres escrever coisas num ficheiro, faz uma função para escrever ficheiro. Faz outra para ler do ficheiro. Não mistures as duas coisas num main, fica uma confusão enorme.

2 - Relativamente ao código em si, alguns detalhes:

char nome[15];

Ok, declaraste o nome como sendo do tipo char com capacidade para 16 caracteres, sendo que 15 serão escritos com o nome e um com o '/0' final.

for(int i=0;i<5;i++){
	fgets(nome,sizeof(nome),fp);
	fputs(nome,fp);
  }

Isto e que e totalmente confuso. Tu estas a ler 5 linhas do ficheiro com o fgets(nome, sizeof(nome), fp) de um ficheiro que foi aberto no fopen como "w". Não esta a fazer sentido. Se queres ler de um ficheiro, em primeiro lugar tens de abrir o ficheiro como "r" e certificar-te que ha la conteúdo, para facilitar ate a tua compreensão.

Para alem disso, estas a carregar a variável nome (uma vez que não fazes uma validação para o fgets, neste caso) com lixo. Isto porque a variavel não e inicializada com nenhum valor, não ha input nenhum para a variável e ainda foste ler do ficheiro para essa variável quando nada existia no ficheiro. Carregou com 16 caracteres de lixo.

Ok, resolução porque parece-me que estas confuso com o que e suposto isto fazer (e alguns conselhos de boas praticas que te fazem evitar horas a procura de erros):

1 - Divide o que queres fazer no main em funções. Organizas a tua compreensão, o teu código e evitas cometer erros destes.

2 - Inicializa sempre as variáveis que crias (nem que seja a NULL ou com ' ').

3 - Quando usas uma função de uma biblioteca qualquer, lê a documentação dessa função. Ha muitas que tem valor de retorno da mesma e que te permitem verificar se os resultados são os que queres ainda no código, sem as testares. E importante fazer isto, porque nem todos os erros no C são 100% explícitos e acredita que podes perder horas a procura da correcçao de alguns.

Eu já percebi, eu estava a criar confusão, o que eu queria fazer era ler 5 nomes e escreve-los no ficheiro... E eu estava a ler a variável nome com fgets em vez e simplesmente usar o gets ou scanf... Esqueci-me que o fgets lê mas é do ficheiro mesmo, estava a confundir.. Isto é fruto de não fazer os exercícios mal a stora explique a matéria, quando demos isto eu tive a treinar para os concursos e fui atrasando a matéria ficheiros, mas pronto, já percebi agora, foi só confusão 😛

for(i=0;i<5;i++){
   gets(nome);
   fputs(nome,fp);
  }

Obrigado 👍

Edited by polska
  • Vote 1

Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.

Posted

char nome[15];

Ok, declaraste o nome como sendo do tipo char com capacidade para 16 caracteres, sendo que 15 serão escritos com o nome e um com o '/0' final.

Atenção que o array é definido como tendo espaço para 15 caracteres e não 16, sendo válidos índices de 0 a 14. Para receber uma string terminada a zero (normalmente designada por ASCIIZ) com 15 caracteres o array teria de ser declarado como 'char nome[16]'. Falhas nestas declarações criam erros muito complicados de encontrar pois podem alterar o valor de outras variáveis, aparentemente sem motivo.

  • Vote 1
Posted

Atenção que o array é definido como tendo espaço para 15 caracteres e não 16, sendo válidos índices de 0 a 14. Para receber uma string terminada a zero (normalmente designada por ASCIIZ) com 15 caracteres o array teria de ser declarado como 'char nome[16]'. Falhas nestas declarações criam erros muito complicados de encontrar pois podem alterar o valor de outras variáveis, aparentemente sem motivo.

Tens toda a razão, erro meu. Eu recentemente tive um problema num projecto por causa de um erro semelhante. E sim, torna-se muito complicado corrigir este tipo de erros, demorou-me umas horas e uma montanha de pedidos de opiniões a colegas meus da faculdade.

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
×
×
  • 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.