操作系统实验:使用无缓冲的方式实现文件读\写

实验七:使用无缓冲的方式实现文件读\写


一、实验目的

(1).熟悉Windows系统文件读\写相关API。
(2).掌握无缓冲方式实现文件读\写相关参数的设置。

二、实验准备

1.文件创建函数:CreateFile()
原型:
    HANDLE CreateFile(
    LPCTSTR lpFileName,                            //指向文件名的指针
    DWORD dwDesiredAccess,                         //读/写访问模式
    DWORD dwShareMode,                             //共享模式
    LPSECURITY_ATTRIBUTES lpSecurityAttributes,    //指向安全属性的指针
    DWORD dwCreationDisposition,                   //文件存在标志
    DWORD dwFlagsAndAttributes,                    //文件属性
    DWORD hTemplateFile                            //指向访问模板文件的句柄
    );
函数CreateFile( ) 用于创建一个新文件,如果文件已经存在,则得到该文件的句柄。该函数的参数dwFalgsAndAttributes决定了文件的传输方式,对于普通的文件传输,可将参数设置为FILE_ATTRIBUTE_NORMAL;而若设置为FILE_FLAG_NO_BUFFERING,表示不使用高速缓存进行文件传输;若同时使用标志FILE_FLAG_NO_BUFFERING和FILE_FLAG_OVERLAPPED,可对文件进行异步传输;若设置为FILE_FLAG_SEQUENTIAL_SCAN,表示使用高速缓存进行文件的传输。
参数说明:
  (1).lpFILEName:指向文件名的指针。
  (2).dwDesiredAccess:指出访问文件的类型,可以是读访问、写访问、读 / 写访问或查询访问。该参数可以是表4-1中的组合。
  (3).dwShareMode:指出文件共享模式。若dwShareMode的值为0,表示目标不能被共享。
  (4).lpSecurityAttributes:指向安全属性的指针。为NULL时,子进程可以继承该安全描述符。
  (5).dwCreationDisposition:文件存在标志。指出当文件不存在时,可以对文件进行何种操作。
  (6).dwFlagsAndAttributes:指出文件属性和标志。
  (7).hTemplateFile:指向访问模板文件的句柄,可以将其设置为空。
返回值:
文件创建成功,该函数返回文件句柄,否则返回INVALID_HANDLE_VALUE,可调用函数GetLastError( )查询失败的原因。

2.读文件函数Readfile() 
原型:
    BOOL ReadFILE(
    HANDLE hFile,                              //要读的文件的句柄
    LPVOID lpBuffer,                            //指向文件缓冲区的指针
    DWORD nNumberOfBytesToRead,              //从文件中要读取的字节数
    LPDWORD lpNumberOfBytesRead,             //指向从文件中要读取的字节数的指针
    LPOVERLAPPED lpOverlapped                //指向OVERLAPPED结构的指针
    ) ;
函数Readfile( ) 从文件指针指示的位置开始读取文件中的数据。如果文件不是用FILE_FLAG_OVERLAPPED属性创建的,则文件指针移动到实际读出字节数所处的位置;如果文件是用FILE_FLAG_OVERLAPPED属性创建的,则文件指针由应用程序来调整其位置。
参数说明:
  (1).hFile:指向要读的文件的句柄
  (2).lpBuffer:指向文件缓冲区的指针。
  (3).nNumberOfBytesToRead:从文件中要读取的字节数。
  (4).lpNumberOfBytesRead:指向从文件中要读取的字节数的指针。
  (5).lpOverlapped:指向OVERLAPPED结构的指针。
返回值:
如果函数调用成功,则返回值为非0值。

3.写文件函数WriteFile() 
原型:
    BOOL WriteFile(                           
    HANDLE hFile,                           // 要读的文件的句柄
    LPVOID lpBuffer,                         // 指向文件缓冲区的指针
    DWORD nNumberOfBytesToWrite,           // 从文件中要读取的字节数
    LPDWORD lpNumberOfBytesWritten,        // 指向从文件中要读取的字节数的指针
    LPOVERLAPPED lpOverlapped             // 指向 OVERLAPPED结构的指针
    ) ;
