Ir para conteúdo
Fórum Script Brasil
  • 0

ajuda Arquivo em c...


erickstryck

Pergunta

Pessoal estou com um problema que não consigo resolver e queria uma ajuda, esse código que criei armazena nome e telefone em um arquivo, mais quando complilo e rodo o .exe ele apenas armazena o nome correto o numero de telefone não armazena corretamente:

#include <stdio.h>
    #include <stdlib.h>
    struct regis
    {
            char nome[20];
            int telefone;
    };
    
    int main(int argc, char *argv[])
    {
        struct regis reg;
      int sa=0,cond;
      FILE *registro;
      while(sa==0)
      {
       printf("digite 1 para cadastrar 2 para visualizar e 3 para sair:\n");
       scanf("%d",&cond);
       system("cls");
       switch(cond)
       {
          case 1:         
          registro=fopen("registro.txt","w+b");
          printf("entre com seu nome:\n");
          scanf("%s",& reg.nome);
          printf("entre com o numero de telefone: \n");
          scanf("%d", & reg.telefone);
          fseek(registro,1 * sizeof(reg.nome),SEEK_SET);
          fwrite(& reg.nome,sizeof(reg.nome),1,registro);
          fseek(registro,2,SEEK_CUR);
          fwrite(& reg.telefone,sizeof(reg.telefone),1,registro);
          fclose(registro);
          printf("digite 3 para sair ou 0 para voltar ao menu: \n");
          scanf("%d",&sa);
          system("cls");
          break;
          case 2:
          registro=fopen("registro.txt","rb");
          fseek(registro,1 * sizeof(reg.nome),SEEK_SET);
          fread(& reg.nome,sizeof(reg.nome),1,registro);
          printf("%s\n",& reg.nome);
          fseek(registro,1,SEEK_CUR);
          fread(&reg.telefone,sizeof(reg.telefone),1,registro);
          printf("%d\n",& reg.telefone);
          printf("digite 3 para sair ou 0 para voltar ao menu: \n");
          scanf("%d",&sa);
          system("cls");
          break; 
       }
     }
      return 0;
    }

agradeço desde já a ajuda!

Editado por erickstryck
Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 0

Boa tarde!

Existem alguns problemas na sua lógica.

Primeiro, o fseek está incorreto. Ao usar o SEEK_SET, você define o deslocamento em bytes do começo do arquivo. Já no SEEK_CUR, o avanço é relativo à posição atual. Assim, no código abaixo:

fseek(registro,1 * sizeof(reg.nome),SEEK_SET);
fwrite(& reg.nome,sizeof(reg.nome),1,registro);
fseek(registro,2,SEEK_CUR);
fwrite(& reg.telefone,sizeof(reg.telefone),1,registro);
Primeiro você avança o tamanho do campo nome. Mas como no início do arquivo não tinha nada gravado então ficou um espaço não utilizado. Além disso, você avança 2 bytes para gravar o telefone mas, quando você lê o telefone do arquivo, o avanço é de apenas 1 byte, fazendo com que o telefone seja lido de uma posição diferente daquela em que ele foi gravado. Outra coisa: para usar o scanf com a variável nome, use apenas assim:
scanf("%s",reg.nome);
ou então assim:
scanf("%s",&reg.nome[0]);
Aquele & não deve ser usado com o nome do vetor pois, quando ele não tem índice, o seu nome já aponta para seu conteúdo. Apenas use o & se tiver colocado o índice junto ao nome do vetor, como no segundo exemplo. O mesmo serve para o printf! Agora a solução: para gravar os dados de uma estrutura, o mais simples é gravar toda a estrutura. E não se preocupe com o fseek. Sempre que você realiza uma leitura ou escrita, o ponteiro já é deslocado então basta ler ou gravar o próximo dado. E no caso da função para cadastrar, apenas abra o arquivo para adicionar novos dados ao invés de uma gravação apenas. Assim você adiciona novos dados sem perder os que já foram gravados! Veja o seu código abaixo com as minhas modificações. A opção de cadastrar adiciona um novo registro e a função de listar exibe todos os que já foram gravados:
#include <stdio.h>
    #include <stdlib.h>
    struct regis
    {
            char nome[20];
            int telefone;
    };
    
    int main(int argc, char *argv[])
    {
        struct regis reg;
      int sa=0,cond;
      FILE *registro;
      while(sa==0)
      {
       printf("digite 1 para cadastrar 2 para visualizar e 3 para sair:\n");
       scanf("%d",&cond);
       system("cls");
       switch(cond)
       {
          case 1:        
          registro=fopen("registro.txt","a+b");
          printf("entre com seu nome:\n");
          scanf("%s",reg.nome);
          printf("entre com o numero de telefone: \n");
          scanf("%d", & reg.telefone);
          fwrite(& reg,sizeof(struct regis),1,registro);
          fclose(registro);
          printf("digite 3 para sair ou 0 para voltar ao menu: \n");
          scanf("%d",&sa);
          system("cls");
          break;
          case 2:
          registro=fopen("registro.txt","rb");
          while(fread(& reg,sizeof(struct regis),1,registro) > 0) {
              printf("%s\n",reg.nome);
              printf("%d\n",reg.telefone);
          }
          fclose(registro);
          printf("digite 3 para sair ou 0 para voltar ao menu: \n");
          scanf("%d",&sa);
          system("cls");
          break;
       }
     }
      return 0;
    }

