欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++文件相關(guān)函數(shù)CreateFile|ReadFile|WriteFile用法詳解

 更新時(shí)間:2023年04月27日 11:26:39   作者:Thomas_Lbw  
這篇文章主要為大家詳細(xì)介紹了c++有關(guān)文件創(chuàng)建、讀取和寫入的api:CreateFile、ReadFile、WriteFile的具體使用,需要的可以參考下

一、CreateFile

1.1 函數(shù)原型

CreateFile 函數(shù)是 Windows API 中用于創(chuàng)建文件、目錄、管道、控制臺(tái)輸入/輸出緩沖區(qū)或遠(yuǎn)程 IO 設(shè)備的函數(shù)。它位于 <windows.h> 頭文件中,函數(shù)原型如下:

HANDLE CreateFile(
  LPCTSTR lpFileName,
  DWORD dwDesiredAccess,
  DWORD dwShareMode,
  LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  DWORD dwCreationDisposition,
  DWORD dwFlagsAndAttributes,
  HANDLE hTemplateFile
);

1.2 函數(shù)參數(shù)介紹

CreateFile 函數(shù)的參數(shù)說明如下:

lpFileName:指定文件名的字符串指針。

dwDesiredAccess:指定文件的訪問模式??梢允窍铝兄抵唬?/p>

  • GENERIC_READ:可以讀取文件。
  • GENERIC_WRITE:可以寫入文件。
  • GENERIC_EXECUTE:可以執(zhí)行文件。

dwShareMode:指定文件的共享模式。可以是下列值之一:

  • FILE_SHARE_READ:允許其他進(jìn)程讀取文件。
  • FILE_SHARE_WRITE:允許其他進(jìn)程寫入文件。
  • FILE_SHARE_DELETE:允許其他進(jìn)程刪除文件。

lpSecurityAttributes:指定文件的安全屬性。如果設(shè)為 NULL,則使用默認(rèn)安全描述符。

dwCreationDisposition:指定如何創(chuàng)建文件。可以是下列值之一:

  • CREATE_NEW:如果文件不存在,則創(chuàng)建新文件;否則,返回 ERROR_FILE_EXISTS 錯(cuò)誤。
  • TRUNCATE_EXISTING:如果文件存在,則截?cái)辔募?;否則,返回 ERROR_FILE_NOT_FOUND 錯(cuò)誤。

dwFlagsAndAttributes:指定文件的屬性??梢允窍铝兄抵唬?/p>

  • FILE_ATTRIBUTE_NORMAL:普通文件。
  • FILE_ATTRIBUTE_READONLY:只讀文件。
  • FILE_ATTRIBUTE_HIDDEN:隱藏文件。
  • FILE_ATTRIBUTE_SYSTEM:系統(tǒng)文件。

hTemplateFile:指定用于創(chuàng)建文件的模板文件句柄。如果沒有模板文件,則設(shè)為 NULL。

如果 CreateFile 函數(shù)調(diào)用成功,則返回一個(gè)文件句柄;如果調(diào)用失敗,則返回一個(gè)特殊的值 INVALID_HANDLE_VALUE,并可以使用 GetLastError 函數(shù)獲取錯(cuò)誤代碼。

1.3 示例代碼

#include <windows.h>
#include <iostream>
int main() {
  // 指定文件名和訪問模式
  HANDLE hFile = CreateFile(L"test.txt",
                             GENERIC_WRITE,
                             0,  // 不共享
                             NULL,  // 默認(rèn)安全描述符
                             CREATE_ALWAYS,  // 如果文件存在,則覆蓋
                             FILE_ATTRIBUTE_NORMAL,  // 文件屬性
                             NULL);  // 沒有模板文件
  if (hFile == INVALID_HANDLE_VALUE) {
    std::cerr << "Error creating file: " << GetLastError() << std::endl;
    return 1;
  }
  std::cout << "File created successfully." << std::endl;
  // 關(guān)閉文件句柄
  CloseHandle(hFile);
  return 0;
}

二、ReadFile

2.1 函數(shù)原型

在 C++ 中,可以使用 ReadFile 函數(shù)從文件中讀取數(shù)據(jù)。這個(gè)函數(shù)位于 <windows.h> 頭文件中,并且需要提供文件句柄、緩沖區(qū)地址和要讀取的字節(jié)數(shù)。

