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

(Resolvido) Problemaa ao dividir leitura em vários acessos


== Douplus ==

Pergunta

Olá a quem lê,

Estou trabalhando em uma espécie de editor que ao carregar precisa fazer uma análise de um arquivo. Quando essa análise é feita com o seguinte código ela funciona:

// Analysis
  for (unsigned int i = 0; i < length;) {
    short size = analyze68kInst(buffer + i, i, refs);
    if (size == -1)
      break;
    else if (size == 0) {
      size = 2;
    }
    i += size;
  }
Entretanto, quero limitar o tamanho permitido para a alocação do buffer pelo programa (valor definido em MAX_BUF_SIZE), e isso acarreta problemas caso o tamanho do arquivo sejamaior que o buffer. Por isso a necessidade em dividir o acesso em vários menores de acordo com o tamanho máximopermitido ao buffer. Tentei uma função assim assim:
void Analyzer(std::multimap<UINT32, Reference> &refs, const string filePath, const unsigned int entryPoint, const long unsigned int totBytes)
{
  ifstream fin(filePath.c_str(), ios::binary);
  unsigned long int bytes = totBytes - entryPoint, access = MAX_BUF_SIZE - 20, currByte = entryPoint, i, onePercent = bytes / 100;
  unsigned short percentsDone = 0;
  UINT8 buffer[MAX_BUF_SIZE];
  short size;

  if (!fin.is_open()) {
    cerr<<"Erro ao abrir"<<endl;
    exit(1);
  }

  cout<<"Analyzing file...";
  cout.flush();
  do {
    if (currByte >= (totBytes - MAX_BUF_SIZE))
      break;
    fin.seekg(currByte);
    fin.read(reinterpret_cast<char *>(buffer), MAX_BUF_SIZE);
    for (i = 0; i < (access); i++) {
      short size = analyze68kInst(buffer + i, currByte, refs);
      if (size == -1) {
    break;
      }
      else if (size == 0)
    size = 2;
      i += size;
      currByte += size;
    }
    if ((percentsDone) < ((unsigned short)(100 * currByte / totBytes))) {
      cout<<setbase(10)<<percentsDone<<'%'<<endl;
      cout.flush();
      ++percentsDone;
    }
  } while (size != -1);

  fin.clear();
  fin.seekg(currByte);
  fin.read(reinterpret_cast<char *>(buffer), MAX_BUF_SIZE);
  access = fin.gcount();
  for (i = currByte; i < access; i++) {
    size = analyze68kInst(buffer + i, currByte, refs);
    if (size == -1)
      break;
    else if (size == 0)
      size = 2;
    i += size;
    currByte += size;
  }cout<<"Done!"<<endl;

  fin.close();
}

Essa função apresenta problemas, geralmente, eu sempre crio hipóteses sobre qual deve ser o erro e faço testes para verificá-las, mas, nesse caso, se esgotaram minhas hipóteses. Estou a dias tentando resolver isso no escuro, nunca fiquei sem hipóteses para a causa do problema.

Peço, por favor, que me ajudem!.

Grato

== Douplus ==

Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

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,1k
    • Posts
      651,9k
×
×
  • Criar Novo...