ifstream没有从getopenfilename打开文件名

时间:2017-07-20 19:19:07

标签: c++ winapi fstream

业余程序员在这里。我今天的问题是我正在尝试加载.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打开。

1 个答案:

答案 0 :(得分:3)

问题的根源是您尝试使用Win32 API(CreateFile())和标准库(std::ifstream)打开文件。

通过查看CreateFile()来电和documentation,可以看到您正在将0传递给dwShareMode参数,其描述说明:

  

如果此参数为零且CreateFile成功,则无法共享文件或设备,并且在关闭文件或设备的句柄之前无法再次打开文件或设备。

但是,在该调用之后,您继续尝试通过std::ifstream打开文件,由于上述原因而失败,并且您只检查ifstream是否成功打开文件。

如果您只使用CreateFile()std::ifstream,而不是两者都使用,则可以避免此问题。