C++文件相关函数CreateFile|ReadFile|WriteFile怎么使用

其他教程   发布日期:2025年04月05日   浏览次数:89

这篇文章主要介绍“C++文件相关函数CreateFile|ReadFile|WriteFile怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“C++文件相关函数CreateFile|ReadFile|WriteFile怎么使用”文章能帮助大家解决问题。

    一、CreateFile

    1.1 函数原型

    CreateFile 函数是 Windows API 中用于创建文件、目录、管道、控制台输入/输出缓冲区或远程 IO 设备的函数。它位于 <windows.h> 头文件中,函数原型如下:

    1. HANDLE CreateFile(
    2. LPCTSTR lpFileName,
    3. DWORD dwDesiredAccess,
    4. DWORD dwShareMode,
    5. LPSECURITY_ATTRIBUTES lpSecurityAttributes,
    6. DWORD dwCreationDisposition,
    7. DWORD dwFlagsAndAttributes,
    8. HANDLE hTemplateFile
    9. );

    1.2 函数参数介绍

    CreateFile 函数的参数说明如下:

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

    dwDesiredAccess:指定文件的访问模式。可以是下列值之一:

    • GENERIC_READ:可以读取文件。

    • GENERIC_WRITE:可以写入文件。

    • GENERIC_EXECUTE:可以执行文件。

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

    • FILE_SHARE_READ:允许其他进程读取文件。

    • FILE_SHARE_WRITE:允许其他进程写入文件。

    • FILE_SHARE_DELETE:允许其他进程删除文件。

    lpSecurityAttributes:指定文件的安全属性。如果设为 NULL,则使用默认安全描述符。

    dwCreationDisposition:指定如何创建文件。可以是下列值之一:

    • CREATE_NEW:如果文件不存在,则创建新文件;否则,返回 ERROR_FILE_EXISTS 错误。

    • TRUNCATE_EXISTING:如果文件存在,则截断文件;否则,返回 ERROR_FILE_NOT_FOUND 错误。

    dwFlagsAndAttributes:指定文件的属性。可以是下列值之一:

    • FILE_ATTRIBUTE_NORMAL:普通文件。

    • FILE_ATTRIBUTE_READONLY:只读文件。

    • FILE_ATTRIBUTE_HIDDEN:隐藏文件。

    • FILE_ATTRIBUTE_SYSTEM:系统文件。

    hTemplateFile:指定用于创建文件的模板文件句柄。如果没有模板文件,则设为 NULL。

    如果 CreateFile 函数调用成功,则返回一个文件句柄;如果调用失败,则返回一个特殊的值 INVALID_HANDLE_VALUE,并可以使用 GetLastError 函数获取错误代码。

    1.3 示例代码

    1. #include <windows.h>
    2. #include <iostream>
    3. int main() {
    4. // 指定文件名和访问模式
    5. HANDLE hFile = CreateFile(L"test.txt",
    6. GENERIC_WRITE,
    7. 0, // 不共享
    8. NULL, // 默认安全描述符
    9. CREATE_ALWAYS, // 如果文件存在,则覆盖
    10. FILE_ATTRIBUTE_NORMAL, // 文件属性
    11. NULL); // 没有模板文件
    12. if (hFile == INVALID_HANDLE_VALUE) {
    13. std::cerr << "Error creating file: " << GetLastError() << std::endl;
    14. return 1;
    15. }
    16. std::cout << "File created successfully." << std::endl;
    17. // 关闭文件句柄
    18. CloseHandle(hFile);
    19. return 0;
    20. }

    二、ReadFile

    2.1 函数原型

    在 C++ 中,可以使用 ReadFile 函数从文件中读取数据。这个函数位于 <windows.h> 头文件中,并且需要提供文件句柄、缓冲区地址和要读取的字节数。

    ReadFile 函数的函数原型如下:

    1. BOOL ReadFile(
    2. HANDLE hFile,
    3. LPVOID lpBuffer,
    4. DWORD nNumberOfBytesToRead,
    5. LPDWORD lpNumberOfBytesRead,
    6. LPOVERLAPPED lpOverlapped
    7. );

    2.2 函数参数介绍

    ReadFile 函数的参数说明如下:

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

    lpBuffer:指向存储读取数据的缓冲区的指针。

    nNumberOfBytesToRead:指定要读取的字节数。

    lpNumberOfBytesRead:指向一个变量的指针,用于返回实际读取的字节数。

    lpOverlapped:指定用于异步 I/O 的数据结构的指针。如果不使用异步 I/O,则设为 NULL。

    在使用完文件后,应调用 CloseHandle 函数来关闭文件句柄,以释放系统资源。

    2.3 示例代码

    在这个例子中,我们打开了一个名为 test.txt 的文件,并以读取模式打开了它。然后,我们调用 ReadFile 函数读取文件中的数据,并将其存储在缓冲区中。注意,ReadFile 函数的第四个参数是一个输出参数,用于返回实际读取的字节数。如果调用失败,则函数返回 FALSE 并可以使用 GetLastError 函数获取错误代码。

    1. #include <windows.h>
    2. #include <iostream>
    3. int main() {
    4. // 打开文件
    5. HANDLE hFile = CreateFile(L"test.txt",
    6. GENERIC_READ,
    7. 0, // 不共享
    8. NULL, // 默认安全描述符
    9. OPEN_EXISTING, // 只能打开已存在的文件
    10. FILE_ATTRIBUTE_NORMAL, // 文件属性
    11. NULL); // 没有模板文件
    12. if (hFile == INVALID_HANDLE_VALUE) {
    13. std::cerr << "Error opening file: " << GetLastError() << std::endl;
    14. return 1;
    15. }
    16. // 定义缓冲区和读取的字节数
    17. char buffer[1024];
    18. DWORD bytesRead;
    19. // 从文件中读取数据
    20. if (!ReadFile(hFile, buffer, sizeof(buffer), &bytesRead, NULL)) {
    21. std::cerr << "Error reading file: " << GetLastError() << std::endl;
    22. return 1;
    23. }
    24. std::cout << "Read " << bytesRead << " bytes from file." << std::endl;
    25. // 关闭文件句柄
    26. CloseHandle(hFile);
    27. return 0;
    28. }

    三、WriteFile

    在 C++ 中,可以使用 WriteFile 函数向文件中写入数据。这个函数位于 <windows.h> 头文件中,并且需要提供文件句柄、缓冲区地址和要写入的字节数。

    3.1 函数原型

    1. BOOL WriteFile(
    2. HANDLE hFile,
    3. LPCVOID lpBuffer,
    4. DWORD nNumberOfBytesToWrite,
    5. LPDWORD lpNumberOfBytesWritten,
    6. LPOVERLAPPED lpOverlapped
    7. );

    3.2 函数参数

    WriteFile 函数的参数说明如下:

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

    lpBuffer:指向包含要写入的数据的缓冲区的指针。

    nNumberOfBytesToWrite:指定要写入的字节数。

    lpNumberOfBytesWritten:指向一个变量的指针,用于返回实际写入的字节数。

    lpOverlapped:指定用于异步 I/O 的数据结构的指针。如果不使用异步 I/O,则设为 NULL。

    在使用完文件后,应调用 CloseHandle 函数来关闭文件句柄,以释放系统资源。

    3.3 示例代码

    下面是一个简单的例子,展示了如何使用 WriteFile 函数向文件中写入数据:

    1. #include <windows.h>
    2. #include <iostream>
    3. int main() {
    4. // 打开文件
    5. HANDLE hFile = CreateFile(L"test.txt",
    6. GENERIC_WRITE,
    7. 0, // 不共享
    8. NULL, // 默认安全描述符
    9. CREATE_ALWAYS, // 如果文件存在,则覆盖
    10. FILE_ATTRIBUTE_NORMAL, // 文件属性
    11. NULL); // 没有模板文件
    12. if (hFile == INVALID_HANDLE_VALUE) {
    13. std::cerr << "Error opening file: " << GetLastError() << std::endl;
    14. return 1;
    15. }
    16. // 定义缓冲区和写入的字节数
    17. char buffer[] = "Hello, world!";
    18. DWORD bytesWritten;
    19. // 向文件中写入数据
    20. if (!WriteFile(hFile, buffer, sizeof(buffer), &bytesWritten, NULL)) {
    21. std::cerr << "Error writing to file: " << GetLastError() << std::endl;
    22. return 1;
    23. }
    24. std::cout << "Wrote " << bytesWritten << " bytes to file." << std::endl;
    25. // 关闭文件句柄
    26. CloseHandle(hFile);
    27. return 0;
    28. }

    在这个例子中,我们打开了一个名为 test.txt 的文件,并以写入模式打开了它。然后,我们调用 WriteFile 函数向文件中写入数据,并将数据存储在缓冲区中。

    注意,WriteFile 函数的第四个参数是一个输出参数,用于返回实际写入的字节数。如果调用失败,则函数返回 FALSE 并可以使用 GetLastError 函数获取错误代码。

    四、三个api一起用示例代码

    1. #include <windows.h>
    2. #include <iostream>
    3. int main() {
    4. // 打开输入文件
    5. HANDLE hInFile = CreateFile(L"in.txt",
    6. GENERIC_READ,
    7. 0, // 不共享
    8. NULL, // 默认安全描述符
    9. OPEN_EXISTING, // 只能打开已存在的文件
    10. FILE_ATTRIBUTE_NORMAL, // 文件属性
    11. NULL); // 没有模板文件
    12. if (hInFile == INVALID_HANDLE_VALUE) {
    13. std::cerr << "Error opening input file: " << GetLastError() << std::endl;
    14. return 1;
    15. }
    16. // 打开
    17. HANDLE hOutFile = CreateFile(L"out.txt",
    18. GENERIC_WRITE,
    19. 0, // 不共享
    20. NULL, // 默认安全描述符
    21. CREATE_ALWAYS, // 如果文件存在,则覆盖
    22. FILE_ATTRIBUTE_NORMAL, // 文件属性
    23. NULL); // 没有模板文件
    24. if (hOutFile == INVALID_HANDLE_VALUE) {
    25. std::cerr << "Error opening output file: " << GetLastError() << std::endl;
    26. return 1;
    27. }
    28. // 定义缓冲区和读取/写入的字节数
    29. char buffer[1024];
    30. DWORD bytesRead, bytesWritten;
    31. // 读取输入文件并写入输出文件
    32. while (ReadFile(hInFile, buffer, sizeof(buffer), &bytesRead, NULL) && bytesRead > 0) {
    33. if (!WriteFile(hOutFile, buffer, bytesRead, &bytesWritten, NULL)) {
    34. std::cerr << "Error writing to output file: " << GetLastError() << std::endl;
    35. return 1;
    36. }
    37. }
    38. // 关闭文件句柄
    39. CloseHandle(hInFile);
    40. CloseHandle(hOutFile);
    41. return 0;
    42. }

    提示

    另外,windows api读取出来的字符是宽字节,某些情况下与C++标准输出可能不一致,这方面在字符加密、流化等操作上会出现问题,所以如果有兼容要求建议使用C++标准输入、输出。

    如果要写入文本文件,可以使用 C++ 标准库中的 fstream 头文件中的流类型,例如 ofstream 和 wofstream。这些类型提供了较为方便的写入接口,可以直接使用运算符 << 写入数据。下面是一个示例代码,展示了如何使用 ofstream 类写入文本文件:

    1. #include <fstream>
    2. #include <iostream>
    3. int main() {
    4. // 打开文件
    5. std::ofstream out("test.txt");
    6. if (!out) {
    7. std::cerr << "Error opening file." << std::endl;
    8. return 1;
    9. }
    10. // 写入数据
    11. out << "Hello, world!" << std::endl;
    12. // 关闭文件
    13. out.close();
    14. return 0;
    15. }

    在这个例子中,我们打开了一个名为 test.txt 的文件,并使用运算符 << 向文件中写入了一行字符串。在使用完文件后,我们调用了 close 方法来关闭文件。

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

    最后,需要注意,在 Windows 系统中,文件名是区分大小写的。因此,在打开文件时,需要确保文件名正确。

    以上就是C++文件相关函数CreateFile|ReadFile|WriteFile怎么使用的详细内容,更多关于C++文件相关函数CreateFile|ReadFile|WriteFile怎么使用的资料请关注九品源码其它相关文章!