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

(Resolvido) Arquivos em C


Su_Suh

Pergunta

Ola Pessoal!

Preciso com muita urgencia, e não sei mais a quem recorrer, de ajuda

se alguém souber ou tiver um exemplo de um programa em C sobre arquivo sequencial indexado

ahh e não pode ter vetor

apenas em arquivo

por favor galera não sei mais onde procurar, não tem nenhum exemplo

desde já obrigado

aguardo a ajuda de voces. :)

Editado por quintelab
Removido Ajuda-URGENTE do Título
Link para o comentário
Compartilhar em outros sites

7 respostass a esta questão

Posts Recomendados

  • 0
Boa noite!

O que você precisa fazer?!

Preciso fazer um algoritmo em C com arquivos sequenciais indexados, que faça busca, inserção e alteração

tudo isso pelo indice do arquivo

mas não podemos usar vetor e nem buscar na memoria

apenas em arquivo

tipo são 3 arquivos principais

o de busca que, por exemplo pega o indice e ordena pelo codigo do aluno, que seja

o principal, mestre, onde fica as informação apos as alterações...

e o temporario, onde eu vou dizer quem eu vou inserir,alterar ou excluir...

cara não sabemos mais o que fazer

ta complicado o negocio

por favor alguém ajudeeeee

:unsure:

Link para o comentário
Compartilhar em outros sites

  • 0

Opa, eu não consegui fazer muita coisa hj, vo posta aqui só pra ter como eu continuar em casa!

Mas pode dar uma idéia pra vocês!

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct s_aluno {
    int codigo;
    char nome[30];
    float media;
}Aluno;

typedef struct s_pesquisa_aluno {
    int codigo;
    long posicao;
}AlunoPesquisa;


void inserirAluno( Aluno *aluno , char *tmpfile );
Aluno *pesquisarAluno( int codigo , char *datafile , char *keyfile );
void mergeFiles( char *datafile , char *keyFile , char *tmpFile );


void inserirAluno( Aluno *aaa , char *tmpfile ){
    FILE *fp;
    Aluno aux;
    long pos = 0;
    if( NULL != ( fp = fopen( tmpfile, "rb+" ) ) ){
        //Procura pela posição a ser inserida no arquivo temporario
        fseek( fp , 0 , SEEK_SET );//Inicio do arquivo
        while( !feof( fp ) ){
            fread( &aux , sizeof( Aluno ) , 1 , fp );
            /*
            if( aux.codigo < aaa->codigo ){
                printf( "CODIGO: %d\n" , aux.codigo );
                continue;
            }else {
                break;
            }
            */    
            if( !feof( fp ) ){
                if( aux.codigo < aaa->codigo ){
                    continue;
                }else {
                    //fseek( fp , - sizeof( Aluno ) , SEEK_CUR );
                    break;
                }        
            }
        }
        if( !feof( fp ) ){
            printf( "Antes: %ld Elemento: %d" , ftell(fp), aaa->codigo );
            fseek( fp , - sizeof( Aluno ) , SEEK_CUR );
            printf( "Depois: %ld\n" , ftell(fp) );
        }
        //printf( "Codigo Inserido: %d" , aaa->codigo );
        printf( "Pos: %ld\n" , ftell( fp ) );



        //fseek( fp , pos , SEEK_SET );
        fwrite( aaa , sizeof( Aluno ) , 1 , fp );
    }else {
        printf( "Impossivel abrir o arquivo temporario: %s\n" , tmpfile );
    }
    fclose( fp );
}
Aluno *pesquisarAluno( int codigo , char *datafile , char *keyfile ){
    FILE *infos, *key;

    AlunoPesquisa posicao;
    Aluno *result;

    key = fopen( keyfile , "rb" );
    while( !feof( key ) ){
        fread( &posicao , sizeof( AlunoPesquisa ) , 1 , key );
        if( !feof( key ) ){
            if( posicao.codigo == codigo ){

                //Aloca memoria para o registro
                result = (Aluno *) malloc( sizeof( Aluno ) );//@todo Verificar se conseguiu

                //Abre o arquivo de dados e coloca na posição encontrada, lê o registro para a estrutura
                infos = fopen( datafile , "rb" );
                fseek( infos, posicao.posicao , SEEK_SET );
                fread( result , sizeof( Aluno ) , 1 , infos );


                fclose( infos );
                fclose( key );

                //Retorna a estrutura
                return result;
            }
        }
    }
    fclose( key );
    return NULL;
}
void mergeFiles( char *datafile , char *keyFile , char *tmpFile ){
    FILE *infos, *key, *tmp;

    Aluno aluno;
    AlunoPesquisa posicao;
    AlunoPesquisa aux;
    long pos = 0;

    infos = fopen( datafile , "ab+" );
    tmp = fopen( tmpFile , "rb" );
    key = fopen( keyFile , "ab" );
    
    //Poderia fazer aqui uma procura pra a ver se já existe o codigo a ser inserido, eu nem
    //vou fazer

    fseek( key, 0 , SEEK_SET );

    while( !feof( tmp ) ){
        //Lê a linha atual do arquivo temporário
        fread( &aluno , sizeof( Aluno ) , 1 , tmp );

        if( !feof( tmp ) ){//Verifica se não chegou no final do arquivo

            //Adiciona no arquivo de key        
            pos = ftell( key );
            while( !feof( key ) ){
                fread( &aux , sizeof( AlunoPesquisa ) , 1 , key );
                if( !feof( key ) ){
                    if( aluno.codigo > aux.codigo ){
                        continue;
                    }else {
                        pos = aux.posicao;
                    }
                }
            }

            posicao.codigo = aluno.codigo;
            posicao.posicao = ftell( infos );
            fwrite( &posicao , sizeof( AlunoPesquisa ) , 1 , key );

            //Adiciona no arquivo de dados
            fwrite( &aluno , sizeof( Aluno ) , 1 , infos );    
        }        
    }
    fclose( infos );
    fclose( tmp );
    fclose( key );
    
    //Remove o temp
    remove( tmpFile );
}


int main( int argc, char **argv ){

    Aluno teste;
    Aluno *teste_pesquisa;
    

    FILE *t;
    t = fopen( "teste.txt" , "wb" );
    fclose( t );


    teste.codigo = 5;
    teste.media = 10;
    strcpy( teste.nome , "Diego" );    
    inserirAluno( &teste , "teste.txt" );//Coloca para inserir

    teste.codigo = 2;
    teste.media = 5;
    strcpy( teste.nome , "Asdwqe" );    
    inserirAluno( &teste , "teste.txt" );//Coloca para inserir
/*
    teste.codigo = 3;
    teste.media = 6;
    strcpy( teste.nome , "JUAN" );    
    inserirAluno( &teste , "teste.txt" );//Coloca para inserir
*/
    //mergeFiles( "dados.txt" , "keys.txt" , "teste.txt" );//Atualiza o arquivo de dados e de keys


    /*
    teste_pesquisa = pesquisarAluno( 2 , "dados.txt" , "keys.txt" );
    if( teste_pesquisa != NULL ){
        printf( "%d%s%f\n" , teste_pesquisa->codigo , teste_pesquisa->nome , teste_pesquisa->media );
    }else {
        printf( "Registro não encontrado!\n" );
    }
    */    
}

Editado por p4t0X
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,4k
×
×
  • Criar Novo...