polska Posted May 20, 2012 at 10:58 AM Report #456930 Posted May 20, 2012 at 10:58 AM (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 May 20, 2012 at 11:01 AM by polska Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.
HappyHippyHippo Posted May 20, 2012 at 11:21 AM Report #456931 Posted May 20, 2012 at 11:21 AM 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 Portugol Plus
polska Posted May 20, 2012 at 11:27 AM Author Report #456932 Posted May 20, 2012 at 11:27 AM 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.
HappyHippyHippo Posted May 20, 2012 at 12:56 PM Report #456943 Posted May 20, 2012 at 12:56 PM sim e mais .. caso o ficheiro exista é como se o "limpasse" IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
polska Posted May 20, 2012 at 01:13 PM Author Report #456947 Posted May 20, 2012 at 01:13 PM 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.
deathseeker25 Posted May 20, 2012 at 01:22 PM Report #456948 Posted May 20, 2012 at 01:22 PM 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.
polska Posted May 20, 2012 at 01:37 PM Author Report #456951 Posted May 20, 2012 at 01:37 PM (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 May 20, 2012 at 01:38 PM by polska 1 Report Corrige um sábio e ele mais sábio ficará. Corrige um ignorante e um inimigo ganharás.
bsccara Posted May 20, 2012 at 04:22 PM Report #456981 Posted May 20, 2012 at 04:22 PM 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. 1 Report
deathseeker25 Posted May 20, 2012 at 08:20 PM Report #457016 Posted May 20, 2012 at 08:20 PM 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.
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now