我遇到了一个我无法解决的问题,因此我希望有人帮助我。
我编写了我的函数,打开文件并检查错误。
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);
}
}
答案 0 :(得分:1)
问题在于_fsopen
方法失败。来自MSDN:
这些函数中的每一个都返回一个指向流的指针。空指针值表示错误。
[..]
如果允许继续执行,则这些函数返回NULL并将errno设置为EINVAL。
请务必检查errno
并查看潜在的错误。
此外,请注意您没有检查实际的返回值:
*stream = _fsopen(szOpenedFileName, mode, _SH_DENYNO);
if (stream == NULL)
您将值指定给*stream
,但请检查stream
。该文件无法以写权限打开,但您从未注意到这一点。