Ir ao conteúdo

Posts recomendados

Postado

Olá, estou com uma dúvida e não venho conseguindo resolver a mesma para um trabalho, preciso ler um arquivo .txt com registros no formato:

 

Rua|Cidade|Estado|CEP

 

Exemplo:

TRAVESSA RAMOS FERREIRA|RIO BRANCO|AC|69903620

 

E a partir desse arquivo criar um arquivo índice em binario que contenha o byte inicial de cada registro do arquivo inicial.

 

E com esse índice, possibilitar para um usuário  realizar uma busca por um registro , por exemplo registro 100 e k programa deve realizar um seek() pelo byte inicial desse registro no índice e com esse byte realizar outro seek() e mostrar a informação do arquivo original na tela. Estou tentando fazer utilizando fstream porém estou com dificuldades.

 

 

 

 

 

 

 

  • Amei 1
Postado
35 minutos atrás, João Vitor Afonso Pereira disse:

E com esse índice, possibilitar para um usuário  realizar uma busca por um registro , por exemplo registro 100 e k programa deve realizar um seek() pelo byte inicial desse registro no índice e com esse byte realizar outro seek() e mostrar a informação do arquivo original na tela. Estou tentando fazer utilizando fstream porém estou com dificuldades

 

Acho que não ganha nada usando dois métodos de acesso para os dois arquivos. Se o índice tem que ser binário então o segundo arquivo vai ser simplesmente uma sequência de int por exemplo, com 4 bytes por registro. Se tiver 505 linhas na entrada vai ter 505x4 bytes no arquivo de indice.

 

E a entrada nesse formato que mostrou é separada por um ENTER, o popular newline, '\n'. E dentro de cada linha os 4 campos são separados por '|'... O simples então é, escrevendo a partir dos dados, ler a entrada e marcar no índice a posição dos '\n'. Só isso. Um registro começa onde diz o índice, basta usar seek(). 

 

Para saber onde está o registro 3 você faz um seek() de 2 registros no índice e terá a posição onde ele começa no arquivo de dados.

 

A partir daí os próximos 3 '|' darão o final dos campos e o '\n' o final da linha.

 

Nada mais

 

 

Postado

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main()
{
    string linha;
    fstream arqE ("teste.txt");
    fstream arquivoIndice("indice.txt", ios::binary|ios::app);

    string linhaAtual;
    int contador ;
    string cont2;
    int entrada;
    string dado;

    if(arqE.is_open()){

            while(getline(arqE, linha)){

                    int contador = arqE.tellg();

                    arquivoIndice.write((char*)&contador,sizeof(contador));

            }

    }
    else cout << "Erro ao ler arquivo de dados";

    if(arqE.is_open()){

            cout << "Digite o registro que deseja verificar: ";
            cin >> entrada;
            cout << endl;

            arquivoIndice.seekg((entrada-1)*4, ios::beg);
            int cont2 = arquivoIndice.tellg();
            //arquivoIndice.seekg(0);

            arquivoIndice.read((char*)&cont2, sizeof(cont2));

            arqE.seekg(cont2, ios:: beg);

            getline(arqE,linhaAtual);

            cout << linhaAtual;
            cout << "\n";

    }
    else cout << "Erro ao ler arquivo de dados";


    return 0;
}

 

 

Acima esta o código que tentei ate o momento, criando o índice de forma binaria e tentando fazer as buscas. porém não recebo retorno.
 

Postado
13 minutos atrás, João Vitor Afonso Pereira disse:

Acima esta o código que tentei ate o momento, criando o índice de forma binaria e tentando fazer as buscas. porém não recebo retorno

 

?

 

Use o botão code para formatar o código. Assim fica muito difícil para alguém copiar o código, e muitas vezes vem com "lixo" da págin web.

 

Acho que pode caprichar um pouco mais no programa para ajudar você mesmo....

 

  • Que tal mostrar na tela ou gravar em um arquivo os índices que está montando?
  • Que tal usar um arquivo padrão para testar, com resultados conhecidos?
  • Que tal colocar mensagens para ajudar a entender?
  • E sobre usar comentários sobre o que está fazendo?

Imagine esse arquivo, duas.txt
 

1|2|3|4
5|6|7|8

 

Marque no papel o índice que vai gerar. Veja o que o sistema diz
 

image.png.9d69ba2a6df528fe5c0e63e2c18988ed.png


Serão claro 2 registros então qual será o tamanho do arquivo de índice? E o conteúdo? O primeiro elemento começa em 0, o segundo em 10, certo? TESTE. Windows pode gravar \n\r ao invés de apenas \n. Linux sempre grava apenas \n. Teste, mostre na tela.

 

Crie o índice. Escreva CLARO uma função que imprime o índice e CONFIRA.

 

Não precisa (e não deve porque não é esperto)  escrever um único programa de uma vez.

 

 

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...