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

Trabalho de programação em c++ com ficheiros

Discussão em 'Programação' iniciada por The_Kenobi, 25 de Janeiro de 2008. (Respostas: 15; Visualizações: 2276)

  1. Boas people este é o meu 1º post aki:P
    Vi este topiko aki e resolvi expor a minha duvida:D

    tenho de fazer um programa em c++ k grave em ficheiro .dat o nº de processo, nome, numero, turma e ano!
    Mas depois podelos eliminar e alterar!!!;)
    Ai é k está o meu problema!prá já ele grava-me esses dados mas agora presisava de ajuda no alterar e eliminar:P

    aki fika o k tenho ate agora:

    Código:
    #include <stdio.h>
    #include <conio.h>
    #include <string.h>
    #include <ctype.h>
    #include <stdlib.h>
    typedef struct
    {
     
    int n_processo,ano;
    char nome[20], turma[20];
    }
    tnomes;
    FILE *f, *auxf;
     
    void abrir_fich()
    {
    if((f=fopen("dados.dat","r+"))==NULL)
    {
    printf("O ficheiro nao existe! Foi criado um novo\n");
    f= fopen ("dados.dat","w+");
    }
    else printf("Ficheiro aberto com sucesso! \n");
    }
    void ler_dados(tnomes *r)
    {
    printf("Insira o numero de processo do aluno \n");
    scanf("%d",&r->n_processo);
    printf("Insira o nome do aluno \n");
    scanf("%s",r->nome);
    printf("Insira a Turma do Aluno \n");
    scanf("%s",r->turma);
    printf("Insira o ano do aluno \n");
    scanf("%d",&r->ano);
     
    }
    void escrever_dados(tnomes *r)
    {
    printf("Numero de processo do aluno: %d\n",r->n_processo);
    printf("Nome do Aluno: %s\n",r->nome);
    printf("Turma do aluno: %s\n",r->turma);
    printf("Ano do aluno: %d\n",r->ano);
     
    }
    int ler_fich(tnomes regs[])
    {
    int i=0;
    fread(&regs[i],sizeof(tnomes),1,f);
    while(!feof(f))
    {
    i++;
    fread(&regs[i],sizeof(tnomes),1,f);
    }
    return(i);
    }
    void escrever_fich(tnomes regs[], int n)
    {
    int i;
    for(i=0;i<n;i++)
    fwrite(&regs[i],sizeof(tnomes),1,f);
    }
    int menu()
    {
    system("color 4E");
    int op;
    printf("\t\t***************[MENU]***************\n");
    printf("\n\t\t\t\ 1-Inserir\n");
    printf("\n\t\t\t\ 2-Consultar\n");
    printf("\n\t\t\t\ 3-Alterar \n");
    printf("\n\t\t\t\ 4-Remover registo \n");
    printf("\n\t\t\t\ 5-Ordenar registos \n");
    printf("\n\t\t\t\ 6- Sair\n");
    printf("\n>QUAL A SUA OPCAO: \n");
    scanf("%d",&op);
    return(op);
     
    }
    main()
    {
    int opc,i,dim=0;
    tnomes registos [100];
    abrir_fich();
    dim=ler_fich(registos);
    do
    {
    opc=menu();
    switch(opc)
    {
    case 1:
    ler_dados(&registos[dim]);
    dim++;
    break;
     
    case 2:
    for(i=0;i<dim;i++)
    escrever_dados(&registos[i]);
    break;
    }
    }while(opc!=6);
    escrever_fich(registos,dim);
    } 
    Alguem me pode dar uma ajuda:P?
     
    Última edição pelo moderador: 26 de Janeiro de 2008
  2. AragTey

    AragTey Power Member

    para eliminar o mais fácil é carregares tudo em memória, apagas ai e depois escreves um novo ficheiro.
     
  3. mj2p

    mj2p I'm Cool Cuz I Fold

    Para o teu caso, eu utilizaria listas ligadas para gerir a informação. No inicio do programa gravava tudo para a memória e depois fazia as gestões necessárias.

    Vá, cumps
     
  4. e como faço isso?:S
    eu sou uma nodoa em programação...:P
     
  5. AragTey

    AragTey Power Member

    Eu faria com vectores (no fundo sãp quase como uma lista duplamente ligada).

    Código:
    typedef struct
    {
     
    int n_processo,ano;
    char nome[20], turma[20];
    }
    tnomes;
    
    // declaracao do vector do tipo tnomes
    vector<tnomes> list_tnomes;
    
    // uma pequena alteracao na leitura, aconselho-te a escrever logo no inicio do ficheiro
    // a quantidade de elementos tnomes que vais ler. Assim com um for fazes mais facilmente 
    // a leitura
    int ler_fich(tnomes regs[])
    {
    int i=0;
    tnomes aux_tnomes;
    fread(&aux_tnomes,sizeof(tnomes),1,f);
    list_tnomes.push_back(aux_nomes);
    while(!feof(f))
    {
    i++;
    fread(&aux_tnomes,sizeof(tnomes),1,f);
    list_tnomes.push_back(aux_nomes);
    }
    return(i);
    }
    
    // apagar um elemento do vector
    void del_tnomes()
    {
    // percorrer todo o vector com 1 iterador
    for (vector<tnomes>::conts_iterator it = list_tnomes.begin() ; it != list_tnomes.end() ;
         it ++)
        if (it->n_processo == 1000) // exemplo de comparacao para identificar elemente a apagar)
           list_tnomes.erase(it);
        // atencao se achares que vais apagar mais de 1 elemento convem percoreres o vector de  fim para o inicio
    }
    
    // depois percorrer novamente o vector e escreves para o ficheiro.
    
    Procura por info no google sobre vectores:

    http://www.cplusplus.com/reference/stl/vector/
     
  6. MadOnion

    MadOnion Folding Member

    Por vezes, esse tipo de metodologia não é boa ideia. Imagina que o ficheiro tem 1Gb?
    Trás algumas consequências depois(já não falo em swap out ou memória virtual).
     
  7. AragTey

    AragTey Power Member

    Exato, por isso referi que era o mais fácil ;), neste altura se ele ainda está no inicio não convém complicar a coisa, com manuseamento de ponteiros em ficheiros.
     
  8. m00s

    m00s Power Member

    isto é mais C do que C++, não!?
     
  9. OubeLa

    OubeLa Power Member

    Não. É C++. Não te esqueças que C++ deriva do C :P
     
  10. arconada

    arconada Power Member

    se eles o dizem.... eu sinceramente nao vi nada no codigo mostrasse ser C++... nem usa classes... mas... posso ser eu que não percebo muito disso
     
  11. AragTey

    AragTey Power Member

    Por exemplo a parte dos vectores é de C++. Neste caso o código é uma mistura....já que a parte de manuseamento de ficheiro está em C. Poderia ser feita com ifstream e ofstream dando um aspecto mais "C++" á coisa.

    Mas também posso ser parcial, porque neste momento a minha mente já está corrupta e já não consigo pensar apenas em C ou apenas em C++.
     
  12. m00s

    m00s Power Member

    eu acredito mais nessa ultima possibilidade ("mente corrupta")! :D

    mas tudo bem... nao faço questão de teimar com ninguém mas no meu ponto de vista é C e nao outra coisa.

    ...adiante!
     
  13. AragTey

    AragTey Power Member

    ;), pelo menos fui confirmar e vector é de C++.....já não tá mal :D....mas pronto sou mesmo um corrompido.
     
  14. OubeLa

    OubeLa Power Member

    De facto é verdade. Quando eu disse que era mesmo C++ foi porque nem tinha lido o post inicial, só tinha visto a ideia do mj2p bem como dos ponteiros (que são usuais em C, penso eu, mas em C++ também se usa bastante). Mas agora que vi o post inicial também não vi grande coisa de C++.

    No entanto, conheço pessoas que programam em C++ com uma mistura com C (redundancia, C++ deriva do C). O que fazem é usar cada uma das linguagens na situação que mais lhes convém.
     
  15. AragTey

    AragTey Power Member

    Sou um desses....o que ainda não consegui perceber é se isso é bom ou mau?? enfim...desde que o boss não refile :D
     
  16. walterwolf

    walterwolf Power Member

    isso nao é C++ mas sim C, sekalhar poderá funcionar mun ficheiro .cpp, mas definitivamente nao é codigo c++.
     

Partilhar esta Página