dragontechi 70 Report post Posted January 31 ddddddddd BOOL CLoginScene::_InitUI() { frmPathLogo = CFormMgr::s_Mgr.Find("frmPathLogo"); if (!frmPathLogo) return false; frmPathLogo->SetIsShow(false); frmAccount = CFormMgr::s_Mgr.Find("frmAccount"); if (!frmAccount) return false; frmAccount->SetIsShow(false); frmAccount->evtEntrustMouseEvent = _evtLoginFrm; chkID = (CCheckBox *)frmAccount->Find("chkID"); m_bSaveAccount = false; if (!chkID) return false; char szChkID[128] = {0}; string strChkID; ifstream inCheck("user\\SavedAccounts\\checkid.dat"); if (inCheck.is_open()) { while (!inCheck.eof()) { inCheck.getline(szChkID, 128); strChkID = szChkID; int nCheck = Str2Int(strChkID); m_bSaveAccount = (nCheck == 1) ? true : false; chkID->SetIsChecked(m_bSaveAccount); } } else { // Si el archivo no existe, establecer el estado del checkbox en false m_bSaveAccount = false; chkID->SetIsChecked(m_bSaveAccount); } edtID = dynamic_cast<CEdit*>(frmAccount->Find("edtID")); if (!edtID) return false; m_sSaveAccount = ""; ifstream in("user\\SavedAccounts\\accounts.dat"); if (in.is_open()) { string line; getline(in, line); istringstream iss(line); getline(iss, m_sSaveAccount, ':'); edtID->SetCaption(m_sSaveAccount.c_str()); edtID->evtEnter = _evtEnter; edtID->SetIsWrap(true); in.close(); } else { // Manejar caso en el que no se puede leer el archivo de cuenta ofstream outUsername("user\\SavedAccounts\\accounts.dat"); if (outUsername.is_open()) { outUsername << ""; outUsername.close(); } } // Leer la cuenta y la contraseña encriptada desde el archivo ifstream inAccounts("user\\SavedAccounts\\accounts.dat"); if (inAccounts.is_open()) { string line; getline(inAccounts, line); // Dividir la línea en la cuenta y la contraseña encriptada size_t pos = line.find(":"); if (pos != string::npos) { string username = line.substr(0, pos); string encryptedPassword = line.substr(pos + 1); // Desencriptar la contraseña string key = "myencryptionkey"; // Cambia esta clave por tu clave de cifrado string decryptedPassword = EncryptionUtils::EncryptDecrypt(encryptedPassword, key); // Configurar la interfaz de usuario con la cuenta y la contraseña desencriptada edtID = dynamic_cast<CEdit*>(frmAccount->Find("edtID")); if (edtID) { edtID->SetCaption(username.c_str()); edtID->evtEnter = _evtEnter; edtID->SetIsWrap(true); } edtPassword = dynamic_cast<CEdit*>(frmAccount->Find("edtPassword")); if (edtPassword) { edtPassword->SetIsPassWord(false); edtPassword->SetIsWrap(true); edtPassword->evtEnter = _evtEnter; m_sPassword = decryptedPassword; edtPassword->SetCaption(m_sPassword.c_str()); } } inAccounts.close(); } //Agregar la interfaz del teclado virtual frmKeyboard = CFormMgr::s_Mgr.Find("frmKeyboard"); if (!frmKeyboard) return false; frmKeyboard->Hide(); chkShift = (CCheckBox*)frmKeyboard->Find("chkShift"); if (!chkShift) return false; //Configurar el manejo de eventos de clic del ratón en la interfaz del teclado virtual frmKeyboard->evtEntrustMouseEvent = _evtKeyboardFromMouseEvent; edtID->evtActive = _evtAccountFocus; edtPassword->evtActive = _evtAccountFocus; imgLogo1 = (CImage*)frmAccount->Find("imgLogo1"); if (!imgLogo1) return false; imgLogo2 = (CImage*)frmAccount->Find("imgLogo2"); if (!imgLogo2) return false; return TRUE; } tengo un problema al tratar de buscar size_t pos = line.find(":"); me da error Access Violation The thread attempted to read from or write to a virtual address for which it does not have the appropriate access c:\users\techi\desktop\client source vs 2003\client\client\src\loginscene.cpp(1063) : Game.exe at CLoginScene::_InitUI() // Leer la cuenta y la contraseña encriptada desde el archivo ifstream inAccounts("user\\SavedAccounts\\accounts.dat"); if (inAccounts.is_open()) { string line; getline(inAccounts, line); // Dividir la línea en la cuenta y la contraseña encriptada size_t pos = line.find(":"); if (pos != string::npos) { string username = line.substr(0, pos); string encryptedPassword = line.substr(pos + 1); // Desencriptar la contraseña string key = "myencryptionkey"; // Cambia esta clave por tu clave de cifrado string decryptedPassword = EncryptionUtils::EncryptDecrypt(encryptedPassword, key); // Configurar la interfaz de usuario con la cuenta y la contraseña desencriptada edtID = dynamic_cast<CEdit*>(frmAccount->Find("edtID")); if (edtID) { edtID->SetCaption(username.c_str()); edtID->evtEnter = _evtEnter; edtID->SetIsWrap(true); } edtPassword = dynamic_cast<CEdit*>(frmAccount->Find("edtPassword")); if (edtPassword) { edtPassword->SetIsPassWord(false); edtPassword->SetIsWrap(true); edtPassword->evtEnter = _evtEnter; m_sPassword = decryptedPassword; edtPassword->SetCaption(m_sPassword.c_str()); } } inAccounts.close(); } esto ocurre cuando accounts.dat esta en blanco Quote Share this post Link to post Share on other sites
deguix 65 Report post Posted February 3 (sry I don't speak spanish) Error happens because line.find(":") is trying to access "line", which is empty when the file is empty, because there are 0 lines in the file. You can try this: while(getline(inAccounts, line)) { codethatuseslinecontent(&line); } "While" will work until getline doesn't return anything (when there are no lines left). 1 Quote Share this post Link to post Share on other sites
IfYouSeeMeRun 7 Report post Posted February 6 I translate.... , el error pasa porque line.find(":") esta intentando acceder a line"/lineas en la que esta vacia ,cuando el archivo esta vacio , por eso ahi 0 lines"/lineas en el archivo Puedes intentatr esto tambien while(getline(inAccounts, line)) { codethatuseslinecontent(&line); } "While" funcionará hasta que getline no devuelva nada (cuando no queden líneas"lines"). Espero que haya servido... 1 Quote Share this post Link to post Share on other sites
dragontechi 70 Report post Posted February 8 @IfYouSeeMeRun@deguixI tried but I still have the same result. The problem you have is directly when you try to search for the character ':' when it gives the error if I have the character ':' in the file the process continues Quote Share this post Link to post Share on other sites
BXlevovich 23 Report post Posted February 8 (edited) @dragontechi std::ifstream inAccounts("user\\SavedAccounts\\accounts.dat"); if (inAccounts.is_open()) { std::string line; std::getline(inAccounts, line); if (!line.empty()) { std::size_t pos = line.find_first_of(":"); if (pos != std::string::npos) { //... } } inAccounts.close(); } Edited February 8 by BXlevovich 1 Quote Share this post Link to post Share on other sites
dragontechi 70 Report post Posted February 9 BOOL CLoginScene::_InitUI() { // Encontrar el formulario de la ruta del logo y ocultarlo si existe frmPathLogo = CFormMgr::s_Mgr.Find("frmPathLogo"); if (!frmPathLogo) return false; frmPathLogo->SetIsShow(false); // Encontrar el formulario de la cuenta y ocultarlo si existe, también asignar el manejador de eventos frmAccount = CFormMgr::s_Mgr.Find("frmAccount"); if (!frmAccount) return false; frmAccount->SetIsShow(false); frmAccount->evtEntrustMouseEvent = _evtLoginFrm; // Encontrar el checkbox de guardar cuenta y configurar su estado chkID = dynamic_cast<CCheckBox*>(frmAccount->Find("chkID")); m_bSaveAccount = false; if (chkID) { ifstream inCheck("user\\SavedAccounts\\checkid.dat"); if (inCheck.is_open()) { char szChkID[128] = { 0 }; while (inCheck.getline(szChkID, 128)) { m_bSaveAccount = (Str2Int(szChkID) == 1); chkID->SetIsChecked(m_bSaveAccount); } } else { m_bSaveAccount = false; chkID->SetIsChecked(m_bSaveAccount); } } // Encontrar los campos de ID y contraseña y salir si alguno de ellos no existe edtID = dynamic_cast<CEdit*>(frmAccount->Find("edtID")); edtPassword = dynamic_cast<CEdit*>(frmAccount->Find("edtPassword")); if (!edtID || !edtPassword) return false; // Inicializar la cadena de la cuenta guardada m_sSaveAccount = ""; // Leer la cuenta guardada desde el archivo ifstream in("user\\SavedAccounts\\accounts.dat"); if (in.is_open()) { string line; if (getline(in, line)) { // Extraer la cuenta guardada y configurar el campo de ID si existe istringstream iss(line); getline(iss, m_sSaveAccount, ':'); if (edtID) { edtID->SetCaption(m_sSaveAccount.c_str()); edtID->evtEnter = _evtEnter; edtID->SetIsWrap(true); } // Configurar el campo de contraseña si existe if (edtPassword) { size_t pos = line.find_first_of(":"); if (pos != string::npos) { string encryptedPassword = line.substr(pos + 1); string key = "myencryptionkey"; string decryptedPassword = EncryptionUtils::EncryptDecrypt(encryptedPassword, key); edtPassword->SetIsPassWord(false); edtPassword->SetIsWrap(true); edtPassword->evtEnter = _evtEnter; m_sPassword = decryptedPassword; edtPassword->SetCaption(m_sPassword.c_str()); } } } in.close(); } else { // Manejar caso en el que no se puede leer el archivo de cuenta ofstream outUsername("user\\SavedAccounts\\accounts.dat"); if (outUsername.is_open()) { outUsername << ""; outUsername.close(); } } // Encontrar el formulario del teclado virtual y ocultarlo si existe frmKeyboard = CFormMgr::s_Mgr.Find("frmKeyboard"); if (!frmKeyboard) return false; frmKeyboard->Hide(); // Encontrar el checkbox de cambio de mayúsculas del teclado virtual CCheckBox* chkShift = dynamic_cast<CCheckBox*>(frmKeyboard->Find("chkShift")); if (!chkShift) return false; // Configurar el manejador de eventos de clic del ratón en el teclado virtual frmKeyboard->evtEntrustMouseEvent = _evtKeyboardFromMouseEvent; // Configurar los manejadores de eventos de activación para los campos de ID y contraseña if (edtID) edtID->evtActive = _evtAccountFocus; if (edtPassword) edtPassword->evtActive = _evtAccountFocus; // Encontrar las imágenes de logotipo en el formulario de la cuenta imgLogo1 = dynamic_cast<CImage*>(frmAccount->Find("imgLogo1")); imgLogo2 = dynamic_cast<CImage*>(frmAccount->Find("imgLogo2")); return true; } Quiero agradecer a todos por su ayuda. Gracias a sus sugerencias y colaboración, pude resolver el problema simplificando y eliminando partes innecesarias del código. La optimización ha mejorado significativamente la legibilidad y eficiencia de la implementación. Estoy muy agradecido por su apoyo y orientación. ¡Muchas gracias de nuevo a todos! I want to thank everyone for their help. Thanks to your suggestions and collaboration, I was able to solve the problem by simplifying and removing unnecessary parts of the code. The optimization has significantly improved the readability and efficiency of the implementation. I am very grateful for your support and guidance. Thanks again to all! 1 Quote Share this post Link to post Share on other sites