c++ mfc visual-studio-2012 getline

c++ - Getline error MFC vs2012(msvcp110.dll)



visual-studio-2012 (5)

Tengo un problema para usar la función std :: getline en vs2012 con una aplicación MFC. El mismo código se estaba ejecutando en vs2010, por eso estoy seguro de que no es un problema con el código en sí.

void AddImage::OnClickedIdbAiRegistration(){ CFileDialog file(TRUE, NULL, NULL, OFN_OVERWRITEPROMPT, "(*.dat)|*.dat||"); file.DoModal(); UpdateData(); m_ai_file=file.GetPathName(); UpdateData(FALSE); std::string buf=m_ai_file; if(filecnt(buf, "Dat")){ std::ifstream file(buf); AfxMessageBox(buf.c_str()); std::getline(file, buf);//Here is my problem AfxMessageBox(buf.c_str()); file.close(); } }

El primer AfxMessageBox devuelve el archivo (que es correcto y un archivo ASCII válido). El segundo AfxMessageBox nunca lo alcanzo porque getline produce:

Excepción no controlada en 0x000007FEF7B4AAEE (msvcp110.dll) en program.exe: 0xC0000005: ubicación de lectura de violación de acceso 0xFFFFFFFFFFFFFFFF.

y vs11 me redirigen a la línea xiosbase 443

locale __CLR_OR_THIS_CALL getloc() const { // get locale return (*_Ploc);/*THIS IS LINE 443*/ }

Para la propiedad del proyecto, estoy usando "Usar MFC en un dll compartido" y "DLL de subprocesos múltiples" y el Sub-sistema "Windows"

Código de programa adicional e incluye:

#include <afxwin.h> #include <afxframewndex.h> #include <afxcmn.h> #include <afxdialogex.h> #include <iostream> #include <string> #include <sstream> #include <regex> #include <fstream> #include <time.h> #include <Windows.h> usign namespace std; class AddImage:public CDialog{ DECLARE_DYNAMIC(AddImage) public: AddImage(CWnd* pParent = NULL); virtual ~AddImage(); enum {IDD=IDD_ADD_IMAGE}; protected: virtual void DoDataExchange(CDataExchange* pDX); DECLARE_MESSAGE_MAP() public: CString m_ai_file; }; AddImage::AddImage(CWnd* pParent):CDialog(AddImage::IDD, pParent){ m_ai_file=_T(""); } AddImage::~AddImage(){ } bool filecnt(string path, string type){ if(filepathcnt(path, type)){ if(GetFileAttributes(path.c_str())==-1){ return(FALSE); } else{ return(TRUE); } } else{ return(FALSE); } } bool filepathcnt(string path, string type){ if(type==""){ tr1::regex regex("[[:print:]]+//.[[:alnum:]]+"); if(regex_match(path.begin(), path.end(), regex)){ return(TRUE); } else{ return(FALSE); } } else if(type=="-"){ tr1::regex regex("[[:print:]]+"); if(regex_match(path.begin(), path.end(), regex)){ return(TRUE); } else{ return(FALSE); } } else{ string upper=type; string lower=type; transform(upper.begin(), upper.end(), upper.begin(), toupper); transform(lower.begin(), lower.end(), lower.begin(), tolower); tr1::regex norm_regex("[[:print:]]+//."+type); tr1::regex upper_regex("[[:print:]]+//."+upper); tr1::regex lower_regex("[[:print:]]+//."+lower); if(regex_match(path.begin(), path.end(), upper_regex) || regex_match(path.begin(), path.end(), lower_regex) || regex_match(path.begin(), path.end(), norm_regex)){ return(TRUE); } else{ return(FALSE); } } }

Alguien una idea de lo que está mal?


Cuando abre un objeto de archivo, siempre debe asegurarse de que sea válido antes de intentar usarlo.

if (file.bad()) AfxMessageBox("Bad file"); else { // existing code follows

PD: tiene dos objetos denominados file en el mismo bloque de código. Por favor, no hagas eso, es potencialmente confuso incluso si el compilador puede mantenerlo en línea.


Primero, simplifiquemos el problema:

simplemente codifique la ruta y ejecútela en un nuevo proyecto de consola: (agregué más código de protección)

String buf="the data file path"; std::ifstream file(buf); if(!file.is_open()) return FALSE; while(file.good()) { cout << buf << endl; std::getline(file, buf); cout << buf << endl; } file.close();

¿Cual es el resultado? si el problema persiste, puede establecer un punto de depuración en el segundo cout << buf << endl para verificar si buf tiene asignado un valor.

También debe proteger FileDialog de la siguiente manera: o una vez haga clic en ''cancelar'', fallará.

(dlg.DoModal()==IDOK) FilePathName=dlg.GetPathName(); //....other opertiaon }


Tal vez no sea una buena idea escribir el contenido de la línea en la cadena que contenía la ruta al archivo anteriormente. Pruebe lo siguiente:

CString csFilePath("C://example.txt"); ifstream infile; infile.open(csFilePath); std::string strLine; std::getline(infile, strLine);

Por cierto, ¿copió y pegó su código? Como escribiste:

usign namespace std;

en lugar de usar namespace std;


He resuelto el problema ahora usando VS10. Allí el algoritmo funciona sin problemas. ¡Pero no creo que esta pueda ser la solución!

Que funcione con vs10 en la misma PC también me dice que no es un problema con la PC.


Estaba funcionando y ya no está.

Cambie el indicador de compilación (en el proyecto Propiedades> Propiedades de configuración> C ++> Generación de código> Biblioteca de tiempo de ejecución) de /MD (DLL de subprocesos múltiples) a /MDd (DLL de depuración multihebra), para las configuraciones de depuración y liberación.

Esto debería funcionar en VisualStudio 2012 al menos.