作業系統實驗7 無緩衝方式實現檔案讀寫
阿新 • • 發佈:2020-12-13
技術標籤:課程學習記錄
實驗7 無緩衝方式實現檔案讀寫
一、實驗目的
(1)熟悉Windows系統檔案讀\寫相關API。
(2)掌握無緩衝方式實現檔案讀\寫相關引數的設定。
二、實驗準備
CreateFile( ) 檔案建立:用於建立一個新檔案,如果檔案已經存在,則得到該檔案的控制代碼。 Readfile( ) 讀檔案:從檔案指標指示的位置開始讀取檔案中的資料 WriteFile ( ) 寫檔案:將資料寫入檔案 CloseHandle() 關閉檔案控制代碼:關閉與檔案相關的控制代碼,其作用與釋放動態申請的記憶體空間類似, 這樣可以釋放系統資源,使程序安全執行。
三、實驗內容
(一)實驗內容
建立一個函式,使用該函式將原始檔source.txt中的內容讀出,再寫到目標檔案nobuffer.txt中去。
(二)主要程式碼
// zuoye07.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "zuoye07.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(char*source,char*destination)函式
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;
//建立檔案source.txt
handle_src=CreateFile(source,
GENERIC_READ,
0,
NULL,
OPEN_ALWAYS,
FILE_FLAG_NO_BUFFERING,
NULL);
//建立檔案nobuffer.txt
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;
//讀取檔案source.txt
if(!ReadFile(handle_src,buffer,NumberOfByteWrite,&NumberOfByteWrite,NULL))
{
//讀取檔案source.txt失敗
printf("Read File Error!%d\n",GetLastError());
exit(1);
}
if(NumberOfByteWrite<BufferSize)cycle=false;
//寫入檔案nobuffer.txt
if(!WriteFile(handle_dst,buffer,NumberOfByteWrite,&NumberOfByteWrite,NULL))
{
//寫入檔案nobuffer.txt失敗
printf("Write File Error!%d\n",GetLastError());
exit(1);
}
}
//關閉檔案控制代碼(source.txt,nobuffer.txt)
CloseHandle(handle_src);
CloseHandle(handle_dst);
}
四、實驗結果與總結
一開始沒有建立source.txt和nobuffer.txt,程式第一次執行後會建立這兩個檔案,如下圖紅圈中控制檯列印資訊如下圖命令列。之後
在source.txt中添加了些文字資訊“source中資料”,再次執行程式,程式執行完後,開啟nobuffer.txt,發現其內容和source.txt中內容完全一致
如下圖所示。
該實驗完成無緩衝方式的檔案讀/寫操作。先建立兩個檔案,source.txt和nobuffer.txt,然後反覆從檔案source.txt中讀出資料塊,
並寫到檔案nobuffer.txt中去,直到檔案尾為止。