函数WriteFile ( ) 将数据写入文件。函数在文件指针所指的位置完成写操作,写操作完成后,文件指针按实际写入的字节数来调整。
参数说明:
  (1).hFile:指向要写文件的句柄。
  (2).lpBuffer:指向文件缓冲区的指针。
  (3).nNumberOfBytesToWrite:向文件中写入的字节数。
  (4).lpNumberOfBytesWritten:向文件中写入的字节数的指针
  (5).lpOverlapped:指向OVERLAPPED结构的指针。
返回值:
如果函数调用成功,则返回值为非0值。如果函数调用失败,则返回值为0.若要得到更多的错误信息,可调用函数GetLastError()。

4.关闭文件句柄函数CloseHandle()
原型:
    BOOL CloseHandle(
    HANDLE hObject
    );
函数CloseHandle()关闭与文件相关的句柄,其作用与释放动态申请的内存空间类似,这样可以释放系统资源,使进程安全运行。
参数说明:
    hObject:已打开对象的句柄
返回值:
如果函数调用成功,则返回值为非0值。如果函数调用失败,则返回值为0.若要得到更多的错误信息,可调用函数GetLastError()。

三、实验内容

(一)实验内容
建立一个函数,使用该函数将源文件source.txt中的内容读出,再写到目标文件nobuffer.txt中去。
(二)主要代码
//File_NoBuffer.cpp:Defines the entry point for the console application.
//
#include "stdafx.h"
#include "07.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#endif

DWORD BufferSize=1024;
char buf[1024];
/
//The one and only application object
CWinApp theApp;

using namespace std;

void FileReadWrite_NoBuffer(char*source,char*destination);

int _tmain(int argc,TCHAR*angv[],TCHAR*envp[])
{
	int nRetCode=0;
	printf("Call FileReadWrite_NoBuffer!\n");
	FileReadWrite_NoBuffer("source.txt","nobuffer.txt");
	return nRetCode;
}

void FileReadWrite_NoBuffer(char*source,char*destination)
{
  HANDLE handle_src,handle_dst;
  DWORD NumberOfByteWrite;
  bool cycle;
  char*buffer;
  buffer=buf;
  //创建文件
  handle_src=CreateFile(source,
	  GENERIC_READ,
	  0,
	  NULL,
	  OPEN_ALWAYS,
	  FILE_FLAG_NO_BUFFERING,
	  NULL);
  handle_dst=CreateFile(destination,
	  GENERIC_WRITE,
	  NULL,
	  NULL,
	  OPEN_ALWAYS,
	  NULL,
	  NULL);
  if(handle_src==INVALID_HANDLE_VALUE || handle_dst==INVALID_HANDLE_VALUE)
  {
      printf("File Create Fail!\n");
	  exit(1);
  }

  cycle=true;
  while(cycle)
  {
    NumberOfByteWrite=BufferSize;
	//读文件
	if(!ReadFile(handle_src,buffer,NumberOfByteWrite,&NumberOfByteWrite,NULL))
	{
	  printf("Read File Error!%d\n",GetLastError());
      exit(1);
	}
	if(NumberOfByteWrite<BufferSize)cycle=false;
	//写文件
	if(!WriteFile(handle_dst,buffer,NumberOfByteWrite,&NumberOfByteWrite,NULL))
	{
	   printf("Write File Error!%d\n",GetLastError());
	   exit(1);
	}
  }
  //关闭文件句柄
  CloseHandle(handle_src);
  CloseHandle(handle_dst);
}

四、实验结果与总结

  该实验完成无缓冲方式的文件读/写操作。先创建两个文件,source.txt和nobuffer.txt,然后反复从文件source.txt中读出数据块,并写到文件nobuffer.txt中去,直到文件尾为止。
成功截图

image

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

司马道

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值