Dúvida gerais em C++

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 &lt;iostream&gt; 
#include &lt;sstream&gt; 

int main(int argc, char* argv[]) {
   std::stringstream s;
   s &lt;&lt; std::hex &lt;&lt; 255;
   std::cout &lt;&lt; s &lt;&lt; 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.