Ошибка Getline MFC vs2012 (msvcp110.dll)

У меня проблема с использованием функции std :: getline в vs2012 с приложением MFC. Тот же код был запущен в vs2010, поэтому я уверен, что это не проблема самого кода.

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();
}
}

Первый AfxMessageBox возвращает путь к файлу (который является правильным и допустимым ASCII-файлом). Второй AfxMessageBox я никогда не достигну, потому что getline производит:

Необработанное исключение в 0x000007FEF7B4AAEE (msvcp110.dll) в program.exe: 0xC0000005: Место чтения нарушения доступа 0xFFFFFFFFFFFFFFFF.

и vs11 перенаправить меня на линию xiosbase 443

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

Для свойства проекта я использую «Использовать MFC в общей DLL» и «Многопоточная DLL» и подсистему «Windows»

Дополнительный программный код и включает в себя:

#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);
}
}
}

Есть идеи, что не так?

1

Решение

Я решил проблему с помощью VS10. Там алгоритм работает без проблем. Но я не думаю, что это может быть решением!

То, что он работает с vs10 на том же ПК, говорит мне также, что это не проблема с ПК.

1

Другие решения

Когда вы открываете объект файла, вы всегда должны убедиться, что он действителен, прежде чем пытаться его использовать.

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

Постскриптум У вас есть два объекта с именем file в том же блоке кода. Пожалуйста, не делайте этого, это может сбить с толку, даже если компилятор может сделать это прямо.

0

Для начала давайте упростим вопрос:

просто жестко запишите путь и запустите его в новом консольном проекте: (я добавил больше кода защиты)


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();

Что в итоге? если проблема не устранена, вы можете установить точку отладки на втором сеансе << ЬиЕ << endl, чтобы проверить, присваивается ли buf значение.

Вы также должны защитить FileDialog следующим образом: или, если вы нажмете «отмена», произойдет сбой.


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

0

Может быть, не стоит писать содержимое строки в строке, которая раньше содержала путь к файлу. Попробуйте следующее:

CString csFilePath("C:\\example.txt");
ifstream infile;
infile.open(csFilePath);

std::string strLine;
std::getline(infile, strLine);

Кстати, вы скопировали и вставили свой код? Как вы написали:

usign namespace std;

вместо с помощью пространство имен std;

0

Это работало и больше не работает.

Измените флаг компиляции (в свойствах проекта> Свойства конфигурации> C ++> Генерация кода> Библиотека времени выполнения) с /MD (многопоточная DLL) для /MDd (многопоточная отладочная DLL), для обоих Debug & Выпуск конфигурации.

Это должно работать в VisualStudio 2012 по крайней мере.

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector