Windows api系列第五弹强烈来袭,本期介绍Windows上c++有关文件创建、读取和写入的api:CreateFile、ReadFile、WriteFile。

目录

一、CreateFile

1.1 函数原型

1.2 函数参数介绍

1.3 示例代码

二、ReadFile

2.1 函数原型

2.2 函数参数介绍

2.3  示例代码

三、WriteFile

3.1 函数原型

3.2 函数参数

3.3 示例代码

三个api一起用示例代码

提示


一、CreateFile

1.1 函数原型

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

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

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 示例代码

#include <windows.h>
#include <iostream>int main() {// 指定文件名和访问模式HANDLE hFile = CreateFile(L"test.txt",GENERIC_WRITE,0,  // 不共享NULL,  // 默认安全描述符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;// 关闭文件句柄CloseHandle(hFile);return 0;
}

二、ReadFile

2.1 函数原型

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

    ReadFile 函数的函数原型如下:

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

2.2 函数参数介绍

ReadFile 函数的参数说明如下:

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

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

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

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

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

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

2.3  示例代码

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

#include <windows.h>
#include <iostream>int main() {// 打开文件HANDLE hFile = CreateFile(L"test.txt",GENERIC_READ,0,  // 不共享NULL,  // 默认安全描述符OPEN_EXISTING,  // 只能打开已存在的文件FILE_ATTRIBUTE_NORMAL,  // 文件属性NULL);  // 没有模板文件if (hFile == INVALID_HANDLE_VALUE) {std::cerr << "Error opening file: " << GetLastError() << std::endl;return 1;}// 定义缓冲区和读取的字节数char buffer[1024];DWORD bytesRead;// 从文件中读取数据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;// 关闭文件句柄CloseHandle(hFile);return 0;
}

三、WriteFile

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

3.1 函数原型

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

3.2 函数参数

WriteFile 函数的参数说明如下:

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

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

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

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

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

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

3.3 示例代码

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

#include <windows.h>
#include <iostream>int main() {// 打开文件HANDLE hFile = CreateFile(L"test.txt",GENERIC_WRITE,0,  // 不共享NULL,  // 默认安全描述符CREATE_ALWAYS,  // 如果文件存在,则覆盖FILE_ATTRIBUTE_NORMAL,  // 文件属性NULL);  // 没有模板文件if (hFile == INVALID_HANDLE_VALUE) {std::cerr << "Error opening file: " << GetLastError() << std::endl;return 1;}// 定义缓冲区和写入的字节数char buffer[] = "Hello, world!";DWORD bytesWritten;// 向文件中写入数据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;// 关闭文件句柄CloseHandle(hFile);return 0;
}

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

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

三个api一起用示例代码

#include <windows.h>
#include <iostream>int main() {// 打开输入文件HANDLE hInFile = CreateFile(L"in.txt",GENERIC_READ,0,  // 不共享NULL,  // 默认安全描述符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, // 默认安全描述符 CREATE_ALWAYS, // 如果文件存在,则覆盖FILE_ATTRIBUTE_NORMAL, // 文件属性NULL); // 没有模板文件if (hOutFile == INVALID_HANDLE_VALUE) {std::cerr << "Error opening output file: " << GetLastError() << std::endl;return 1;}// 定义缓冲区和读取/写入的字节数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;}}// 关闭文件句柄CloseHandle(hInFile);CloseHandle(hOutFile);return 0;
}

提示

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

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

#include <fstream>
#include <iostream>int main() {// 打开文件std::ofstream out("test.txt");if (!out) {std::cerr << "Error opening file." << std::endl;return 1;}// 写入数据out << "Hello, world!" << std::endl;// 关闭文件out.close();return 0;
}

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

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

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

夜已深,祝大家好梦!

