MFC学习笔记-CFile、CFileFind、CArchive

1,CFile文件操作
1),Open函数
virtual BOOL Open(LPCTSTR lpszFileName,UINT nOpenFlags,CFileException* pError = NULL);
功能:打开文件
参数:lpszFileName=文件路径,nOpenFlags=打开标志,pError =文件异常指针,如果文件打开过程发生错误,Open会返回异常,不会返回FALSE
打开标志:
CFile::modeCreate 创建新文件,文件存在,删除数据
CFile::modeCreateNoTruncate创建新文件,文件存在,不删除数据
CFile::modeRead以只读的方式打开文件
CFile::modeReadWrite以读写方式打开文件
CFile::modeWrite以只写方式打开文件
CFile::modeNoInherit阻止文本文件被
CFile::shareDenyNone不阻止其他进程读写的方式打开文件
CFile::shareDenyRead阻止其他进制读取的方式打开文件
CFile::shareDenyWrite阻止其他进程写入的方式打开文件
CFile::shareExclusive以独占的方式打开文件,阻止其他进程进行操作
CFile::shareCompat
CFile::typeText设置文本模式,对回车换行进行特殊处理
CFile::typeBinary设置二进制模式

2),Close函数
virtual void Close();
功能:关闭文件

3),Read函数
virtual UINT Read(void* lpBuf,UINT nCount);
功能:读取数据到缓冲区
参数:lpBuf=接收缓冲区,nCount=读取的个数

4),Write函数
virtual UINT Write(const void* lpBuf,UINT nCount);
功能:读取数据到缓冲区
参数:lpBuf=待写入缓冲区,nCount=读取的个数

5),Rename函数
static void PASCAL Rename(LPCTSTR lpszOldName,LPCTSTR lpszNewName)
功能:文件重命名
lpszOldName=文件老名字,lpszNewName=文件新名字

6),GetStatus函数
BOOL GetStatus(CFileStatus& rStatus) const;
功能:获取文件状态

7),SeekToEnd函数
功能:将文件指针移动到文件末尾,追加文本时可用

8),Flush函数
void Flush();//将缓冲区的内容写入文件,Close()之前必须添加

9),CStdioFile类
9-1),读取内容

CString szContent = L"", szResult = L"";
CStdioFile writeFile;
BOOL bResult = writeFile.Open(L"C:\\Users\\Administrator\\Desktop\\1.txt",
    CStdioFile::modeRead | CStdioFile::modeCreate | CStdioFile::modeNoTruncate);
if (!bResult)
{
    AfxMessageBox(L"打开失败");
    return;
}
else
{
    setlocale(LC_CTYPE, "chs");//设定,读取中文
    while (writeFile.ReadString(szContent))
    {
        szResult += szContent;
    }
    SetDlgItemTextW(IDC_EDIT_SHOW, szResult);
}

9-2),写入文件

CString szContent = L"HAHAHAHAHAHAHAHAHAHAHAHA中文测试-----\r\n", szResult = L"";

CStdioFile writeFile;
BOOL bResult = writeFile.Open(L"C:\\Users\\Administrator\\Desktop\\1.txt",
    CStdioFile::modeWrite | CStdioFile::modeCreate | CStdioFile::modeNoTruncate);
if (!bResult)
{
    AfxMessageBox(L"打开失败");
    return;
}
else
{
    CTime ct = CTime::GetCurrentTime();
    szResult.Format(L"[%4d/%2d/%2d %2d:%2d:%2d] %s", ct.GetYear(), ct.GetMonth(), ct.GetDay(),ct.GetHour(), ct.GetMinute(), ct.GetSecond(), szContent);
    writeFile.SeekToEnd();
    setlocale(LC_CTYPE, "chs");//设定写入中文
    writeFile.WriteString(szResult);
    writeFile.Flush();//必须有,将缓冲区的内容写入文件,如果没则部分内容会在缓冲区中,导致部分写入数据丢失。
    writeFile.Close();
}

