Ir ao conteúdo

Posts recomendados

Postado

Ao tentar carregar um arquivo na memória usando ifstream em modo binário , a leitura do arquivo chega ao final mas meu buffer não contem todos os dados.

void sendFile(int socket,ifstream& in){
  in.seekg(0,ios::end); //posicionando no final para pegar o tamanho em bytes
  ulli sizeFile = in.tellg();//pegando a posição atual
  in.seekg(0,ios::beg); //reposicionando no inicio para leitura
  char *Buffer = new char[sizeFile];//criando buffer de tamanho do arquivo (bytes)
  in.read(Buffer,sizeFile);
  char Bufftosend[500];
}

 

  • Curtir 1
Postado
2 horas atrás, InicianteOtaku disse:

Ao tentar carregar um arquivo na memória usando ifstream em modo binário , a leitura do arquivo chega ao final mas meu buffer não contem todos os dados

 

Como sabe que a leitura chegou ao final?

 

Talvez devesse postar o código todo...

 

 ulli sizeFile = in.tellg();//pegando a posição atual

Que pretende com essa linha? fileSize seria mais comum, certo? E em java. :) Em C++ deve ser mais comum file_size mesmo. E se pretendia declarar algo como um inteiro sem sinal pode usar unsigned long ou os tipos em <cstdint> como uint32_t e uint64_t com sentido óbvio.

 

Talvez devesse mostrar na tela em cerr ou cout os valores que leu para se assegurar das coisas. 

 

Você tem um livro de C++? Sua escola assina uma biblioteca online talvez?

 

depois de chamar read() o total de bytes lidos pode ser consultado chamando gcount() e o estado pode ser consultado usando rdstate(), e o fim de arquivo estará sinalizado em eofbit...

 

Como vai liberar a memória alocada? Outra chamada a sendFile e já era a memória ocupada por Buffer...

 

 

  • Curtir 1
  • Obrigado 1
Postado

@arfneto Código

    void sendFile(int socket,ifstream& in,void(*function)(pair<ulli*,ulli*>)=NULL){
        in.seekg(0,ios::end);
        uint64_t file_size = in.tellg();
        in.seekg(0,ios::beg);
        
        sendVar<uint64_t>(socket,file_size);

        char *Buffer = new char[file_size];
        in.read(Buffer,file_size);
      
        cout<<file_size<<" "<<(in.gcount() == file_size)<<" "<<((in.rdstate() & ios::eofbit)!=0) << endl;
        cout<<Buffer<<endl; // estou usando um arquivo de texto para testar
      
        for(uint64_t i=0;i<=file_size;){
            if((i+500)<file_size){
                send(socket,Buffer+i,500,0);
                i+=500;
            }else{
                send(socket,Buffer+i,(file_size-i),0);
                i+=(file_size-i);
            }
        }
      
        delete[] Buffer;
    }

Ao realizar a troca de ulli = Unsigned long long int para uint64_t parece que tudo está funcionando normalmente. obrigado!.

  • Curtir 2

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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!