C++中WriteFile和ReadFile使用
VC++编程 2009-01-06 11:29:29 阅读1021 评论2
字号:大中小
读写文件是每个Windows软件开发人员都需要做的工作。可见这项工作是非常重要的,毕竟各种各样的数据都需要保存起来,以便作各种各样的分析,或者通过网络传送给别人。像大家用BT下载的电影,在那个BT软件里,就需要不断从网络里接收到数据,然后再把这些数据保存到文件里合适的位置,就可以生成跟发行者那里一样的文件,这样才可以播放出来。又比如我在玩《征途》的游戏里,刚刚打开游戏时,它就不断从服务器上下载更新的文件下来,然后保存到硬盘。WriteFile函数是用来写数据到文件,ReadFile函数是从文件里读取数据出来。但这两个函数不但可以读取写磁盘的文件,也可以接收和发送网络的数据,还有读写串口、USB、并口等设备的数据。在读写文件里,首先就是先打开文件,然后判断打开是否成功。在写文件时,同时要注意磁盘的空间是否满等问题。在读取文件时,往往需要读取不同位置的文件,比如要读取一个4G的视频文件,就不可能完全把它读取到内存里,因此就需要对文件进行定位读取。
函数WriteFile和ReadFile声明如下:
WINBASEAPI
BOOL
WINAPI
WriteFile(
__in HANDLE hFile,
__in_bcount(nNumberOfBytesToWrite) LPCVOID lpBuffer,
__in DWORD nNumberOfBytesToWrite,
__out_opt LPDWORD lpNumberOfBytesWritten,
__inout_opt LPOVERLAPPED lpOverlapped
);
WINBASEAPI
BOOL
WINAPI
ReadFile(
__in HANDLE hFile,
__out_bcount_part(nNumberOfBytesToRead, *lpNumberOfBytesRead) LPVOID lpBuffer,
__in DWORD nNumberOfBytesToRead,
__out_opt LPDWORD lpNumberOfBytesRead,
__inout_opt LPOVERLAPPED lpOverlapped
);
hFile是文件句柄。
lpBuffer是读写数据缓冲区。
nNumberOfBytesToWrite是多少数据要写入。
lpNumberOfBytesWritten是已经写入多少数据。
nNumberOfBytesToRead是多少数据要读取。
nNumberOfBytesToRead是已经读取多少数据。
lpOverlapped是异步读写的结构。
调用函数的例子如下:
#001 //创建、写入、读取文件。
#002 //蔡军生 2007/10/21 QQ:9073204 深圳
#003 void CreateFileDemo(void)
#004 {
#005 //
#006 HANDLE hFile = ::CreateFile(_T("CreateFileDemo.txt"), //创建文件的名称。
#007 GENERIC_WRITE|GENERIC_READ, // 写和读文件。
#008 0, // 不共享读写。
#009 NULL, // 缺省安全属性。
#010 CREATE_ALWAYS, // 如果文件存在,也创建。
#011 FILE_ATTRIBUTE_NORMAL, // 一般的文件。
#012 NULL); // 模板文件为空。
#013
#014 if (hFile == INVALID_HANDLE_VALUE)
#015 {
#016 //
#017 OutputDebugString(_T("CreateFile fail!\r\n"));
#018 }
#019
#020 //往文件里写数据。
#021 const int BUFSIZE = 4096;
#022 char chBuffer[BUFSIZE];
#023 memcpy(chBuffer,"Test",4);
#024 DWORD dwWritenSize = 0;
#025 BOOL bRet = ::WriteFile(hFile,chBuffer,4,&dwWritenSize,NULL);
#026 if (bRet)
#027 {
#028 //
#029 OutputDebugString(_T("WriteFile 写文件成功\r\n"));
#030 }
#031
#032 //先把写文件缓冲区的数据强制写入磁盘。
#033 FlushFileBuffers(hFile);
#034
#035 //
#036 //从文件里读取数据。
#037 LONG lDistance = 0;
#038 DWORD dwPtr = SetFilePointer(hFile, lDistance, NULL, FILE_BEGIN);
#039 if (dwPtr == INVALID_SET_FILE_POINTER)
#040 {
#041 //获取出错码。
#042 DWORD dwError = GetLastError() ;
#043 //处理出错。
#044 }
#045
#046 DWORD dwReadSize = 0;
#047 bRet = ::ReadFile(hFile,chBuffer,4,&dwReadSize,NULL);
#048 if (bRet)
#049 {
#050 //
#051 OutputDebugString(_T("ReadFile 读文件成功\r\n"));
#052 }
#053 else
#054 {
#055 //获取出错码。
#056 DWORD dwError = GetLastError();
#057 //处理出错。
#058 TCHAR chErrorBuf[1024];
#059 wsprintf(chErrorBuf,_T("GetLastError()=%d\r\n"),dwError);
#060 OutputDebugString(chErrorBuf);
#061 }
#062
#063 }
分享到:
相关推荐
成功调用后,`CreateFile`返回一个句柄,该句柄将在后续的`WriteFile`和`ReadFile`操作中使用。 `WriteFile`函数用于向串口发送数据。它需要四个主要参数:由`CreateFile`返回的串口句柄,要发送的数据缓冲区指针,...
在Windows操作系统中,进行文件操作时,程序员通常会利用系统提供的API函数,如`CreateFile`、`ReadFile`和`WriteFile`等。这些API提供了底层的文件访问能力,可以实现灵活且高效的文件操作。下面我们将详细探讨这些...
以ReadFile和WriteFile为例,这两个API是Windows API中用于磁盘文件读写的函数。通过Hook它们,开发者可以实现诸如日志记录、数据过滤、性能分析等功能。例如,当其他程序尝试读取文件时,我们的Hook代码先执行,...
USBtongxun.rar是一个与USB设备通信相关的压缩包文件,涉及到USB-IF(Universal Serial Bus Implementers Forum)规范,USB设备管理,以及C++编程中的ReadFile和WriteFile函数在USB读写中的应用。USB-IF是USB设备...
下面我们将深入探讨如何在C++中使用ESC指令以及涉及的相关知识点。 首先,我们需要理解串口通信的基本概念。串口通信是一种通过串行接口进行数据传输的方式,常用于设备间的短距离通信,如计算机与打印机之间的连接...
在给定的“c# USB通信readfile”项目中,开发者利用了readfile和writefile这两个关键API函数来完成C#程序与USB设备的数据交换。下面我们将深入探讨这些知识点。 首先,`readfile` API是Windows操作系统提供的一个...
- `WriteFile`与`ReadFile`是Windows API中用于文件操作的关键函数,它们分别用于向文件写入数据和从文件读取数据。 - 通过这些API可以实现高级别的文件读写控制,比如精确控制读写的字节数,以及在特定偏移位置...
在C++中,可以使用`<windows.h>`头文件中的API函数,如CreateFile、WriteFile和ReadFile来控制串行端口。C++Builder中的TSerial组件则提供了更高级的接口,用于设置波特率、数据位、停止位、奇偶校验等参数,并进行...
Windows API中的`CreateFile`用于打开串口,`SetCommState`设置串口参数,如波特率、数据位、停止位和校验位,`WriteFile`和`ReadFile`则分别用于发送和接收数据。 实现16进制指令的发送,首先需要将16进制字符串...
3. **数据传输**:在C#中,可以使用`StreamWriter`和`StreamReader`读写对象,而在C++中,使用`ReadFile`和`WriteFile`函数。这些方法允许进程将数据结构序列化为字节流,然后在管道中传输。由于命名管道支持二进制...
- 数据传输:使用WriteFile和ReadFile函数发送和接收数据。 5. **调试与升级日志**: "UpgradeLog.htm" 文件可能是升级或安装过程的日志,它记录了程序升级或安装时的详细信息,对排查问题很有帮助。在开发过程中...
在C++中,ReadFile和WriteFile函数分别用于读取和写入数据;而在C#中,SerialPort类提供了ReadLine、ReadBytes和Write方法等。 “smallestx5x”和“badly3t3”可能是项目或设备的特定标签,它们可能指定了特定的...
在Visual C++中,我们可以使用Windows API函数如CreateFile、WriteFile和ReadFile来打开、写入和读取串口数据。此外,还可以通过MSComm控件,它是Visual Studio的一个内置组件,用于简化串口通信编程。通过设置控件...
在Visual C++中实现串口同步通信,通常需要使用WinAPI函数如CreateFile、SetCommState、WriteFile和ReadFile等。程序会阻塞在ReadFile调用上,直到接收到数据或超时。这种通信方式简单易控,适合于数据量小、实时性...
在C++中,实现串口通信通常需要使用特定的库,如Windows平台下的`windows.h`库中的`CreateFile`,`WriteFile`,`ReadFile`等API函数,或者使用第三方库如`libserialport`,`Boost.Asio`等。在这个项目中,开发者可能...
在C++中,`WriteFile`和`ReadFile`函数用于发送和接收数据。 在C#这边,可以使用`System.IO.Pipes`命名空间提供的类来操作管道。例如,`NamedPipeClientStream`用于客户端连接,而`NamedPipeServerStream`则在...
2. **W32 I/O**:使用Windows API中的输入/输出函数,如`ReadFile`和`WriteFile`,处理文件操作,并计算CRC32。 3. **内存映射文件**:通过`CreateFileMapping`和`MapViewOfFile`等API,将文件映射到进程的虚拟地址...
4. **读写操作**:`ReadFile`和`WriteFile`在Windows中用于读取和写入数据,它们会阻塞直到指定数量的数据被读取或写入。在Linux中,`read`和`write`函数类似,但需要注意非阻塞模式的使用,防止程序陷入等待。 5. ...
`WriteFile`会将缓冲区中的数据写入串口,`ReadFile`则从串口读取数据到缓冲区。记得检查函数的返回值,以确认数据是否成功发送或接收。 最后,完成通信后,不要忘记关闭串口。`CloseHandle`函数用于关闭由`...
本项目中提到的"Windows+控制台"程序,可能是一个使用C++语言编写的,集成了控制台界面和Windows图形用户界面(GUI)元素的程序。下面将详细讨论C++在Windows环境下构建控制台应用的相关知识点。 1. **C++基础知识*...