CStdioFile
类的声明保存在
afx.h
头文件中。
CStdioFile
类继承自
CFile
类,
CStdioFile
对象表示一个用运行时的函数
fopen
打开的
c
运行时的流式文件。流式文件是被缓冲的,而且可以以文本方式(默认)或者二进制方式打开。
CStdioFile
类不支持
CFile
类中的
Duplicate
、
LockRange
、
UnlockRange
函数,如果你使用了,会得到
CNotSupportedException
类的错误。
CStringFile
类默认的是按照
Text
模式操作文件。
CFile
类默认的是按照二进制模式操作文件。
这里大致说明一下二进制模式和
Text
模式
的区别。
二进制模式:对于一行的结尾我们必须输入
”/r/n”
,才能表示回车换行的效果。
Text
模式:
”/r”
回车的工作是自动完成的,我们只需要写入
”/n”
即可。所以我们在使用文本模式时要注意,当我们从外部读入文件时,
”/r/n”
会被翻译成
”/n”
,写入文件时,我们对于回车换行只需提供
”/n”
,即可,
”/r/n”
会被写入到文件中。
m_pStream
成员变量:
打开文件的指针。
构造函数:
CStdioFile();
CStdioFile(FILE *pOpenStream);
CStdioFile(LPCTSTR lpFileName, UINT nOpenFlags);
throw(CFileException);
FILE *pOpenStream
:指的是
c
运行函数
fopen
调用后返回的文件指针。
LPCTSTR lpFileName
:指的是被打开的文件(绝对地址或相对地址)
UINT nOpenFlags
:指的是
CFile
类中所描述的打开文件的方式。
virtual LPTSTR ReadString(LPTSTR lpsz, UINT nMax);
throw(CFileException);
如果使用该函数读取文本文件,当遇到
”/r/n”
,停止读取,并去掉
”/r”
,保留
”/n”
,并在字符串尾部增加
”/0”
,
nMax
的长度包含有
”/0”
字符,
实际的分析如下:
如果
nMax <=
字符数,读取
(nMax-1)
个字符
+0x00
;
如果
nMax =
字符数
+ 1
,读取
nMax
个字符
+0x00
;
如果
nMax >
字符数,读取
nMax
个字符
+0x0A(”/n”) + 0x00
;
如果文件有多行,则当文件没有读完时,返回
NOT NULL
,读到文件尾,返回
NULL
。
BOOL ReadString(CString& rString);
throw(CFileException);
读取一行文本到
rString
中,遇到回车换行符停止读取,回车和换行符均不读到
rString
中,尾部也不添加
”0x00”
。
如果文件有多行,则当文件没有读完时,返回
TRUE
,读到文件尾,返回
FALSE
。
virtual void WriteString(LPTSTR lpsz);
throw(CFileException);
将缓冲区中的数据写入到与
CStdioFile
对象相关联的文件中,不支持
CString
类型数据写入,结束的
”/0”
不被写入到文件中,
lpsz
缓冲区中的所有换行符被替换为回车换行符即
”/n”
转换为
”/r/n”
。
void CDemoDlg::OnReadFile()
{
CListBox* pListBox = (CListBox*)GetDlgItem(IDC_LIST);
pListBox->ResetContent();
//创建文件对话框
CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY |
OFN_OVERWRITEPROMPT, _T("文本文件(*.*)|*.*||"));
if (dlg.DoModal() == IDOK)
{
//获得文件路径
CString strPathName = dlg.GetPathName();
CStdioFile file;
//打开文件
if (!file.Open(strPathName, CFile::modeRead))
{
::AfxMessageBox(_T("文件打开失败。"));
return;
}
//读文件
CString strText = _T("");
while (file.ReadString(strText))
{
pListBox->AddString(strText);
}
//关闭文件
file.Close();
}
}