CStdioFile 类

注意

Microsoft基础类(MFC)库将继续受到支持。 但是,我们不再添加功能或更新文档。

表示由运行时函数 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 字节。

CFile 不支持 Duplicate 函数 LockRange、UnlockRange 和 CStdioFile。

如果对 CStdioFile 调用这些函数,则会获得 CNotSupportedException。

有关如何使用 CStdioFile 的详细信息,请参阅运行时库参考中的文章 MFC 中的文件和文件处理。

继承层次结构

CObject

CFile

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 对象,并使用给定路径打开对应文件。

如果为 NULL 或 pOpenStream 传递 lpszFileName,则构造函数会引发 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

将文本数据从与 nMax 对象关联的文件读取到缓冲区中(最多限制为 CStdioFile-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 结尾的字符串的缓冲区的指针。

注解

终止 null 字符 (\0) 不会写入文件。 此方法会将 lpsz 中的换行符作为回车-换行符对写入文件中。

如果要将不是以 null 结尾的数据写入文件,请使用 CStdioFile::Write 或 CFile::Write。

如果为 CInvalidArgException* 参数指定 NULL,此方法会引发 lpsz。

此方法会引发 CFileException* 以响应文件系统错误。

示例

CStdioFile f(stdout);
TCHAR buf[] = _T("test string");

f.WriteString(buf);

另请参阅

CFile 类
层次结构图
CFile 类
CFile::Duplicate
CFile::LockRange
CFile::UnlockRange
CNotSupportedException 类