业余程序员在这里。我今天的问题是我正在尝试加载.txt文件以显示在对话框的编辑框中。
在我开始使用代码之前:我可以通过指定文件位置并绕过getopenfilename的加载对话框来使其工作,并且它可以正常工作。但是当我从getopenfilename获取该文件位置时,我似乎无法工作。
相关代码是:
ZeroMemory(&ofn, sizeof(ofn));
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hDlg;
ofn.lpstrFile = szFile;
ofn.lpstrFile[0] = '\0';
ofn.nMaxFile = sizeof(szFile);
ofn.lpstrFilter = "All\0*.*\0Text\0*.TXT\0";
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
if (GetOpenFileName(&ofn) == TRUE)
{
hf = CreateFile(ofn.lpstrFile, GENERIC_READ, 0, LPSECURITY_ATTRIBUTES)NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, (HANDLE)NULL);
ifstream inFile(ofn.lpstrFile);
if (!inFile)
MessageBox(0, "CAN'T OPEN FILE", "ALERT", MB_OK | MB_ICONWARNING);
else
{
string text;
while(getline(inFile, text));
inFile.close();
MessageBox(0, text.c_str(), "msg", MB_OK);
SetWindowText(editbox, text.c_str());
}
CloseHandle(hf);
hf = INVALID_HANDLE_VALUE;
我是一个新手,但我一直在捣乱我的大脑和我的谷歌酒吧试图解决这个问题。
它永远不会通过fstream打开。
答案 0 :(得分:3)
问题的根源是您尝试使用Win32 API(CreateFile()
)和标准库(std::ifstream
)打开文件。
通过查看CreateFile()
来电和documentation,可以看到您正在将0
传递给dwShareMode
参数,其描述说明:
如果此参数为零且CreateFile成功,则无法共享文件或设备,并且在关闭文件或设备的句柄之前无法再次打开文件或设备。
但是,在该调用之后,您继续尝试通过std::ifstream
打开文件,由于上述原因而失败,并且您只检查ifstream
是否成功打开文件。
如果您只使用CreateFile()
或std::ifstream
,而不是两者都使用,则可以避免此问题。