【问题标题】:file writing not working after call to open file dialog调用打开文件对话框后文件写入不起作用
【发布时间】:2013-06-05 07:54:37
【问题描述】:

调用以下函数后,我无法写入我尝试过的任何文件 c++ fstream 和 c 的 fopen 出了什么问题,请帮助提前谢谢 我正在使用代码块 mingw windows 7

string openFileDialog(HWND hwnd,char *fileFilter,char *defaultExtension)
{
    string fileName = "";
    OPENFILENAME ofn;
    char szFileName[MAX_PATH] = "";
    ZeroMemory(&ofn, sizeof(ofn));

    ofn.lStructSize = sizeof(OPENFILENAME);
    ofn.hwndOwner = hwnd;
    ofn.lpstrFilter = fileFilter;
    ofn.lpstrFile = szFileName;
    ofn.nMaxFile = MAX_PATH;
    ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
    ofn.lpstrDefExt = defaultExtension;

    if(GetOpenFileName(&ofn)) {
        fileName.assign(szFileName);
    }

    ZeroMemory(&ofn, sizeof(ofn));
    return fileName;
}

【问题讨论】:

  • 您是否检查过您返回的字符串是否有效?当GetOpenFileName 返回FALSE 时会发生什么? 如何打开文件?你为什么在回来之前打电话给ZeroMemory?由于不再使用该结构,因此不需要它。
  • fileFilter 的值是多少?这是一个棘手的问题。还有,为什么不是const 参数?
  • 那么这个函数没有错误,但是你如何处理文件。请告诉我们您如何打开和读取/写入文件。
  • 如果您在对话框中更改文件夹,它将更改您进程的当前文件夹 - 尝试添加 OFN_NOCHANGEDIR 标志。
  • 如果例如fopen 失败,您应该检查 errno。您可以使用例如strerror 获取错误的可打印文本。

标签: c++ c winapi


【解决方案1】:

如果您在对话框中更改文件夹,它将更改您的进程的当前文件夹 - 尝试添加 OFN_NOCHANGEDIR 标志。

【讨论】:

    【解决方案2】:

    试试 CreateFile 和 WriteFile。

    string s = "file.dat";
    
    HANDLE hFile = CreateFile(s.c_str(),       // name of the write
                       GENERIC_WRITE,          // open for writing
                       0,                      // do not share
                       NULL,                   // default security
                       CREATE_ALWAYS,          // Creates a new file, always
                       FILE_ATTRIBUTE_NORMAL,  // normal file
                       NULL);                  // no attr. template
    DWORD writesBytes;
    bool writeok = WriteFile(hFile, &Current_Doc, sizeof(Current_Doc), &writesBytes, NULL);
    
    CloseHandle(hFile);
    

    类似的问题,我的答案在这里:

    OPENFILENAME open dialog

    【讨论】:

    • @marbel82 它通过不更改进程的当前工作目录来解决问题。
    • @bartimar 我已经在 c++ 中创建了我的文件处理类,所以 win32 的文件处理不是一个选项 + 我湖声誉使你的答案有用:p
    猜你喜欢
    • 2015-05-06
    • 2023-04-03
    • 1970-01-01
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-11
    • 1970-01-01
    相关资源
    最近更新 更多