Qualquer dúvida avise que eu explico! :)

Abraços,

Marcelo Utikawa da Fonseca

Link para o comentário
Compartilhar em outros sites

  • 0
Boa tarde!

Existem alguns problemas na sua lógica.

Primeiro, o fseek está incorreto. Ao usar o SEEK_SET, você define o deslocamento em bytes do começo do arquivo. Já no SEEK_CUR, o avanço é relativo à posição atual. Assim, no código abaixo:

fseek(registro,1 * sizeof(reg.nome),SEEK_SET);
fwrite(& reg.nome,sizeof(reg.nome),1,registro);
fseek(registro,2,SEEK_CUR);
fwrite(& reg.telefone,sizeof(reg.telefone),1,registro);
Primeiro você avança o tamanho do campo nome. Mas como no início do arquivo não tinha nada gravado então ficou um espaço não utilizado. Além disso, você avança 2 bytes para gravar o telefone mas, quando você lê o telefone do arquivo, o avanço é de apenas 1 byte, fazendo com que o telefone seja lido de uma posição diferente daquela em que ele foi gravado. Outra coisa: para usar o scanf com a variável nome, use apenas assim:
scanf("%s",reg.nome);
ou então assim:
scanf("%s",&reg.nome[0]);
Aquele & não deve ser usado com o nome do vetor pois, quando ele não tem índice, o seu nome já aponta para seu conteúdo. Apenas use o & se tiver colocado o índice junto ao nome do vetor, como no segundo exemplo. O mesmo serve para o printf! Agora a solução: para gravar os dados de uma estrutura, o mais simples é gravar toda a estrutura. E não se preocupe com o fseek. Sempre que você realiza uma leitura ou escrita, o ponteiro já é deslocado então basta ler ou gravar o próximo dado. E no caso da função para cadastrar, apenas abra o arquivo para adicionar novos dados ao invés de uma gravação apenas. Assim você adiciona novos dados sem perder os que já foram gravados! Veja o seu código abaixo com as minhas modificações. A opção de cadastrar adiciona um novo registro e a função de listar exibe todos os que já foram gravados:
#include <stdio.h>
    #include <stdlib.h>
    struct regis
    {
            char nome[20];
            int telefone;
    };
    
    int main(int argc, char *argv[])
    {
        struct regis reg;
      int sa=0,cond;
      FILE *registro;
      while(sa==0)
      {
       printf("digite 1 para cadastrar 2 para visualizar e 3 para sair:\n");
       scanf("%d",&cond);
       system("cls");
       switch(cond)
       {
          case 1:        
          registro=fopen("registro.txt","a+b");
          printf("entre com seu nome:\n");
          scanf("%s",reg.nome);
          printf("entre com o numero de telefone: \n");
          scanf("%d", & reg.telefone);
          fwrite(& reg,sizeof(struct regis),1,registro);
          fclose(registro);
          printf("digite 3 para sair ou 0 para voltar ao menu: \n");
          scanf("%d",&sa);
          system("cls");
          break;
          case 2:
          registro=fopen("registro.txt","rb");
          while(fread(& reg,sizeof(struct regis),1,registro) > 0) {
              printf("%s\n",reg.nome);
              printf("%d\n",reg.telefone);
          }
          fclose(registro);
          printf("digite 3 para sair ou 0 para voltar ao menu: \n");
          scanf("%d",&sa);
          system("cls");
          break;
       }
     }
      return 0;
    }

Qualquer dúvida avise que eu explico! :)

Abraços,

Marcelo Utikawa da Fonseca

Muito obrigado estava precisando de um esclarecimento como esse em seeks estava um pouco perdido nessa parte mais agora consigo entender, valeu por ter me ajudado ótima tarde para você! :rolleyes:

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...