CStdioFile
类
表示由运行时函数 fopen
打开的 C 运行时流文件。
语法
class CStdioFile : public CFile
成员
公共构造函数
名称 | 描述 |
---|---|
CStdioFile::CStdioFile |
从路径或文件指针构造 CStdioFile 对象。 |
公共方法
名称 | 描述 |
---|---|
CStdioFile::Open |
已重载。 Open 旨在与默认 CStdioFile 构造函数结合使用(替代 CFile::Open )。 |
CStdioFile::ReadString |
读取单行文本。 |
CStdioFile::Seek |
定位当前文件指针。 |
CStdioFile::WriteString |
写入单行文本。 |
公共数据成员
“属性” | 描述 |
---|---|
CStdioFile::m_pStream |
包含指向已打开文件的指针。 |
注解
流文件会进行缓冲,可以在文本模式(默认)或二进制模式下打开。
文本模式为回车-换行符对提供特殊处理。 将换行符 (0x0A) 写入文本模式 CStdioFile
对象时,字节对 (0x0D, 0x0A) 会发送到文件。 进行读取时,字节对 (0x0D, 0x0A) 会转换为单个 0x0A 字节。
CStdioFile
不支持 CFile
函数 Duplicate
、LockRange
和 UnlockRange
。
如果对 CStdioFile
调用这些函数,则会获得 CNotSupportedException
。
有关如何使用 CStdioFile
的详细信息,请参阅运行时库参考中的文章 MFC 中的文件和文件处理。
继承层次结构
CStdioFile
要求
标头:afx.h
CStdioFile::CStdioFile
构造并初始化一个 CStdioFile
对象。
CStdioFile();
CStdioFile(CAtlTransactionManager* pTM);
CStdioFile(FILE* pOpenStream);
CStdioFile(
LPCTSTR lpszFileName,
UINT nOpenFlags);
CStdioFile(
LPCTSTR lpszFileName,
UINT nOpenFlags,
CAtlTransactionManager* pTM);
参数
pOpenStream
指定调用 C 运行时函数 fopen
时返回的文件指针。
lpszFileName
指定一个字符串,它是所需文件的路径。 路径可以是相对路径或绝对路径。
nOpenFlags
指定用于文件创建、文件共享和文件访问模式的选项。 可以使用按位“或”(|
) 运算符指定多个选项。
一个文件访问模式选项是必需的;其他模式是可选的。 请参阅 CFile::CFile
以了解模式选项和其他标志的列表。 在 MFC 版本 3.0 及更高版本中,允许使用共享标志。
pTM
指向 CAtlTransactionManager
对象的指针。
注解
默认构造函数不会将文件附加到 CStdioFile
对象。 使用此构造函数时,必须使用 CStdioFile::Open
方法打开文件并将其附加到 CStdioFile
对象。
单参数构造函数会将打开的文件流附加到 CStdioFile
对象。 允许的指针值包括预定义输入/输出文件指针 stdin
、stdout
或 stderr
。
双参数构造函数会创建 CStdioFile
对象,并使用给定路径打开对应文件。
如果为 pOpenStream
或 lpszFileName
传递 NULL
,则构造函数会引发 CInvalidArgException*
。
如果无法打开或创建文件,则构造函数会引发 CFileException*
。
示例
TCHAR* pFileName = _T("CStdio_File.dat");
CStdioFile f1;
if(!f1.Open(pFileName, CFile::modeCreate | CFile::modeWrite
| CFile::typeText))
{
TRACE(_T("Unable to open file\n"));
}
CStdioFile f2(stdout);
try
{
CStdioFile f3( pFileName,
CFile::modeCreate | CFile::modeWrite | CFile::typeText );
}
catch(CFileException* pe)
{
TRACE(_T("File could not be opened, cause = %d\n"),
pe->m_cause);
pe->Delete();
}
CStdioFile::m_pStream
m_pStream
数据成员是指向 C 运行时函数 fopen
返回的已打开文件的指针。
FILE* m_pStream;
备注
如果文件从未打开或已关闭,则为 NULL
。
CStdioFile::Open
已重载。 Open 旨在与默认 CStdioFile
构造函数结合使用。
virtual BOOL Open(
LPCTSTR lpszFileName,
UINT nOpenFlags,
CFileException* pError = NULL);
virtual BOOL Open(
LPCTSTR lpszFileName,
UINT nOpenFlags,
CAtlTransactionManager* pTM,
CFileException* pError = NULL);
参数
lpszFileName
一个字符串,它是所需文件的路径。 路径可以是相对路径或绝对路径。
nOpenFlags
共享和访问模式。 指定打开文件时要执行的操作。 可以使用按位“或”(|
) 运算符来组合选项。 一个访问权限和一个共享选项是必需的;modeCreate 和 modeNoInherit 模式是可选的。
pError
指向接收失败操作状态的现有文件异常对象的指针。
pTM
指向 CAtlTransactionManager
对象的指针。
返回值
如果成功,则返回 TRUE
;否则返回 FALSE
。
注解
CStdioFile::ReadString
将文本数据从与 CStdioFile
对象关联的文件读取到缓冲区中(最多限制为 nMax
-1 个字符)。
virtual LPTSTR ReadString(
LPTSTR lpsz,
UINT nMax);
virtual BOOL ReadString(CString& rString);
参数
lpsz
指定一个指向用户提供的缓冲区的指针,该缓冲区将接收以 null 结尾的文本字符串。
nMax
指定要写入到 lpsz
缓冲区的最大字符数,包括结尾的 null。
rString
对 CString
对象的引用,该对象将在函数返回时包含字符串。
返回值
指向包含文本数据的缓冲区的指针。 如果在没有读取任何数据的情况下到达文件尾,则为 NULL
;或者,如果是布尔值,在没有读取任何数据的情况下到达文件尾,则为 FALSE
。
备注
读取由第一个换行符停止。 在这种情况下,如果读取的字符少于 nMax
-1 个,则换行符会存储在缓冲区中。 在任一情况下都会追加一个空字符 ('\0'
)。
CFile::Read
也可用于文本模式输入,但它不会以回车换行符对终止。
注意
此函数的 CString
版本会在 '\n'
存在时移除它;LPTSTR
版本则不会。
示例
CStdioFile f(stdin);
TCHAR buf[100];
f.ReadString(buf, 99);
CStdioFile::Seek
将指针重新定位在以前打开的文件中。
virtual ULONGLONG Seek(
LONGLONG lOff,
UINT nFrom);
参数
lOff
要将指针移动的字节数。
nFrom
指针移动模式。 必须是以下值之一:
CFile::begin
:将文件指针从文件开头向前移动lOff
个字节。CFile::current
:将文件指针从文件中的当前位置移动lOff
个字节。CFile::end
:将文件指针从文件末尾移动lOff
个字节。 请注意,lOff
必须为负值才能搜索现有文件;正值将在文件末尾后面搜索。
返回值
如果请求的位置合法,则 Seek
返回新字节相对于文件开头的偏移量。 否则,返回值未定义,会引发 CFileException
对象。
备注
Seek
函数允许通过将指针绝对或相对移动指定的量来随机访问文件的内容。 在搜索期间,实际上不会读取任何数据。 如果请求的位置大于文件大小,则文件长度会延长到该位置,不会引发异常。
打开文件时,文件指针位于偏移量 0 处,即文件的开头。
Seek
的此实现基于运行时库 (CRT) 函数 fseek
。 对文本模式下打开的流使用 Seek
时有几个限制。 有关详细信息,请参阅 fseek
、 _fseeki64
。
示例
下面的示例演示如何使用 Seek
将指针从 cfile
文件开头移动 1000 个字节。 请注意,Seek
不读取数据,因此必须随后调用 CStdioFile::ReadString
以读取数据。
CStdioFile cfile(_T("Stdio_Seek_File.dat"), CFile::modeWrite |
CFile::modeCreate);
LONGLONG lOff = 1000;
ULONGLONG lActual = cfile.Seek(lOff, CFile::begin);
CStdioFile::WriteString
将缓冲区中的数据写入与 CStdioFile
对象关联的文件。
virtual void WriteString(LPCTSTR lpsz);
参数
lpsz
指定指向包含以 null 结尾的字符串的缓冲区的指针。
备注
终止空字符 (\0
) 不会写入文件。 此方法会将 lpsz
中的换行符作为回车-换行符对写入文件中。
如果要将不是以 null 结尾的数据写入文件,请使用 CStdioFile::Write
或 CFile::Write
。
如果为 lpsz
参数指定 NULL
,此方法会引发 CInvalidArgException*
。
此方法会引发 CFileException*
以响应文件系统错误。
示例
CStdioFile f(stdout);
TCHAR buf[] = _T("test string");
f.WriteString(buf);
另请参阅
CFile
类
层次结构图
CFile
类
CFile::Duplicate
CFile::LockRange
CFile::UnlockRange
CNotSupportedException
类