2,CFileFind文件查找
1),MatchesMask函数
virtual BOOL MatchesMask(DWORD dwMask)const;
功能:设置文件查找的属性
参数:dwMask=指定文件属性
文件属性:
FILE_ATTRIBUTE_ARCHIVE 表示存档文件
FILE_ATTRIBUTE_COMPRESSED 表示压缩文件
FILE_ATTRIBUTE_DIRECTORY 表示目录文件
FILE_ATTRIBUTE_NORMAL 表示普通文件
FILE_ATTRIBUTE_HIDDEN 表示隐藏文件
FILE_ATTRIBUTE_READONLY 表示只读文件
FILE_ATTRIBUTE_SYSTEM 表示系统文件
FILE_ATTRIBUTE_TEMPORARY 表示临时文件

2),FindFile函数
virtual BOOL FindFile(LPCTSTR pstrName=NULL,DWORD dwUnused=0);
功能:设置查找文件的文件名称
参数:pstrName=查找的文件名称,可以设置为“*.*”,dwUnused=预留

3),GetFileName函数
virtual CString GetFileName()const;
功能:获取文件名称,含扩展名,不包含路径

4),GetFileTitle函数
virtual CString GetFileTitle()const;
功能:获取文件名称,不含扩展名,不包含路径

5),GetFilePath函数
virtual CString GetFilePath()const;
功能:获取文件名称,含扩展名,含完整路径

6),GetRoot函数
virtual CString GetRoot()const;
功能:获取文件路径目录,不含文件名

3,CArchive串行化
1),构造函数
CArchive(CFile* pFile,UINT nMode ,int nBufSize=4096,void* lpBuf=NULL);
参数:pFile=文件对象指针,nMode =加载对象还是保存数据,nBufSize=文件缓冲区的大小,lpBuf=可选指针
nMode的值:
CArchive::load 加载数据
CArchive::store 保存数据
CArchive::bNoFlushOnDelete 禁止存档对象在释放时自动调用Flush方法

2),Read函数
UINT Read(void* lpBuf,UINT nMax);
功能:从存档文件中读取数据
参数:lpBuf=接收数据缓冲区,nMax=读取数据的大小

3),Write函数
void Write(void* lpBuf,UINT nMax);
功能:写入数据到缓冲区中
参数:lpBuf=写入数据缓冲区,nMax=写入数据的大小

4),“<<”“>>”重载
“<<”写入数据
“>>”读取数据

4-1),写入数据

//CFile fileTest(L"1.txt", CFile::modeCreate | CFile::modeWrite);
CFile fileTest;
fileTest.Open(L"1.txt", CFile::modeCreate | CFile::modeWrite);
CArchive ar(&fileTest, CArchive::store);
int nTest = 4;
char chTest = 'a';
float fTest = 1.3f;
CString szTest("hello word!");
ar << nTest << chTest << fTest << szTest;
fileTest.Close();

4-2),读取数据

CFile fileTest(L"1.txt", CFile::modeCreate | CFile::modeWrite);
CArchive ar(&fileTest, CArchive::load);
int nTest1;
char chTest1;
float fTest1;
CString szTest1;
CString szResult;
ar >> nTest1 >> chTest1 >> fTest1 >> szTest1;   
//注意,前面的按照怎样的顺序写入数据的,在这里就得按照怎样的顺序读取数据
szResult.Format(L"%d,%c,%f,%s", nTest1, chTest1, fTest1, szTest1);
fileTest.Close();
MessageBox(szResult);

5),IsLoading函数
BOOL IsLoading()const;
功能:确定存档文件是否加载数据

6),IsStoring函数
BOOL IsStoring()const;
功能:确定存档文件是否存储数据

5,串行化类
1),串行化类必须的宏
DECLARE_SERIAL(头文件)
IMPLEMENT_SERIAL(源文件)

2),必须派生自CObject,然后重载Serialize函数

头文件

class CArchiveClassTest:CObject
{
    DECLARE_SERIAL(CArchiveClassTest);
public:
    CArchiveClassTest();
    virtual ~CArchiveClassTest();
public:
    virtual void Serialize(CArchive&ar);
public:
    int m_nData;
    CString m_szData;
};

源文件

IMPLEMENT_SERIAL(CArchiveClassTest, CObject, 1)
CArchiveClassTest::CArchiveClassTest()
{
}


CArchiveClassTest::~CArchiveClassTest()
{
}

void CArchiveClassTest::Serialize(CArchive & ar)
{
    if (ar.IsStoring) 
    {
        ar << m_nData<<m_szData;
    }
    else 
    {
        ar >> m_nData>> m_szData;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值