Juntar variaveis C++

15 respostas
M

O esquema é assim na dados eu tenho 12345 e na ponto eu tenho ; então:
12345;88888;88888;

/<em>esta duas variaveis estao corretas se eu fizer a saida de uma delas pro arquivo funciona normal, mas preciso juntar elas</em>/

LPTSTR dados;

LPTSTR ponto;

char str[50];

dados = (LPTSTR)SCNBUF_GETDATA(lpScanBuffer);
ponto = (LPTSTR)";";

strcat (str, dados); /*advertencia = Warning 1 warning C4133: ‘function’ : incompatible types - from ‘LPTSTR’ to ‘const char *’ c:\Documents and Settings\lorenzi\Meus documentos\Visual Studio 2008\Projects\BasicScan\BasicScan.c 314 BasicScan
*/
strcat (str, “;”);

lfp = fopen(“texto.txt”,“a”);

if(lfp)

{

fwprintf(lfp,LPTSTR(str)); /<em>se for assim funciona mas no resultado somente sai ???</em>/

fwprintf(lfp,str); /*advertencia = Warning 2 warning C4133: ‘function’ : incompatible types - from ‘char [50]’ to ‘const wchar_t *’ c:\Documents and Settings\lorenzi\Meus documentos\Visual Studio 2008\Projects\BasicScan\BasicScan.c 321 BasicScan

*/

fclose(lfp);

}

Grato se alguém puder ajudar

15 Respostas

T

Amigo, não use char * ou char[]. LPTSTR é uma coisa do outro mundo, que é equivalente, dependendo das opções de compilação, a char* (ANSI) ou wchar_t* (Unicode)

Só use isso se quiser ter dores de cabeça. A vida é muito curta para usar char* ou wchar_t*.

Use std::string e iostreams (fstream, etc.). A documentação da Microsoft é impossível de ler (para ter uma idéia, você precisa procurar por basic_string, não std::string) , mas outros lugares mostram como é que se usa corretamente std::string.

Os erros que você está pegando indicam que você está misturando Unicode e ANSI; e é por isso que mostra uma série de caracteres lixo.

M
Obrigado pela resposta, entao qual a melhor maneira de juntar isso?

LPTSTR dados;

LPTSTR ponto;

dados = (LPTSTR)SCNBUF_GETDATA(lpScanBuffer);
ponto = (LPTSTR)";";

dados = dados + ponto;

pq se nao for LPTSTR nao consigo pegar da tela

M

Tentei usar o esquema ali de str::String mas da pane no meu projeto, ele é um projeto de smart device, e pra encerrar so falta juntar estas duas variaveis

T

a) Nas opções de compilação, provavelmente o seu default é Unicode. Eu recomendo sempre que se use a compilação como “Use Multi-Byte Character Set”.

Clique com o botão direito sobre seu projeto, vá até o combo Configuration e acerte o valor para All Configurations, então vá até Configuration Properties, clique em “General”, ache um lugar que está escrito “Project Defaults”, “Character Set”, e escolha no combo a opção “Use Multi-Byte Character Set”.

b) Por que cargas d’água você está usando fwprintf? Não use isso a menos que você saiba o que está fazendo (e provavelmente você não deve saber o que está fazendo).

c) Para fazer concatenação de 2 strings (usando LPTSTR, ou seja, char*), use strcat (se você quiser ter enfartes ou derrames cerebrais) ou então strcat_s (que requer 3 parâmetros: o destino, o tamanho do destino em caracteres, e a fonte. Exemplo:

char destino[50];
char fonte [50];
strcpy_s (destino, sizeof (destino), "abc"));
strcpy_s (fonte, sizeof (fonte), "def"));
strcat_s (destino, sizeof(destino), fonte); // aqui o resultado vai ser "abcdef"

Isso obviamente é um porre, então se puder aprender a usar std::string é bem mais fácil. Por favor, procure isso - existe muito material na Internet; procure no site da SGI.

T

Hum, postei antes de saber que era para um “smart device”. Se for assim, é necessário sempre trabalhar com Unicode mesmo.

(Ou seja, esqueça essa parte de mudar a configuração de compilação do projeto.)

