1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Carregar dados de um ficheiro - C

Discussão em 'Programação' iniciada por ugo_asus, 5 de Junho de 2008. (Respostas: 11; Visualizações: 2808)

  1. ugo_asus

    ugo_asus Power Member

    Boas,

    Estou aqui com um problema a carregar dados de um txt para uma lista ligada...

    Será que alguem me podia dar um exemplo genérico para fazer isso?

    Gravar consigo...agora carregar dados tá mais complicado....

    Cumps
     
    Última edição: 12 de Junho de 2008
  2. Quaker

    Quaker Power Member

    Posta o código do carregar dados para lista....
     
  3. countzero

    countzero Power Member

    Olá,

    Código:
    using System.Collections.Generic;
    using System.IO;
    
    (...)
    
    // Lista com strings
    List<String> umaListaQualquer = new List<String>();
    StreamReader s = File.OpenText("C:\\ficheiro.txt");
    string elemento = null;
    
    // Assumindo que cada elemento a carregar está numa linha individual
    while ((elemento = s.ReadLine()) != null)
    {
        umaListaQualquer.Add(elemento); 
    }
    s.Close();
    
    (...)
    Cumps,
    JP
     
  4. Quaker

    Quaker Power Member

    boas eu testei o teu código e funciona perfeitamente...
    O único problema foi que não apresentava os caracteres especiais tipo Ç.
    O streamreader por defeito lê caracteres us-Us apesar da cultura do meu computador estar em pt-PT.
    Primeiro testei se ele representava o Ç como representou, significava que o streamreader estava a a converter as strings para outro enconding... foi só mudar o enconding para o iso-8859-1 que representa as línguas ocidentais.

    Código:
    // Lista com strings
                List<String> umaListaQualquer = new List<String>();
    
                StreamReader s = new StreamReader("C:\\ficheiro.txt",Encoding.GetEncoding("iso-8859-1"));
    
                string elemento = null;
                
                // Assumindo que cada elemento a carregar está numa linha individual
                while ((elemento = s.ReadLine()) != null)
                {
                    umaListaQualquer.Add(elemento); 
                }
                s.Close();
    
                Console.ReadKey();
    
    Este foi o único problema que encontrei.... Sê um pouco mais descritivo do problema... assim não é fácil... Bom Trabalho
     
    Última edição: 7 de Junho de 2008
  5. countzero

    countzero Power Member

    Olá,

    não sei se te estás a referir ao código que coloquei mais acima; a ideia era ajudar o ugo_asus resolver o problema dele :)

    Cumps,
    JP
     
  6. Quaker

    Quaker Power Member

    Lol. Peço desculpa não percebi que o código não era dele...
     
  7. ugo_asus

    ugo_asus Power Member

    Erro meu..lol...procurava ajuda para C e não para C#...pura distracção...sorry

    Se não é pedir muito...façam a mesma coisa para C sff..:007:

    cumps
     
  8. Quaker

    Quaker Power Member

    e que tal tentares tu fazer alguma coisa e depois fazeres o post? e nós ajudamos-te?
    A primeira coisa que deves fazer é saber se vais guardar os dados em ficheiros binários ou de texto...
    Faz lá alguma coisinha... anda lá.... :D
     
  9. ugo_asus

    ugo_asus Power Member

    Já consigo carregar ..mas só dá os dados da primeira pessoa (ja tentei fazer um ciclo..mas nao consegui)...

    Guardei em texto pq não sei como se faz em binario...

    o ficheiro.txt está disposto assim:

    jose
    lisboa
    123465
    antonio
    porto
    654468
    maria
    coimbra
    543435
    ...

    Código:
    Lista* carrega(Lista* primeiro)
    {
        
        FILE *fp1;
        Lista *atual= primeiro;
        Lista pessoa;
        char nome[200];
        char morada[200];
        char telefone_str[200];
        
        
        fp1 = fopen("ficheiro.txt","r");
    
        
        
        fgets(nome,200,fp1);
        strcpy(pessoa.nome, nome);
        fgets(morada,200,fp1);
        strcpy(pessoa.morada, morada);
        fgets(telefone_str,200,fp1);
        pessoa.telefone = atoi(telefone_str);
        
        
        
        
        Lista* NovoRegisto=(Lista*) malloc (sizeof(Lista)); 
        strcpy(NovoRegisto->nome, pessoa.nome);
        strcpy(NovoRegisto->morada, pessoa.morada);
        NovoRegisto->telefone= pessoa.telefone;
        NovoRegisto->prox = atual;
     
        
        return NovoRegisto;
        
        
        fclose(fp1);
    }
    Ajudem-me lá a fazer isto...please...
     
  10. Rui_Carlos

    Rui_Carlos 1st Folding then Sex

    Qual é a ideia de copiar os dados para pessoa, e depois andar a copiá-los outra vez para NovoRegisto?

    Era capaz de ser boa ideia separar a parte que lê o ficheiro, da parte que insere os dados na lista. Ficava mais fácil de fazer o ciclo depois...
     
  11. countzero

    countzero Power Member

    Olá.

    Estás com sorte, tinha aqui algum código de outro projecto e adaptei a coisa rápido :)

    Código:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <errno.h>
    
    #define MAXSIZE 200
    
    #define NOME 0
    #define MORADA 1
    #define TELEFONE 2
    
    struct pessoa_t {
      char *nome;
      char *morada;
      unsigned int telefone;
      struct pessoa_t *seguinte;
    };
    
    struct lista_t {
      struct pessoa_t *inicio;
      struct pessoa_t *fim;
    };
    
    struct lista_t *pessoas;
    
    void insere_elemento(char *nome, char *morada, unsigned int telefone,
                         struct lista_t *lista)
    {
      struct pessoa_t *tmp;
    
      if ((tmp = (struct pessoa_t *) malloc(sizeof(struct pessoa_t))) == NULL)
        perror("Erro ao inserir elemento");
    
      memset(tmp, 0, sizeof(struct pessoa_t));
      tmp->nome = nome;
      tmp->morada = morada;
      tmp->telefone = telefone;
    
      if (lista->inicio == NULL)
        lista->inicio = lista->fim = tmp;
      else {
        lista->fim->seguinte = tmp;
        lista->fim = tmp;
      }
    
      return;
    }
    
    void imprime_lista(struct lista_t *lista)
    {
      struct pessoa_t *aux;
    
      printf("Nome\t\t\tMorada\t\t\tTelefone\n");
    
      for (aux = lista->inicio; aux != NULL; aux = aux->seguinte)
        printf("%s\t\t\t%s\t\t\t%u\n", aux->nome, aux->morada, aux->telefone);
    
      return;
    }
    
    int main(int argc, char *argv[])
    {
      FILE *fp1;
      unsigned int i, telefone;
      char *nome, *morada, buffer[MAXSIZE + 1];
    
      if ((fp1 = fopen("ficheiro.txt", "r")) == NULL) {
        perror("Erro ao abrir o ficheiro");
        return 1;
      }
    
      pessoas = (struct lista_t *) malloc(sizeof(struct lista_t));
      memset(pessoas, 0, sizeof(struct lista_t));
    
      for (i = NOME; fgets(buffer, MAXSIZE, fp1) != NULL; i++) {
        switch (i % 3) {
        case NOME:
          nome = strdup(buffer);
          /* Remover '\n' */
          nome[strlen(nome) - 1] = '\0';
          break;
        case MORADA:
          morada = strdup(buffer);
          morada[strlen(morada) - 1] = '\0';
          break;
        case TELEFONE:
          telefone = atoi(buffer);
          insere_elemento(nome, morada, telefone, pessoas);
          break;
        default:
          fprintf(stderr, "Erro no parsing.\n");
          return 1;
        }
      }
    
      fclose(fp1);
    
      imprime_lista(pessoas);
    
      return 0;
    }
    
    Cumps,
    JP
     
  12. ugo_asus

    ugo_asus Power Member

    obrigadissimo...vou tentar...

    Depois já digo qualquer coisa...
     

Partilhar esta Página