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

Ler ficheiros C

Discussão em 'Programação' iniciada por Innight, 8 de Junho de 2009. (Respostas: 6; Visualizações: 1995)

  1. Innight

    Innight Power Member

    Boas pessoal.como eu fazo leitura de um ficheiro .data em C?
    eu quando abro o .data com o notepad aparece ff"  ld"  fg"  .

    Nao consigo o abrir em C como se fosse um notepad,mas o C consegue entender como se fosse palavras normais. Alguem sabe codigo de uma estretura para ler ficheiros binarios?
    .
    Cumprimentos
     
  2. blackburn69

    blackburn69 Power Member

    Boas. Não sei se percebi muito bem, mas se conheceres a estrutura do ficheiro .data, podes ler os seus dados (e saber o que significam) em C abrindo-o em modo de leitura e binário.
    Código:
    FILE *fp;
    
    fp = fopen("ficheiro.data", "rb");
    
    Se não conheceres a estrutura do ficheiro, podes lê-lo na mesma mas és capaz de não perceber muito. :)
     
  3. Innight

    Innight Power Member

    mas com essa linha nao consigo fazer um output para o ecran do que tenho no meu notepad?
     
  4. blackburn69

    blackburn69 Power Member

    Ainda não consegui perceber o que é que pretendes, mas pronto. Depois de abrires o ficheiro com o fopen, podes usar por exemplo o fgets e depois um printf para então ler o que está no ficheiro e mostrar. Isto é apenas um exemplo. Tens inúmeras funções em C que trabalham sobre ficheiros.
    Aconselho-te leres um livro ou pesquisares um bocado para encontrares aquilo que pretendes.
     
  5. Innight

    Innight Power Member

    Código:
    #include <stdio.h>
    #include <stdlib.h>
    
    struct tagCursoFile
    {
     char nome; 
     char descricao;
     int ciclo;
    };
    
    struct tagCursoMem
    {
     char nome; 
     char descricao;
     int ciclo;
    struct tagCursoMem* pNext;
    };
    
    int MainMenu();
    void AddToHead(struct tagCursoMem** pAuxHead, struct tagCursoMem* pAuxNew);
    //struct tagCursoMem* ProcMaisVelho(struct tagCursoMem* pAux);
    void GravarFile(int nSatus, struct tagCursoMem* pAux);
    void lerdados(struct tagCursoMem* pAux,struct tagCursoMem* pAuxNew);
    int main()
    {
    int opc, nAlterado = 0, nCntAlunos = 0;
    FILE* pFile;
    struct tagCursoFile cursoFile;
    struct tagCursoMem* pHead = NULL;
    struct tagCursoMem* pNew, *pAux;
    if((pFile = fopen("alunos.data", "rb")) != NULL) {
    while(fread(&cursoFile, sizeof(struct tagCursoFile), 1, pFile) != 0) {
    pNew = (struct tagCursoMem*)malloc(sizeof(struct tagCursoMem));
    pNew->pNext = NULL;
    pNew->nome = cursoFile.nome;
    pNew->descricao = cursoFile.descricao;
    pNew->ciclo = cursoFile.ciclo;
    AddToHead(&pHead, pNew);
    nCntAlunos++;
    }
    printf("Foram lidos %d registos", nCntAlunos);
    fclose(pFile);
    }
    do {
    opc = MainMenu();
    switch(opc) {
    case 1:
    pNew = (struct tagCursoMem*)malloc(sizeof(struct tagCursoMem));
    pNew->pNext = NULL;
    printf("Indique o nome do curso:\n");
    scanf("%s", &pNew->nome);
    printf("Indique a descricao:\n");
    scanf("%s", &pNew->descricao);
    printf("Indique o ciclo:\n");
    scanf("%d", &pNew->ciclo);
    
    AddToHead(&pHead, pNew);
    nAlterado = 1;
    break;
    
    case 2:
    GravarFile(nAlterado, pHead);
    nAlterado = 0;
    break;
    
    case 4:
      system("cls");
        
        pFile=fopen("alunos.data","r");
        int num;
        fread(&num,sizeof(int),1,pFile);
        /* read a line */      
        fclose ( pFile );
          system("pause");
    
       
          /* close the file */
          fclose(pFile);
       
          return 0;
    
    break;
    /*
    case 3:
    if(((pAux = ProcMaisVelho(pHead)) != NULL))
    printf("O aluno mais velho tem o numero %d", pAux->nNumero);
    break;
    */
    case 0:
    break;
    default:
    printf("Opcao invalida!");
    }
    }while(opc != 0);
    GravarFile(nAlterado, pHead);
    return 0;
    }
    
    int MainMenu()
    {
    int sel;
    puts("\n\n1 - Inserir aluno");
    puts("2 - Gravar no ficheiro");
    puts("3 - Aluno mais velho");
    puts("4 - Ler Alunos");
    puts("\n0 - Sair");
    scanf("%d", &sel);
    return sel;
    }
    
    void AddToHead(struct tagCursoMem** pAuxHead, struct tagCursoMem* pAuxNew)
    {
    if(*pAuxHead != NULL)
    pAuxNew->pNext = *pAuxHead;
    *pAuxHead = pAuxNew;
    }
    /*
    struct tagCursoMem* ProcMaisVelho(struct tagCusoMem* pAux)
    {
    struct tagCursoMem *pMaisVelho;
    if(pAux != NULL)
    pMaisVelho = pAux; // nó inicial de comparação
    else
    return NULL;
    while(pAux != NULL) {
    if(pMaisVelho->nIdade < pAux->nIdade)
    pMaisVelho = pAux;
    pAux = pAux->pNext;
    }
    return pMaisVelho;
    }
    */
    void GravarFile(int nStatus, struct tagCursoMem* pAux)
    {
    FILE* pFile;
    struct tagCursoFile Curso;
    if(nStatus == 1) {
    if((pFile = fopen("alunos.data", "w")) != NULL) {
    while(pAux != NULL) {
    Curso.nome = pAux->nome;
    Curso.descricao = pAux->descricao;
    Curso.ciclo = pAux->ciclo;
    fwrite(&Curso, sizeof(struct tagCursoFile), 1, pFile);
    pAux = pAux->pNext;
    }
    }
    fclose(pFile);
    }
    }
    Vou exemplificar o que me falta,eu quando eu adicino um novo Curso e insero no aluno.data a informação mas a informação fica assim qunado eu leio com o notepad
    "ff" ld" fg" "

    ou seja o compilador le como se fosse letras normais,porque comprende binarios mas eu nao sei como eide de ler estes binarios em formata de texto para o output no ecran.ALguma ajuda?
     
    Última edição pelo moderador: 8 de Junho de 2009
  6. blackburn69

    blackburn69 Power Member

    Nesse código tens uns aspectos/erros a ter em atenção, que inclusivé podem-te resolver esse problema. Toma em atenção o seguinte, e repara que dei apenas uma vista de olhos rápida:
    Código:
     char nome; 
     char descricao;
    
    aqui o teu nome e descrição só podem ter um caracter. Ou seja, deverás meter algo como:
    Código:
     char nome[50];
     char descricao[50];
    
    ou então declarar apenas um ponteiro e depois fazeres um malloc. :)
    Repara que tens/deves fazer free's por cada malloc que fazes.
    Se abres o ficheiro em modo binário para leitura, também deves escrever em modo binário. Repara ainda que se o nome e a descrição forem de dimensão variável vais ter um problema quando fores ler do ficheiro, porque não sabes onde terminas ou começas o campo da estrutura. Tens alguma soluções para isso, é só pensares um bocado.
    Verifica todas as {} e todo o código em geral para ver se bate tudo certo.

    Isto são apenas alguns conselhos que te podem ajudar a descobrir o problema que estás a ter.
     
  7. sL1Per

    sL1Per Power Member

    http://msdn.microsoft.com/en-us/library/yeby3zcb(vs.71).aspx

    Tens uma série de combinações que podes fazer no parametro MODE

    Tenta alterar pFile=fopen("alunos.data","r"); para pFile=fopen("alunos.data","rb"); no caso da leitura...
    e
    fopen("alunos.data", "w") para fopen("alunos.data", "wb") quando fores escrever.

    tens também a opção "rt" e "wt" para text-mode se for esse o caso...

    Não percebi bem a tua dúvida!
     

Partilhar esta Página