函数'_fsopen'不适用于写入文件。 C

时间:2017-11-06 14:41:38

标签: c winapi io

我遇到了一个我无法解决的问题,因此我希望有人帮助我。

我编写了我的函数,打开文件并检查错误。

BOOLEAN openFile(HWND hwnd, FILE **stream, const char *szOpenedFileName, const char *mode)
{
    //errno_t err = fopen_s(&(*stream), szOpenedFileName, mode);
    //errno_t err = _fsopen(szOpenedFileName, mode, _SH_DENYNO); gets err = 13 with write in file   
    //*stream = fopen(szOpenedFileName, mode);
    *stream = _fsopen(szOpenedFileName, mode, _SH_DENYNO);
    if (stream == NULL)
    //if (err)
    {
        char text[512];
        sprintf_s(text, 512, "Не удалось открыть файл \"%s\".", szOpenedFileName);
        MessageBox(hwnd, text, "Ошибка", MB_OK | MB_ICONERROR);

        return FALSE;
    }

    return TRUE;
}

当我从文件中读取时,该功能正常,但是当我想在文件中写入时,我遇到了the image中显示的问题。

全局变量:

OPENFILENAME ofn;
char szOpenedFileName[MAX_PATH] = "";
OPENFILENAME sfn;
char szSavedFileName[MAX_PATH] = "";

FILE *stream;

对于打开文件和阅读我使用

if (GetOpenFileName(&ofn)) //Действие, после выбора в диалоговом окне файла для открытия
{                       
  char *fileText;
    char paragraph[512];                        

    if (openFile(hwnd, &stream, szOpenedFileName, "r"))                     
    {                               
      for (unsigned i = 0; fgets(paragraph, 512, stream) != NULL; i++)
        {                           
          if (i == 0)
            {
              // Выделение памяти на 3 байт больше, так как необходимо хранить терминальный символ
                // и добавленные символы "\r"
                fileText = (char*)calloc(strlen(paragraph) + 3, sizeof(char));  
                strcpy_s(fileText, strlen(paragraph) + 1, paragraph);   
                append(fileText, "\r", strlen(fileText) - 1);
            }
            else
            {   
            // Выделение памяти на 4 байта больше, так как необходимо хранить
            // терминальные символы 2-х строк и добавленные символы "\r"
                fileText = (char*)realloc(fileText, strlen(fileText) + strlen(paragraph) + 4);   
                append(paragraph, "\r", strlen(paragraph) - 1);
                append(fileText, paragraph, strlen(fileText));
            }
        }

        SetDlgItemText(hwnd, IDC_MAIN_EDIT, fileText);                                                  
        SetFocus(hEdit);

        free(fileText);
        fclose(stream);
    }                       
}

对于保存文件和写作我使用

if (GetSaveFileName(&sfn))
{
  HANDLE hFile;                         

    hFile = CreateFile(szSavedFileName, GENERIC_WRITE,        FILE_SHARE_READ, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

  if (hFile != INVALID_HANDLE_VALUE)
    {
      DWORD dwTextLength;

      dwTextLength = GetWindowTextLength(hEdit);
        //Если есть, что сохранять
        if (dwTextLength > 0)
        {
          if (openFile(hwnd, &stream, szSavedFileName, "w"))
            {       
            char *editText;

                editText = (char*)calloc(dwTextLength + 1, 1);
                GetDlgItemText(hwnd, IDC_MAIN_EDIT, editText, dwTextLength + 1);
                fwrite(editText, 1, sizeof(editText), stream);

                free(editText);
                fclose(stream);
            }
        }
        CloseHandle(hFile);
    }
    else
    {
      char text[512];
        sprintf_s(text, 512, "Не удалось создать файл \"%s\".", szSavedFileName);
        MessageBox(hwnd, text, "Ошибка", MB_OK | MB_ICONERROR);
    }
}

1 个答案:

答案 0 :(得分:1)

问题在于_fsopen方法失败。来自MSDN

  

这些函数中的每一个都返回一个指向流的指针。空指针值表示错误。

     

[..]

     

如果允许继续执行,则这些函数返回NULL并将errno设置为EINVAL。

请务必检查errno并查看潜在的错误。

此外,请注意您没有检查实际的返回值:

*stream = _fsopen(szOpenedFileName, mode, _SH_DENYNO);
if (stream == NULL)

您将值指定给*stream,但请检查stream。该文件无法以写权限打开,但您从未注意到这一点。