ReadFile 函數(shù)的函數(shù)原型如下:

BOOL ReadFile(
  HANDLE hFile,
  LPVOID lpBuffer,
  DWORD nNumberOfBytesToRead,
  LPDWORD lpNumberOfBytesRead,
  LPOVERLAPPED lpOverlapped
);

2.2 函數(shù)參數(shù)介紹

ReadFile 函數(shù)的參數(shù)說明如下:

hFile:指定要讀取的文件的句柄。

lpBuffer:指向存儲(chǔ)讀取數(shù)據(jù)的緩沖區(qū)的指針。

nNumberOfBytesToRead:指定要讀取的字節(jié)數(shù)。

lpNumberOfBytesRead:指向一個(gè)變量的指針,用于返回實(shí)際讀取的字節(jié)數(shù)。

lpOverlapped:指定用于異步 I/O 的數(shù)據(jù)結(jié)構(gòu)的指針。如果不使用異步 I/O,則設(shè)為 NULL。

在使用完文件后,應(yīng)調(diào)用 CloseHandle 函數(shù)來關(guān)閉文件句柄,以釋放系統(tǒng)資源。

2.3  示例代碼

在這個(gè)例子中,我們打開了一個(gè)名為 test.txt 的文件,并以讀取模式打開了它。然后,我們調(diào)用 ReadFile 函數(shù)讀取文件中的數(shù)據(jù),并將其存儲(chǔ)在緩沖區(qū)中。注意,ReadFile 函數(shù)的第四個(gè)參數(shù)是一個(gè)輸出參數(shù),用于返回實(shí)際讀取的字節(jié)數(shù)。如果調(diào)用失敗,則函數(shù)返回 FALSE 并可以使用 GetLastError 函數(shù)獲取錯(cuò)誤代碼。

#include <windows.h>
#include <iostream>
int main() {
  // 打開文件
  HANDLE hFile = CreateFile(L"test.txt",
                             GENERIC_READ,
                             0,  // 不共享
                             NULL,  // 默認(rèn)安全描述符
                             OPEN_EXISTING,  // 只能打開已存在的文件
                             FILE_ATTRIBUTE_NORMAL,  // 文件屬性
                             NULL);  // 沒有模板文件
  if (hFile == INVALID_HANDLE_VALUE) {
    std::cerr << "Error opening file: " << GetLastError() << std::endl;
    return 1;
  }
  // 定義緩沖區(qū)和讀取的字節(jié)數(shù)
  char buffer[1024];
  DWORD bytesRead;
  // 從文件中讀取數(shù)據(jù)
  if (!ReadFile(hFile, buffer, sizeof(buffer), &bytesRead, NULL)) {
    std::cerr << "Error reading file: " << GetLastError() << std::endl;
    return 1;
  }
  std::cout << "Read " << bytesRead << " bytes from file." << std::endl;
  // 關(guān)閉文件句柄
  CloseHandle(hFile);
  return 0;
}

三、WriteFile

在 C++ 中,可以使用 WriteFile 函數(shù)向文件中寫入數(shù)據(jù)。這個(gè)函數(shù)位于 <windows.h> 頭文件中,并且需要提供文件句柄、緩沖區(qū)地址和要寫入的字節(jié)數(shù)。

3.1 函數(shù)原型

BOOL WriteFile(
  HANDLE hFile,
  LPCVOID lpBuffer,
  DWORD nNumberOfBytesToWrite,
  LPDWORD lpNumberOfBytesWritten,
  LPOVERLAPPED lpOverlapped
);

3.2 函數(shù)參數(shù)

WriteFile 函數(shù)的參數(shù)說明如下:

hFile:指定要寫入的文件的句柄。

lpBuffer:指向包含要寫入的數(shù)據(jù)的緩沖區(qū)的指針。

nNumberOfBytesToWrite:指定要寫入的字節(jié)數(shù)。

lpNumberOfBytesWritten:指向一個(gè)變量的指針,用于返回實(shí)際寫入的字節(jié)數(shù)。

lpOverlapped:指定用于異步 I/O 的數(shù)據(jù)結(jié)構(gòu)的指針。如果不使用異步 I/O,則設(shè)為 NULL。