Nesse caso, você não deve usar char str[50]. Em “smart devices”, o caracter é sempre Unicode (16 bits), ou seja, wchar_t.

Vou postar o resto daqui a pouco.

T

Para smart devices existe a STL ( #include <string> ) mas depende da versão do Visual Studio que você está usando. Se for o Embedded Visual C++ (EVC) não existe tal coisa, infelizmente.

T

Vamos lá.

TCHAR destino[50];  
TCHAR fonte [50];  
_tcscpy_s (destino, sizeof (destino), _T("abc"));  
_tcscpy_s (fonte, sizeof (fonte), _T("def"));  
_tcscat_s (destino, sizeof(destino), fonte);
M

Caramba deu estes erros??

dados = (LPTSTR)SCNBUF_GETDATA(lpScanBuffer);
ponto = (LPTSTR)";";

_tcscpy_s (destino, sizeof (destino), _T(dados));    
               _tcscpy_s (fonte, sizeof (fonte), _T(ponto));    
               _tcscat_s (destino, sizeof(destino), fonte);

Warning 1 warning C4013: ‘_tcscpy_s’ undefined; assuming extern returning int c:\Documents and Settings\lorenzi\Meus documentos\Visual Studio 2008\Projects\BasicScan\BasicScan.c 318 BasicScan
Error 2 error C2065: ‘Ldados’ : undeclared identifier c:\Documents and Settings\lorenzi\Meus documentos\Visual Studio 2008\Projects\BasicScan\BasicScan.c 318 BasicScan
Error 3 error C2065: ‘Lponto’ : undeclared identifier c:\Documents and Settings\lorenzi\Meus documentos\Visual Studio 2008\Projects\BasicScan\BasicScan.c 319 BasicScan
Warning 4 warning C4013: ‘_tcscat_s’ undefined; assuming extern returning int c:\Documents and Settings\lorenzi\Meus documentos\Visual Studio 2008\Projects\BasicScan\BasicScan.c 320 BasicScan

T

Esses _tcscpy_s e outros caras estão em <tchar.h>

M

ja tenho este import

#include <tchar.h>

T

Hum… se você não tiver o _tcscpy_s então vai ter de usar o _tcscpy mesmo (que tem 1 parâmetro a menos).

M

Obrigado pela ajuda mas ja ouviu o ditado nao pode com o inimigo junte-se a ele

dados = (LPTSTR)SCNBUF_GETDATA(lpScanBuffer);
ponto = (LPTSTR)";";

lfp = fopen("texto.txt","a");
		        if(lfp)
                {
                  fwprintf(lfp,dados);
				  fwprintf(lfp,ponto);
                  fclose(lfp);
                }

resultado no arquivo:
[telefone removido];[telefone removido];[telefone removido];[telefone removido];

L

No C/C++ nós temos os metodos printf, que formatam a string de acordo com os parametros.

Tente o seguinte:

char* dados;
    const char* ponto = ";"; 
    char str[50];

     FD lfp; //FileDescriptor

    dados = (char*)SCNBUF_GETDATA(lpScanBuffer);


    lfp = fopen("texto.txt","a"); 
    if( lfp ){
        fprintf( lfp, "%s%s", dados, ponto );
        fclose( lfp );
    }
T

Luca, você tem de levar em conta que em “smart devices” (ou seja, os que rodam Windows CE ou Pocket PC Windows) você precisa tomar cuidado porque a maior parte das APIs disponíveis usa apenas Unicode (ou seja, em vez de char, você tem de usar wchar_t ou TCHAR.
O wchar_t é um tipo de 16 bits, análogo ao char do Java.)
Então a maior parte das APIs têm esses nomes esquisitos (por exemplo, em vez de fprintf, você tem de usar fwprintf (ou seja, _tfprintf), que requer parâmetros Unicode, não ANSI. )

L

thingol, mas a escrita é em um arquivo e vc pode fazer com o char*. Se vc quiser manter compatibilidade com qualquer coisa, vc pode escrever com unsigned char*, que é equivalente a 1 byte. A grande diferença seria na leitura, que deveria ser no padrão. Mas não foi mencionado se este código era pra um “Smart Device”.

Criado 19 de março de 2009
Ultima resposta 19 de mar. de 2009
Respostas 15
Participantes 3