gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 19:07:07 25 4
gpt4 key购买 nike

我有一个无法解决的问题,所以我希望有人帮助我。

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

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);
}
}

最佳答案

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

Each of these functions returns a pointer to the stream. A null pointer value indicates an error.

[..]

If execution is allowed to continue, these functions return NULL and set errno to EINVAL.

确保检查errno并查看根本错误是什么。

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

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

您将值分配给*stream,但检查stream。该文件无法使用写入权限打开,但您从未注意到这一点。

关于c - 函数 '_fsopen' 不适用于写入文件。 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47139417/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com