/******************************************************************************
* File Name : DataFile.h *
* Description : The CDataFile class is used to create and modify *
* data files such as *.ini and *.cfg. *
* Creator : Laughsky(LiQintao) *
* Create time : 2001/9/25 *
* Bug Report : laugh_sky@hotmail.com || muzilee@263.net *
******************************************************************************/
//
#if !defined(AFX_DATAFILE_H__93A9DBB1_86C9_4A4D_8E2F_B91B5BBC6469__INCLUDED_)
#define AFX_DATAFILE_H__93A9DBB1_86C9_4A4D_8E2F_B91B5BBC6469__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
///
#define FILE_MAX_LENGTH 1024*50
#define CREATE_MODE_REBUILD CFile::modeCreate
#define CREATE_MODE_NOREBUILD CFile::modeNoTruncate | CFile::modeCreate
#define OPEN_MODE_READ CFile::modeRead
#define OPEN_MODE_WRITE CFile::modeReadWrite
#define OPEN_MODE_READWRITE CFile::modeReadWrite
#define WRITE_MODE_INSERT 2000
#define WRITE_MODE_OVERWRITE 2001
#define WRITE_MODE_DELETE 2002
#define FLAG_FILE_EXIST 3000
#define FLAG_FILE_NOEXIST 3001
class CDataFile
{
public:
void DeleteFile(LPCTSTR lpszFileName);
void WriteLine(CString&
amp; wString, UINT nFlag);
BOOL MoveToLine(UINT line);
UINT GetLines();
void CloseFile();
BOOL OpenFile(LPCTSTR lpszFileName, UINT nFlags);
INT CheckFileExsist(LPCTSTR lpszFileName);
BOOL ReadLine(CString&
amp; rString);
BOOL CreateFile(LPCTSTR lpszFileName, UINT nFlags);
CDataFile();
virtual ~
CDataFile();
private:
void MoveEnd();
void MoveStart();
CString FileName; // Save the specified file name
UINT moveLine;
// Save the number of line at current pointer position
BOOL IsFileOpen;
// If file has been opened,it is TRUE
CStdioFile file;
};
#endif // !defined(AFX_DATAFILE_H__93A9DBB1_86C9_4A4D_8E2F_B91B5BBC6469__INCLUDED_)
=========================================================================
/******************************************************************************
* File Name : DataFile.CPP *
* Description : The CDataFile class is used to create and modify *
* data files such as *.ini and *.cfg. *
* Creator : Laughsky(LiQintao) *
* Create Time : 2001/9/25 *
* Bug Report : laugh_sky@hotmail.com || muzilee@263.net *
******************************************************************************/
//
#include "stdafx.h"
#include "DataFile.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=
__FILE__;
#define new DEBUG_NEW
#endif
//
// Construction/Destruction
//
CDataFile::CDataFile()
{
IsFileOpen =
FALSE;
moveLine =
1;
}
CDataFile::~
CDataFile()
{
}
//Create specified file:
//The nFlags may be 1. CREATE_MODE_REBUILD
// 2. CREATE_MODE_NOREBUILD
BOOL CDataFile::CreateFile(LPCTSTR lpszFileName, UINT nFlags)
{
if (!
OpenFile(lpszFileName, nFlags))
return FALSE;
CloseFile();
return TRUE;
}
//Read the specified line
BOOL CDataFile::ReadLine(CString &
amp;rString)
{
if (!
IsFileOpen)
return FALSE;
if (!
file.ReadString(rString))
return FALSE;
return TRUE;
}
// Check if the specified file exsists
INT CDataFile::CheckFileExsist(LPCTSTR lpszFileName)
{
if (!
OpenFile(lpszFileName, OPEN_MODE_READ))
{
return FLAG_FILE_NOEXIST;
}
CloseFile();
return FLAG_FILE_EXIST;
}
// Open the specified file
BOOL CDataFile::OpenFile(LPCTSTR lpszFileName, UINT nFlags)
{
if (!
file.Open(lpszFileName, nFlags))
return FALSE;
IsFileOpen =
TRUE;
FileName =
lpszFileName;
return TRUE;
}
// Close the current file
void CDataFile::CloseFile()
{
file.Close();
IsFileOpen =
FALSE;
}
UINT CDataFile::GetLines()
{
if (!
IsFileOpen)
return NULL;
unsigned int lines =
0;
CString temp;
MoveStart();
// 如果最后一行为空,则不计其行数
while(file.ReadString(temp))
lines ++
;
return lines;
}
// Move to the start of the file
void CDataFile::MoveStart()
{
if (IsFileOpen)
file.SeekToBegin();
return;
}
// Move the end of the file
void CDataFile::MoveEnd()
{
if (IsFileOpen)
file.SeekToEnd();
return;
}
// Move the pointer to the specified line, then you can
// read、overwrite and delete the line by using ReadLine() or WriteLine().
BOOL CDataFile::MoveToLine(UINT line)
{
if (!
IsFileOpen)
return FALSE;
if (line <=
0)
{
moveLine =
1;
MoveStart();
return TRUE;
}
if (line &
gt; GetLines())
{
moveLine = GetLines()+
1;
MoveEnd();
return TRUE;
}
CString temp;
MoveStart();
for (unsigned
int curLine =
1; curLine < line; curLine++
)
file.ReadString(temp);
DWORD pos =
file.GetPosition();
file.Seek(pos, CFile::begin);
moveLine =
line;
return TRUE;
}
// Write the content you specified at current line.
// The nFlag maybe 1. WRITE_MODE_INSERT
// 2. WRITE_MODE_OVERWRITE
// 3. WRITE_MODE_DELETE
void CDataFile::WriteLine(CString &
amp;wString, UINT nFlag)
{
UINT setLine =
moveLine;
UINT fileLen =
file.GetLength();
if (!
IsFileOpen)
return ;
CString temp;
CString sTest;
sTest.Empty();
MoveToLine(setLine);
UINT upLen =
file.GetPosition();
int restLen = fileLen -
upLen;
if (restLen &
gt; FILE_MAX_LENGTH)
return;
CString sRestFile,sLine;
char pbuf[FILE_MAX_LENGTH];
memset(pbuf, 0, FILE_MAX_LENGTH);
switch(nFlag)
{
case WRITE_MODE_INSERT:
if (setLine <= GetLines() || GetLines() ==
0)
{
MoveToLine(setLine);
file.Read(pbuf, restLen);
temp = wString+
"n"+
pbuf;
MoveToLine(setLine);
file.WriteString(temp);
}
else{
CString temp2;
MoveToLine(GetLines());
file.ReadString(temp2);
temp = temp2+
"n"+
wString;
MoveToLine(GetLines());
file.WriteString(temp);
}
break;
case WRITE_MODE_OVERWRITE:
if (setLine &
lt; GetLines())
{
MoveToLine(setLine);
ReadLine(sTest);
MoveToLine(setLine+
1);
}
else
{
setLine =
GetLines();
MoveToLine(GetLines());
ReadLine(sTest);
upLen = file.GetPosition();
// 如果指定覆盖的行数大于总行数,则覆盖最后一行
MoveEnd();
}
file.Read(pbuf, restLen);
if (setLine ==
GetLines())
temp =
wString;
else
temp = wString+
"n"+
pbuf;
// 可能是因为CString计算长度时没有把"n"算进去,所以我们要在后面补上它的长度
fileLen = fileLen + wString.GetLength() -
sTest.GetLength();
if (setLine &
lt; GetLines())
MoveToLine(setLine);
else
MoveToLine(GetLines());
file.WriteString(temp);
file.SetLength(fileLen);
break;
case WRITE_MODE_DELETE:
if (fileLen ==
0)
break;
if (setLine &
lt; GetLines())
{
MoveToLine(setLine);
ReadLine(sTest);
MoveToLine(setLine+
1);
}
else
{
setLine =
GetLines();
MoveToLine(setLine);
upLen =
file.GetPosition();
ReadLine(sTest);
MoveEnd();
}
file.Read(pbuf, restLen);
temp =
pbuf;
// 可能是因为CString计算长度时没有把"n"算进去,所以我们要在后面补上它的长度
if (setLine &
lt; GetLines())
fileLen = fileLen - sTest.GetLength() -
2;
else
if (GetLines() ==
1)
fileLen =
0;
else
fileLen = upLen-
2;
// 删除上一行的\0x0D\0x0A
MoveToLine(setLine);
file.WriteString(temp);
file.SetLength(fileLen);
break;
}
}
// Delete the specified file.
void CDataFile::DeleteFile(LPCTSTR lpszFileName)
{
file.Remove(lpszFileName);
}
转载于:https://www.cnblogs.com/luyuxibaby/p/5217464.html
相关资源:数据结构—成绩单生成器