在使用完文件后,應(yīng)調(diào)用 CloseHandle 函數(shù)來關(guān)閉文件句柄,以釋放系統(tǒng)資源。

3.3 示例代碼

下面是一個(gè)簡(jiǎn)單的例子,展示了如何使用 WriteFile 函數(shù)向文件中寫入數(shù)據(jù):

#include <windows.h>
#include <iostream>
int main() {
  // 打開文件
  HANDLE hFile = CreateFile(L"test.txt",
                             GENERIC_WRITE,
                             0,  // 不共享
                             NULL,  // 默認(rèn)安全描述符
                             CREATE_ALWAYS,  // 如果文件存在,則覆蓋
                             FILE_ATTRIBUTE_NORMAL,  // 文件屬性
                             NULL);  // 沒有模板文件
  if (hFile == INVALID_HANDLE_VALUE) {
    std::cerr << "Error opening file: " << GetLastError() << std::endl;
    return 1;
  }
  // 定義緩沖區(qū)和寫入的字節(jié)數(shù)
  char buffer[] = "Hello, world!";
  DWORD bytesWritten;
  // 向文件中寫入數(shù)據(jù)
  if (!WriteFile(hFile, buffer, sizeof(buffer), &bytesWritten, NULL)) {
    std::cerr << "Error writing to file: " << GetLastError() << std::endl;
    return 1;
  }
  std::cout << "Wrote " << bytesWritten << " bytes to file." << std::endl;
  // 關(guān)閉文件句柄
  CloseHandle(hFile);
  return 0;
}

在這個(gè)例子中,我們打開了一個(gè)名為 test.txt 的文件,并以寫入模式打開了它。然后,我們調(diào)用 WriteFile 函數(shù)向文件中寫入數(shù)據(jù),并將數(shù)據(jù)存儲(chǔ)在緩沖區(qū)中。

注意,WriteFile 函數(shù)的第四個(gè)參數(shù)是一個(gè)輸出參數(shù),用于返回實(shí)際寫入的字節(jié)數(shù)。如果調(diào)用失敗,則函數(shù)返回 FALSE 并可以使用 GetLastError 函數(shù)獲取錯(cuò)誤代碼。

四、三個(gè)api一起用示例代碼

#include <windows.h>
#include <iostream>
int main() {
  // 打開輸入文件
  HANDLE hInFile = CreateFile(L"in.txt",
                               GENERIC_READ,
                               0,  // 不共享
                               NULL,  // 默認(rèn)安全描述符
                               OPEN_EXISTING,  // 只能打開已存在的文件
                               FILE_ATTRIBUTE_NORMAL,  // 文件屬性
                               NULL);  // 沒有模板文件
  if (hInFile == INVALID_HANDLE_VALUE) {
    std::cerr << "Error opening input file: " << GetLastError() << std::endl;
    return 1;
  }
  // 打開
    HANDLE hOutFile = CreateFile(L"out.txt",
                                 GENERIC_WRITE,
                                 0, // 不共享
                                 NULL, // 默認(rèn)安全描述符 
                                 CREATE_ALWAYS, // 如果文件存在,則覆蓋
                                 FILE_ATTRIBUTE_NORMAL, // 文件屬性
                                 NULL); // 沒有模板文件
    if (hOutFile == INVALID_HANDLE_VALUE) {
        std::cerr << "Error opening output file: " << GetLastError() << std::endl;
    return 1;
    }
    // 定義緩沖區(qū)和讀取/寫入的字節(jié)數(shù)
    char buffer[1024];
    DWORD bytesRead, bytesWritten;
    // 讀取輸入文件并寫入輸出文件
    while (ReadFile(hInFile, buffer, sizeof(buffer), &bytesRead, NULL) && bytesRead > 0) {
    if (!WriteFile(hOutFile, buffer, bytesRead, &bytesWritten, NULL)) {
        std::cerr << "Error writing to output file: " << GetLastError() <<             std::endl;
    return 1;
        }
    }
// 關(guān)閉文件句柄
    CloseHandle(hInFile);
    CloseHandle(hOutFile);
    return 0;
}

提示

