|   2.文件的读写定位
 定位文件中的数据是很重要的,这决定了写入的数据在文件中的位置。API函数
 
 
 | DWORD SetFilePointer( HANDLE hFile, //文件的句柄
 LONG lDistanceToMove, //字节偏移量r
 PLONG lpDistanceToMoveHigh, //指定一个长整数变量,其中包含了要使用的一个高双字偏移(一般用来操作大型文件)。可设为零,表示只使用lDistanceToMove
 DWORD dwMoveMethod //文件定位
 );
 | 
 dwMoveMethod文件定位的方式有三种:
 
 ·FILE_BEGIN:从文件开始处。
 
 ·FILE_CURRENT:从当前位置。
 
 ·FILE_END:从文件的末尾。
 
 此函数可以用来定位大型文件,lpDistanceToMoveHigh是高32位,lDistanceToMove是低32位。如果lpDistanceToMoveHigh为NULL时,函数操作成功,返回的是当前文件数据的偏移量,如果lpDistanceToMoveHigh不NULL,则返回数据的偏移量高32位放在 lpDistanceToMoveHigh中,函数调用失败返回的是0xffffffff.
 
 
 | BOOL SetEndOfFile(HANDLE hFile //文件的句柄); | 
 CFile类的文件数据定位函数有:
 
 
 | LONG Seek(LONG lOff,UINT nFrom); throw(CFileException);
 | 
 如果要求的位置合法,则Seek返回从文件开始起的新字节偏移量
 
 lOff:指针移动的字节数。
 
 nFrom:指针移动的模式。可以是CFile::begin,CFile::current,CFile::end
 void SeekToBegin( );
 
 DWORD SeekToEnd( );//返回文件长度(字节数)。
 
 下面是一个读取位图文件的信息的例子:
 
 
 | CFile file; BITMAPINFOHEADER bmpinfo;
 try
 {
 file.Open("D://ToolBar.bmp",CFile::modeRead);
 file.Seek(sizeof(BITMAPFILEHEADER),CFile::begin);
 file.Read(&bmpinfo,sizeof(BITMAPINFOHEADER ));
 CString str;
 str.Format("位图文件的长是%d,高%d",bmpinfo.biWidth,bmpinfo.biHeight);
 MessageBox(str);
 file.Close();
 }
 catch(CFileException *e)
 {
 CString str;
 str.Format("读取数据失败的原因是:%d",e->m_cause);
 MessageBox("str");
 file.Abort();
 e->Delete();
 }
 | 
 读取数据:
 
 
 | BOOL ReadFile( HANDLE hFile, //文件的句柄
 LPVOID lpBuffer, //用于保存读入数据的一个缓冲区
 DWORD nNumberOfBytesToRead, //要读入的字符数
 LPDWORD lpNumberOfBytesRead, //从文件中实际读入的字符数
 LPOVERLAPPED lpOverlapped //如文件打开时指定了FILE_FLAG_OVERLAPPED,那么必须,用这个参数引用一个特殊的结构。该结构定义了一次异步读取操作。否则,应将这个参数设为NULL
 );
 | 
 CFile的成员函数有:
 
 
 | UINT Read (void* lpBuf,UINT nCount); throw(CFileException);// 返回值是传输到缓冲区的字节数。
 | 
 写入数据:
 
 
 | BOOL WriteFile( HANDLE hFile, //文件的句柄
 LPCVOID lpBuffer, //要写入的一个数据缓冲区
 DWORD nNumberOfBytesToWrite, //要写入数据的字节数量。如写入零字节,表示什么都不写入,但会更新文件的"上一次修改时间"。
 LPDWORD lpNumberOfBytesWritten, //实际写入文件的字节数量
 LPOVERLAPPED lpOverlapped // OVERLAPPED,倘若在指FILE_FLAG_OVERLAPPED的前提下打开文件,这个参数就必须引用一个特殊的结构。该结构定义了一次异步写操作。否则,该参数应置为NULL
 );
 void Write(const void* lpBuf,UINT nCount);
 throw (CFileException);
 | 
 lpBuf:指向用户提供的缓冲区,包含将写入文件中的数据
 
 nCount:从缓冲区内传输的字节数。对文本模式的文件,回车换行作为一个字符。
 
 下面是象一个文件中写入数据的例子:
 
 
 | CFile file; try
 {
 file.Open("d:/my.dat",CFile::modeCreate|CFile::modeWrite);
 file.SeekToBegin();
 char Data[] = "111111111/n1111111111";
 file.Write(Data,sizeof(Data));
 file.Flush();
 file.Close();
 }
 catch(CFileException *e)
 {
 CString str;
 str.Format("读取数据失败的原因是:%d",e->m_cause);
 MessageBox("str");
 file.Abort();
 e->Delete();
 }
 | 
          
 说明:本教程来源互联网或网友上传或出版商,仅为学习研究或媒体推广,wanshiok.com不保证资料的完整性。
 
  2/2   首页 上一页 1 2 |