Vocês leem como array de char e depois passam para um array de int, aplicando o and em cada posição?
E, se for escrever no arquivo, passar novamente para um array de char?
[quote=Schuenemann]Vocês leem como array de char e depois passam para um array de int, aplicando o and em cada posição?
E, se for escrever no arquivo, passar novamente para um array de char?[/quote]
Não precisa fazer isso.
Na verdade, na maior parte das vezes, tratamos diretamente com os bits. O valor numérico, quando você trabalha com arquivos e sockets, costuma a ser irrelevante. No máximo convertíamos para inteiro em logs.
Então, qual sugestão?
No meu caso, eu trabalho com os inteiros mesmo.
Tenho que abrir o arquivo e trocar um byte específico de 3 para 5, por exemplo. Ou vários contíguos.
Existe alguma contra-indicação nisso?
vector<unsigned char> vet;
file.read((char *) &vet[0], vet.size());
Pelo que testei, não dá o problema citado com o cast (ao menos nesse compilador).
Acho que não fica legal (mesmo que tenha desempenho melhor) eu manter uma string e aplicar o and em todo código que acesse o conteúdo da string.
Como se converte um número para uma string hexadecimal (ou outra base qualquer) ?
Vi que a maneira padrão é usando sprintf(string_destino, formato, numero), mas como eu posso saber antecipadamente qual o tamanho que a string terá? Exemplo:
string s;
s.resize(2);
sprintf(&s[0], "%X", 255);
cout << s << endl;
Imprime “FF”, mas só funciona com o resize() (e nesse caso eu já sabia que teria tamanho 2 saída).
O sprintf é usado em C. Em C++ geralmente usa-se o stringstream (ou as funções de string da boost).
Veja:
http://www.cplusplus.com/reference/iostream/manipulators/hex/
Mas, basicamente:
#include <iostream>
#include <sstream>
int main(int argc, char* argv[]) {
std::stringstream s;
s << std::hex << 255;
std::cout << s << std::endl;
}
O stringstream, por ser um stream, tem a mesma sintaxe do cout.
Valeu.
[code]#include
ostringstream ss;
ss << hex << 255;
cout << ss.str() << endl;[/code]
Vou considerar o uso da Boost. Parece simplificar muita coisa em relação à API padrão.
Edit: só depois notei que você já tinha dado o exemplo exato…
Passei a ter um problema “estranho”.
O erro é:
Vou tentar colocar de forma simplificada as classes que tenho. E vou tirar os includes da lib padrão pra diminuir o código.
Classe Ata:
[code]#ifndef ATA_H
#define ATA_H
#include “State.h”
#include “helper/Helper.h”
class Ata {
public:
explicit Ata(string);
virtual ~Ata();
protected:
private:
State state;
Helper helper;
};
#endif // ATA_H
// Ata.cpp
#include “Ata.h”
#include “State.h”
#include “State.cpp”
Ata::Ata(string path) : state(path), helper(state) { }
Ata::~Ata() { }[/code]
classe State:
[code]#ifndef STATE_H
#define STATE_H
class State {
public:
explicit State(string);
virtual ~State();
protected:
private:
};
#endif // STATE_H
// State.cpp
#include “State.h”
State::State(string path) { }
State::~State() { }
[/code]
classe Helper:
[code]#ifndef HELPER_H
#define HELPER_H
#include “…/State.h”
class Helper {
public:
explicit Helper(const State &);
virtual ~Helper();
protected:
private:
State state;
};
#endif // HELPER_H
// Helper.cpp
#include "Helper.h"
Helper::Helper(const State & state) : state(state) { }
Helper::~Helper() { }[/code]
Segundo a busca que fiz, quando você declara uma variável num arquivo header, cada arquivo-fonte que incluir aquele header terá uma cópia separada da variável.
Não sou expert em C++, mas vc tem certeza disso?
Afinal, para que serve então o seguinte código do preprocessador?
[code]#ifndef XXX_H
#define XXX_H
#endif XXX_H [/code]
[]'s
Vc está implementando os construtores dentro do header? É normal fazer isso? O ideal não é implementar a classe em um arquivo .cpp?
Se você inserí-los dentro do bloco de compilação condicional, acredito que o erro vá desaparecer, pois eles serão implementados apenas uma vez.
[]'s
Ops… Agora que vi o comentário no código.
Pq vc ta dando um include no State.cpp?
Acho que o erro é aquele include mesmo. Eu acabei incluindo aquilo porque dava erro no construtor de Ata, mas agora estou percebendo que só acontece o erro quando faço build no outro projeto.
Amanhã eu vou verificar as dependências entre os projetos, acho que o erro é meu mesmo.
Obrigado.
Eu confirmo que era aquilo mesmo. Na minha ignorância em resolver o problema, acabei dando include num .cpp.
Pra resolver no Code::Blocks, uma forma é clicar no segundo projeto, ir em Add files e adicionar os .h e .cpp.
Adicionar em project dependencies não resolve. Parece que ali só vale para a compilação, não pro linking.
Tava acostumado com Eclipse/Netbeans.
Vou rever o que escrevi.