正 文

解读VC++编程中的文件操作API和CFile类


www.7dspace.com  更新日期:2006-3-7 7:00:05  七度空间


  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();
}

4页,页码:[1] [2] [3] [4] 

上一篇:封装的变化之不断变化的需求
下一篇:Alexa排名对新闻类网站的参考作用
解读VC++编程中的文件操作API和CFile类 作者:RisingMine 来源:天极网
收藏此页】【打印】【关闭
站 内 搜 索
 

热 点 导 读
特 别 推 荐