Função fopen desconfigura C++ builder

1. Função fopen desconfigura C++ builder

Walter Ribeiro Homem Junior
userdevw

(usa Ubuntu)

Enviado em 08/10/2013 - 10:30h

Ola pessoal

Estou tendo problemas com a função fopen do C++, ele chega ler o arquivo, e copia, mas copia "desconfigurado".
Tentei usar alguns comandos de utf, mas não adiantou .... copia desconfigurado ...

Aguardo ajuda.
Obrigado
userdevw


  


2. Re: Função fopen desconfigura C++ builder

Clodoaldo Peres
clodoaldoPeres

(usa Ubuntu)

Enviado em 08/10/2013 - 11:02h

userdevw escreveu:

Ola pessoal

Estou tendo problemas com a função fopen do C++, ele chega ler o arquivo, e copia, mas copia "desconfigurado".
Tentei usar alguns comandos de utf, mas não adiantou .... copia desconfigurado ...

Aguardo ajuda.
Obrigado
userdevw

Olá. Ficou um pouco abstrato sua questão. Vc esta lendo um arquivo e criando uma copia? Qual tipo,extensão de arquivo vc está manipulando? Posta o teu fonte para analizarmos. Outra coisa, em c++ os padrões para manipular stream são ofstream,ifstream e ofstream o fopen eh padrão biblioteca C, ainda que vc consiga usar com codigo c++, não eh boa prática misturar C com C++.




3. Re: Função fopen desconfigura C++ builder

Walter Ribeiro Homem Junior
userdevw

(usa Ubuntu)

Enviado em 08/10/2013 - 12:38h

ok, eis o código do C++ Builder xe5


void __fastcall TDM::DataModuleCreate(TObject *Sender)
{


FILE *fp;
int cont2 = 0, cont3 = 0;
char str1, str2[80], str3[80];
char banco[80];
String usuario, senha;
FILE *p_txt;
try {
p_txt = fopen("dbxConnnections.ini","r");
// lendo o arquivo

fgets(banco, 80, p_txt);
// esse 80 deve ser o limite... coloquei um limite grande...

fclose(p_txt);
fp = fopen("dbxConnnections.ini", "r");
while (fgets(str2, 80, fp) != NULL) {
if (cont2 == 1) {
usuario = str2;
}
cont2 = cont2 + 1;
}
fclose(fp);

fp = fopen("dbxConnnections.ini", "r");
while (fgets(str3, 81, fp) != NULL) {
if (cont3 == 2) {
senha = str3;
}
cont3 = cont3 + 1;
}
fclose(fp);
}
catch (...) {
// Problemas com o Windows 8
Application->OnException = NULL;
Application->OnMessage = NULL;
}
try {
SQLCon->ConnectionName = "FBConnection";
SQLCon->DriverName = "FireBird";
SQLCon->GetDriverFunc = "getSQLDriverINTERBASE";
SQLCon->LibraryName = "dbxfb.dll";
SQLCon->VendorLib = "fbclient.dll";
SQLCon->Params->Values["Database"] = banco;
SQLCon->Params->Values["User_Name"] = usuario;
SQLCon->Params->Values["Password"] = senha;
SQLCon->Open();

}
catch (...) {
Application->OnException = NULL;
Application->OnMessage = NULL;
}
}


ele pega o caminho do banco o usuário e depois a senha ..
... só que esses dados desconfiguram e aí ele já da a resposta de erro dizendo que é usuário e senha invalidos...

aguardo uma ajuda.


4. Re: Função fopen desconfigura C++ builder

Paulo
paulo1205

(usa Ubuntu)

Enviado em 08/10/2013 - 13:01h

Ajude-nos a ajudá-lo. Para que o código fique num formato mais legível, edite sua postagem original e coloque o código C++ entre as tags [code] e [/code].


5. Re: Função fopen desconfigura C++ builder

Paulo
paulo1205

(usa Ubuntu)

Enviado em 08/10/2013 - 13:51h

Para que abrir o mesmo arquivo três vezes distintas para, na prática, ler três linhas consecutivas?

Uma boa prática de programação é evitar constantes numéricas soltas, espalhadas pelo programa. No seu código, em pelo menos um lugar você usou tamanho 81 quando o tamanho declarado era apenas 80.

Seu uso de exceções também está estranho. O Windows têm um mecanismo de disparo e tratamento de exceções do próprio sistema operacional que é (ou era, na última vez em que eu li a respeito -- eu não sou programador Windows) completamente distinto do mecanismo de C++. Além disso, as funções de I/O do C simplesmente não disparam exceções, de modo que o seu primeiro bloco try/catch é inócuo.

Parece-me que a primeira parte do que você quer fazer se resolve do seguinte modo:

char banco[80], usuario[80], senha[80];

fp=fopen("dbxConnnections.ini", "r");
if(fp==NULL)
throw std::runtime_error(strerror(errno));
if(
fgets(banco, sizeof banco, fp)==NULL || // Lê 1ª linha, que contem o nome do banco
fgets(usuario, sizeof usuario, fp)==NULL || // Lê 2ª linha, que contém o nome do usuário
fgets(senha, sizeof senha, fp)==NULL // Lê 3ª linha, que contém a senha
){
fclose(fp);
throw std::runtime_error("Formato do arquivo inválido");
}
fclose(fp);
banco[strlen(banco)-1]=0; // elimina '\n' da string com nome do banco
usuario[strlen(usuario)-1]=0; // elimina '\n' da string com nome do usuario
// elimina '\n' da string (aqui tem de ser mais longo, porque o '\n' pode existir ou não).
l=strlen(senha)-1;
if(l>=0 && senha[l]=='\n')
senha[l]=0;


(Note que, no código acima, eu usei sizeof nome_do_array para garantir que o tamanho necessariamente corresponderá ao que foi declarado para cada array.)

Ou, usando I/O em C++ nativo:

std::string banco, usuario, senha;

try {
std::ifstream iniFile;

iniFile.exceptions(std::ifstream::failbit | std::ifstream::badbit | std::ifstream::eofbit);

iniFile.open("dbxConnnections.ini");
std::getline(iniFile, banco);
std::getline(iniFile, usuario);
std::getline(iniFile, senha);
}
catch(std::ifstream::failure &e){
/* Trata erro de leitura do arquivo "dbxConnnections.ini". */
}



6. RESOLVIDO

Walter Ribeiro Homem Junior
userdevw

(usa Ubuntu)

Enviado em 08/10/2013 - 14:57h

Opa ...

Deu certo cara, mas é estranho que quando faço debug demonstrando com inspect ele me mostra os dados e junto com ele vem uma parafernália de caractere .... mas deu certo ele autenticou !
Sou programador aprendiz no C C++ ...

Poderia nos explicar porque disto ?

Mas esta RESOLVIDO !


Obrigado
userdevw


7. Re: Função fopen desconfigura C++ builder

Paulo
paulo1205

(usa Ubuntu)

Enviado em 08/10/2013 - 19:16h

Por quê de quê? Dos caracteres inesperados?

O compilador/inspector não tem como distinguir entre um array de caracteres (que são equivalentes a bytes em C) contendo dados binários e uma string. Por isso, eles supõem que seja um array de bytes, exibindo todos eles, mesmo que a string armazenada ocupe apenas as primeiras posições do array.


8. Re: Função fopen desconfigura C++ builder

Paulo
paulo1205

(usa Ubuntu)

Enviado em 10/10/2013 - 10:57h

Se está resolvido, marque o tópico como resolvido e, se possível, indique a melhor resposta.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts