现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

VC++编程中的文件操作API和CFile类(二)

2012-08-19 22:27 工业·编程 ⁄ 共 3851字 ⁄ 字号 暂无评论

2.文件的读写定位

    定位文件中的数据是很重要的,这决定了写入的数据在文件中的位置。

API函数

DWORD SetFilePointer(
HANDLE hFile, //文件的句柄
LONG lDistanceToMove, //字节偏移量r
PLONG lpDistanceToMoveHigh, //指定一个长整数变量,其中包含了要使用的一个高双字偏移(一般用来操作大型文件)。可设为零,表示只使用lDistanceToMove
DWORD dwMoveMethod //文件定位
);
DWORD SetFilePointer(
HANDLE hFile, //文件的句柄
LONG lDistanceToMove, //字节偏移量r
PLONG lpDistanceToMoveHigh, //指定一个长整数变量,其中包含了要使用的一个高双字偏移(一般用来操作大型文件)。可设为零,表示只使用lDistanceToMove
DWORD dwMoveMethod //文件定位
);
dwMoveMethod文件定位的方式有三种:
FILE_BEGIN:从文件开始处。
FILE_CURRENT:从当前位置。
FILE_END:从文件的末尾。
FILE_BEGIN:从文件开始处。
FILE_CURRENT:从当前位置。
FILE_END:从文件的末尾。
此函数可以用来定位大型文件,lpDistanceToMoveHigh是高32位,lDistanceToMove是低32位。如果lpDistanceToMoveHigh为NULL时,函数操作成功,返回的是当前文件数据的偏移量,如果lpDistanceToMoveHigh不NULL,则返回数据的偏移量高32位放在 lpDistanceToMoveHigh中,函数调用失败返回的是0xffffffff.

BOOL SetEndOfFile(HANDLE hFile //文件的句柄);
BOOL SetEndOfFile(HANDLE hFile //文件的句柄);

CFile类的文件数据定位函数有

LONG Seek(LONG lOff,UINT nFrom);
throw(CFileException);
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();
}
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
);
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);
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[] = "111/n1111";
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();
}
CFile file;
try
{
file.Open("d:/my.dat",CFile::modeCreate|CFile::modeWrite);
file.SeekToBegin();
char Data[] = "111/n1111";
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();
}

给我留言

留言无头像?