CreateFile | ReadFile | WriteFile - WINDOWS API 第五弹 C++创建任意格式的文件用于读取和写入。相关推荐

  1. CreateWindow创建异形窗口(不规则窗口) - WINDOWS API 第三弹 异形窗口。

    本期将自己从底层中抽离出来,来搞点UI设计相关的,毕竟UI是本人强项(矮子里面拔高个吧).你的UI界面是不是都是矩形框,你有想过其他形状的界面吗?是不是感觉计算机应用就应该是方方正正的.答案肯定是NO ...

  2. Beep() - WINDOWS API 第六弹 C++调用蜂鸣器播放简单的曲调。

    今天搞个好玩的东西,windows上自带的蜂鸣器,调用beep()函数即可实现,它位于windows.h中,话说目前我们听到的歌曲似乎都是来自机器,来自纯乐器的声音很奢侈,所以你对机器发出的音色一定不 ...

  3. window php 安装zip扩展,Windows下安装php_rar 扩展,让php实现rar文件的读取和解压

    PHP Rar Archiving 模块 (php_rar) 是一个读取和解压rar文件的模块,但不提供RAR压缩(打包)的功能. 1.首先要到PECL的RAR页面下载DLL. 根据自己的情况选择下载 ...

  4. 关于Windows® API Code Pack for Microsoft® .NET Framework

    相比之前的操作系统,Window 7(or Vista)提供了很多新特性,我们在应用实现中可以利用这些特性来提升用户体验. 这些特性主要包括以下几个方面: Shell Enhancements Dir ...

  5. Windows API 获取卷的基本信息

    通过对 Windows API 基础的一些学习,自己编写了一个可以读取卷的名称.文件系统类型.大小和剩余大小这些基本信息的小程序.程序很简单,却也受益匪浅. 定义的宏: #define BUFFSIZ ...

  6. 读取和写入Windows的INI文件

    代码如下: Sub WriteINIStringVirtual(Section, KeyName, value, FileName)     WriteINIString Section, KeyNa ...

  7. java打开文件(Windows exe,应用文件exe,以及其他任何格式的文件)

    转载自   java打开文件(Windows exe,应用文件exe,以及其他任何格式的文件) 使用java代码打开任何格式的文件 public static void main(String[] a ...

  8. Windows API CreateFile WriteFile 操作文件追加写入 解决中文乱码

    编译环境 WIn10 21H1 VS2017 字符集随意切换  解决乱码问题! 切换字符集后必需删除之前的文本文件! // CreateFile.cpp : 此文件包含 "main" ...

  9. OpenProcess | Process32First | GetExitCodeProcess - WINDOWS API 第二弹 非通信方式的子进程获取父进程信息

    OpenProcess | Process32First | GetExitCodeProcess - WINDOWS API 第二弹 进程相关 目录 一.得到父进程ID(Process32First ...

最新文章

  1. 两次关于软考网络工程师的经历
  2. AI安防崛起迅速 开疆拓土少不了专利作“盔甲”
  3. Design Pattern - Iterator(C#)
  4. docker desktop 镜像_Spring Boot实战工具4 - Docker
  5. 阿里云ECS服务器搭建wordpress个人博客网站【详细图文教程】
  6. Cent os常见操作命令
  7. 第3章 Python 数字图像处理(DIP) - 灰度变换与空间滤波6 - 分段线性变换 - 比特平面分层
  8. 代码在eclipse下不报错,在doc命令行下报错--jar file和runable jar file
  9. Avalon and Indigo CTP- March 2005提供公开下载!
  10. 计算机科学为什么重要,数学 – 为什么在计算机科学中有8和256个如此重要的数字?...
  11. 用c语言写一个求和的程序,用C语言编写一个“等比数列求和”的程序?
  12. 计算机操作系统原理——第一章.绪论
  13. 建立时间保持时间及违例如何处理,求最大时钟频率
  14. MATLAB 用高斯消元法求解线性方程组
  15. java语言TAM机程序代码(基础版)
  16. echarts高度自适应
  17. 小灰整理了一套Java学习路线图,面试和实战都能用得上!
  18. 大学计算机学生要拿到的证书,大学一定要拿到的证书
  19. 冒泡排序【必会知识】
  20. 如何优雅地下载计算机领域英文文献--dblp的食用方法(多图警告)

热门文章

  1. GPS/RTK高精度定位系统有什么优势?
  2. 虚拟同步发电机转动惯量和阻尼系数协同自适应控制策略
  3. 使用FSL-FAST分割三种脑组织:白质,灰质,脑脊液
  4. Activity、Fragment和Surface的生命周期
  5. A Reinforcement Learning Framework for Medical Image Segmentation翻译
  6. matlab 等高线数值显示_「matlab等高线」matlab中contour 函数的用法(绘制等高线) - seo实验室...
  7. 可以远程连接服务器,但是无法ping通问题
  8. AnHelper.js
  9. 数据结构 实验报告07
  10. 马斯克脑机接口真人手术获FDA批准!一文看懂得脑机接口未来的无限可能(附产业链与核心企业)...