Erro em C ++, o que fazer?: Não foi possível encontrar uma correspondência para Ostream :: Write (Long *, Int não assinado)
-
21-09-2019 - |
Pergunta
Estou tentando escrever dados armazenados em um arquivo binário usando o Turbo C ++. Mas isso me mostra um erro
could not find an match for ostream::write(long *, unsigned int)
Eu quero escrever um 4 byte long
dados nesse arquivo. Quando tento escrever dados usando o Pointer Char. Ele funciona com sucesso. Mas eu quero armazenar grande valor, por exemplo. 2454545454, que pode ser armazenado em long
só.
Eu não sei como converter 1 byte em bit. Eu tenho 1 byte de dados como personagem. Além disso, o que estou tentando fazer é converter 4 chars em longos e armazenar dados nele. E do outro lado, quero reverter isso para recuperar quantos bytes de dados escrevi.
long *lmem;
lmem=new long;
*lmem=Tsize;
fo.write(lmem,sizeof(long));// error occurs here
delete lmem;
Estou implementando a Steganografia e armazenei com sucesso o arquivo TXT na imagem, mas tentando recuperar os dados do arquivo agora.
EDITAR:
Estou usando o Turbo Complier.
Solução
Lance para um char*
long *lmem;
lmem=new long;
*lmem=Tsize;
fo.write(reinterpret_cast<char*>(lmem),sizeof(long));
delete lmem;
Ou ainda melhor (pois a alocação na pilha é muito mais rápida e menos propensa a erros)
long lmem = Tsize;
fo.write(reinterpret_cast<char*>(&lmem),sizeof(long));
Se Tsize
é endereçável e um longo você pode fazer isso:
fo.write(reinterpret_cast<char*>(&Tsize),sizeof(long));
Outras dicas
Eu acredito que escrever leva um char*, não muito*
ostream& write ( const char* s , streamsize n );
1)
const long L = Tsize;
fo.write(reinterpret_cast<const char*>(&L),sizeof(L));
Existem vários problemas aqui.
Primeiro, você não precisa criar um novo long
Para armazenar o TSIZE. Você pode fazer um ponteiro para o tsize que já tem.
Segundo, o write
Call pega um fluxo de bytes. O que você precisa fazer é lançar seu ponteiro para char*.
Assim:
fo.write( static_cast<char*>(&Tsize), sizeof(Tsize) );
Terceiro, escrever um longo como esse é bastante ineficiente. Se você tem uma grande variedade de valores longos que deseja escrever, use uma única chamada de gravação para obter todos eles, como:
fo.write( static_cast<char*>(array), sizeof(*array) * array_count );
Tenho certeza de reinterpret_cast
.