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". */
}