另外,windows api讀取出來的字符是寬字節(jié),某些情況下與C++標(biāo)準(zhǔn)輸出可能不一致,這方面在字符加密、流化等操作上會(huì)出現(xiàn)問題,所以如果有兼容要求建議使用C++標(biāo)準(zhǔn)輸入、輸出。

如果要寫入文本文件,可以使用 C++ 標(biāo)準(zhǔn)庫(kù)中的 fstream 頭文件中的流類型,例如 ofstream 和 wofstream。這些類型提供了較為方便的寫入接口,可以直接使用運(yùn)算符 << 寫入數(shù)據(jù)。下面是一個(gè)示例代碼,展示了如何使用 ofstream 類寫入文本文件:

#include <fstream>
#include <iostream>
int main() {
  // 打開文件
  std::ofstream out("test.txt");
  if (!out) {
    std::cerr << "Error opening file." << std::endl;
    return 1;
  }
  // 寫入數(shù)據(jù)
  out << "Hello, world!" << std::endl;
  // 關(guān)閉文件
  out.close();
  return 0;
}

在這個(gè)例子中,我們打開了一個(gè)名為 test.txt 的文件,并使用運(yùn)算符 << 向文件中寫入了一行字符串。在使用完文件后,我們調(diào)用了 close 方法來關(guān)閉文件。

注意,如果要寫入 Unicode 字符串,可以使用 wofstream 類。

最后,需要注意,在 Windows 系統(tǒng)中,文件名是區(qū)分大小寫的。因此,在打開文件時(shí),需要確保文件名正確。

以上就是C++文件相關(guān)函數(shù)CreateFile|ReadFile|WriteFile用法詳解的詳細(xì)內(nèi)容,更多關(guān)于C++文件函數(shù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • c++ string的erase刪除方法

    c++ string的erase刪除方法

    這篇文章主要介紹了c++ string的erase刪除方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • C語言內(nèi)存函數(shù) memcpy,memmove ,memcmp

    C語言內(nèi)存函數(shù) memcpy,memmove ,memcmp

    這篇文章主要介紹了C語言內(nèi)存函數(shù) memcpy,memmove ,memcmp,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • C語言實(shí)現(xiàn)井字棋(三子棋)

    C語言實(shí)現(xiàn)井字棋(三子棋)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)井字棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • C++示例講解初始化列表方法

    C++示例講解初始化列表方法

    這篇文章主要介紹了C++成員初始化列表,除了可以使用構(gòu)造函數(shù)對(duì)類成員進(jìn)行初始化之外,C++還提供了另外一種初始化的方法,叫做成員初始化列表。下面來看看文章的詳細(xì)吧,需要的朋友可以參考一下
    2022-07-07
  • C語言中如何判斷質(zhì)數(shù)

    C語言中如何判斷質(zhì)數(shù)

    這篇文章主要介紹了C語言中的判斷質(zhì)數(shù)問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 如何將C++源程序改寫為C語言

    如何將C++源程序改寫為C語言

    C++中主要的與C的區(qū)別最大而且最常用的特性及修改方法,接下來我們一起來學(xué)習(xí)他們吧
    2021-08-08
  • c++如何將一個(gè)char轉(zhuǎn)化為string

    c++如何將一個(gè)char轉(zhuǎn)化為string

    這篇文章主要介紹了c++如何將一個(gè)char轉(zhuǎn)化為string問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C++實(shí)現(xiàn)四則運(yùn)算器(無括號(hào))

    C++實(shí)現(xiàn)四則運(yùn)算器(無括號(hào))

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)四則運(yùn)算器,無括號(hào)的計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • 詳解C++ 中的臨時(shí)對(duì)象

    詳解C++ 中的臨時(shí)對(duì)象

    這篇文章主要介紹了C++ 中的臨時(shí)對(duì)象的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下
    2020-08-08
  • C++圖文并茂分析講解模板

    C++圖文并茂分析講解模板

    C++語言的模板技術(shù)包括函數(shù)模板和類模板,模板技術(shù)是一種代碼重用技術(shù),函數(shù)和類是C++語言中兩種主要的重用代碼形式,這篇文章主要介紹了C++函數(shù)模板和類模板,需要的朋友可以參考下
    2022-09-09

最新評(píng)論