設置 | 登錄 | 註冊

作者共發了4篇帖子。

【表格】fopen的打開方式與CreateFile函數的對應關係

1樓 巨大八爪鱼 2016-6-24 22:23
2樓 巨大八爪鱼 2016-6-24 22:24
打開方式   DesiredAccess   CreationDisposition   備註  
rb   GENERIC_READ   OPEN_EXISTING     
rb+   GENERIC_READ | GENERIC_WRITE   OPEN_EXISTING     
wb   GENERIC_WRITE   CREATE_ALWAYS     
wb+   GENERIC_READ | GENERIC_WRITE   CREATE_ALWAYS     
ab   GENERIC_WRITE   OPEN_ALWAYS   打開後調用SetFilePointer(hFile, 0, 0, FILE_END);  
ab+   GENERIC_READ | GENERIC_WRITE   OPEN_ALWAYS   同上  
3樓 巨大八爪鱼 2016-6-24 22:28
【示例程序】
#include <strsafe.h>
#include <Windows.h>

void print(LPCSTR str)
{
    WriteConsoleA(GetStdHandle(STD_OUTPUT_HANDLE), str, lstrlenA(str), NULL, NULL);
}

void uprint(LPCTSTR str)
{
    WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), str, lstrlen(str), NULL, NULL);
}

int main(void)
{
    DWORD dwNum, dwSize;
    HANDLE hFile, hHeap;
    LPSTR lpData;
    TCHAR str[100];

    hFile = CreateFile(TEXT("file.txt"), GENERIC_READ | GENERIC_WRITE, (DWORD)NULL, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); // 使用ab+方式打開文件, 但不把指針移到文件末尾
    if (hFile == INVALID_HANDLE_VALUE)
    {
        uprint(TEXT("無法打開文件\n"));
        return 1;
    }

    dwSize = GetFileSize(hFile, NULL);
    StringCbPrintf(str, sizeof(str), TEXT("文件大小: %d字節\n"), dwSize); // 相當於sprintf
    uprint(str);

    uprint(TEXT("文件內容: \n"));
    hHeap = GetProcessHeap();
    lpData = (LPSTR)HeapAlloc(hHeap, (DWORD)NULL, dwSize + 1); // 相當於malloc
    if (lpData != NULL)
    {
        ReadFile(hFile, lpData, dwSize, &dwNum, NULL); // 相當於fread, 但是第4個參數不能為NULL
        *(lpData + dwSize) = '\0';
        print(lpData);
        HeapFree(hHeap, (DWORD)NULL, lpData); // 相當於free
    }
    else
        uprint(TEXT("讀取失敗, 內存不足! \n"));

    WriteFile(hFile, "New Content\r\n", 13, &dwNum, NULL); // 相當於fwrite, 但是第4個參數不能為NULL

    CloseHandle(hFile); // 相當於fclose
    return 0;
}
4樓 巨大八爪鱼 2016-6-24 22:34
dwNum = SetFilePointer(hFile, 0, 0, FILE_CURRENT); // 相當於ftell
StringCbPrintf(str, sizeof(str), TEXT("當前指針位置: %d\n"), dwNum);
uprint(str);

內容轉換:

回覆帖子
內容:
用戶名: 您目前是匿名發表。
驗證碼:
看不清?換一張
©2010-2025 Purasbar Ver3.0 [手機版] [桌面版]
除非另有聲明,本站採用知識共享署名-相同方式共享 3.0 Unported許可協議進行許可。