CStdioFile Class

Represents a C run-time stream file as opened by the run-time function fopen.

Syntax

class CStdioFile : public CFile

Members

Public Constructors

Name Description
CStdioFile::CStdioFile Constructs a CStdioFile object from a path or file pointer.

Public Methods

Name Description
CStdioFile::Open Overloaded. Open is designed for use with the default CStdioFile constructor (Overrides CFile::Open).
CStdioFile::ReadString Reads a single line of text.
CStdioFile::Seek Positions the current file pointer.
CStdioFile::WriteString Writes a single line of text.

Public Data Members

Name Description
CStdioFile::m_pStream Contains a pointer to an open file.

Remarks

Stream files are buffered and can be opened in either text mode (the default) or binary mode.

Text mode provides special processing for carriage return-line feed pairs. When you write a line feed (newline) character (0x0A) to a text-mode CStdioFile object, the byte pair (0x0D, 0x0A) is sent to the file. When you read, the byte pair (0x0D, 0x0A) is translated to a single 0x0A byte.

The CFile functions Duplicate, LockRange, and UnlockRange are not supported for CStdioFile.

If you call these functions on a CStdioFile, you will get a CNotSupportedException.

For more information on using CStdioFile, see the articles Files in MFC and File Handling in the Run-Time Library Reference.

Inheritance Hierarchy

CObject

CFile

CStdioFile

Requirements

Header: afx.h

CStdioFile::CStdioFile

Constructs and initializes a CStdioFile object.

CStdioFile();
CStdioFile(CAtlTransactionManager* pTM);
CStdioFile(FILE* pOpenStream);

CStdioFile(
    LPCTSTR lpszFileName,
    UINT nOpenFlags);

CStdioFile(
    LPCTSTR lpszFileName,
    UINT nOpenFlags,
    CAtlTransactionManager* pTM);

Parameters

pOpenStream
Specifies the file pointer returned by a call to the C run-time function fopen.

lpszFileName
Specifies a string that is the path to the desired file. The path can be relative or absolute.

nOpenFlags
Specifies options for file creation, file sharing, and file access modes. You can specify multiple options by using the bitwise OR ( | ) operator.

One file access mode option is required; other modes are optional. See CFile::CFile for a list of mode options and other flags. In MFC version 3.0 and later, share flags are allowed.

pTM
Pointer to CAtlTransactionManager object.

Remarks

The default constructor does not attach a file to the CStdioFile object. When using this constructor, you must use the CStdioFile::Open method to open a file and attach it to the CStdioFile object.

The single-parameter constructor attaches an open file stream to the CStdioFile object. Allowed pointer values include the predefined input/output file pointers stdin, stdout, or stderr.

The two-parameter constructor creates a CStdioFile object and opens the corresponding file with the given path.

If you pass NULL for either pOpenStream or lpszFileName, the constructor throws a CInvalidArgException*.

If the file cannot be opened or created, the constructor throws a CFileException*.

Example

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

The m_pStream data member is the pointer to an open file as returned by the C run-time function fopen.

FILE* m_pStream;

Remarks

It is NULL if the file has never been opened or has been closed.

CStdioFile::Open

Overloaded. Open is designed for use with the default CStdioFile constructor.

virtual BOOL Open(
    LPCTSTR lpszFileName,
    UINT nOpenFlags,
    CFileException* pError = NULL);

virtual BOOL Open(
    LPCTSTR lpszFileName,
    UINT nOpenFlags,
    CAtlTransactionManager* pTM,
    CFileException* pError = NULL);

Parameters

lpszFileName
A string that is the path to the desired file. The path can be relative or absolute.

nOpenFlags
Sharing and access mode. Specifies the action to take when opening the file. You can combine options by using the bitwise-OR (|) operator. One access permission and one share option are required; the modeCreate and modeNoInherit modes are optional.

pError
A pointer to an existing file-exception object that will receive the status of a failed operation.

pTM
Pointer to a CAtlTransactionManager object.

Return Value

TRUE if successful; otherwise FALSE.

Remarks

CStdioFile::ReadString

Reads text data into a buffer, up to a limit of nMax-1 characters, from the file associated with the CStdioFile object.

virtual LPTSTR ReadString(
    LPTSTR lpsz,
    UINT nMax);

virtual BOOL ReadString(CString& rString);

Parameters

lpsz
Specifies a pointer to a user-supplied buffer that will receive a null-terminated text string.

nMax
Specifies the maximum number of characters to write into the lpsz buffer, including the terminating null.

rString
A reference to a CString object that will contain the string when the function returns.

Return Value

A pointer to the buffer containing the text data. NULL if end-of-file was reached without reading any data; or if boolean, FALSE if end-of-file was reached without reading any data.

Remarks

Reading is stopped by the first newline character. If, in that case, fewer than nMax-1 characters have been read, a newline character is stored in the buffer. A null character ('\0') is appended in either case.

CFile::Read is also available for text-mode input, but it does not terminate on a carriage return-line feed pair.

Note

The CString version of this function removes the '\n' if present; the LPTSTR version does not.

Example

CStdioFile f(stdin);
TCHAR buf[100];

f.ReadString(buf, 99);

CStdioFile::Seek

Repositions the pointer in a previously opened file.

virtual ULONGLONG Seek(
    LONGLONG lOff,
    UINT nFrom);

Parameters

lOff
Number of bytes to move the pointer.

nFrom
Pointer movement mode. Must be one of the following values:

  • CFile::begin: Move the file pointer lOff bytes forward from the beginning of the file.

  • CFile::current: Move the file pointer lOff bytes from the current position in the file.

  • CFile::end: Move the file pointer lOff bytes from the end of the file. Note that lOff must be negative to seek into the existing file; positive values will seek past the end of the file.

Return Value

If the requested position is legal, Seek returns the new byte offset from the beginning of the file. Otherwise, the return value is undefined and a CFileException object is thrown.

Remarks

The Seek function permits random access to a file's contents by moving the pointer a specified amount, absolutely or relatively. No data is actually read during the seek. If the requested position is larger than the size of the file, the file length will be extended to that position, and no exception will be thrown.

When a file is opened, the file pointer is positioned at offset 0, the beginning of the file.

This implementation of Seek is based on the Run-Time Library (CRT) function fseek. There are several limits on the usage of Seek on streams opened in text mode. For more information, see fseek, _fseeki64.

Example

The following example shows how to use Seek to move the pointer 1000 bytes from the beginning of the cfile file. Note that Seek does not read data, so you must subsequently call CStdioFile::ReadString to read data.

CStdioFile cfile(_T("Stdio_Seek_File.dat"), CFile::modeWrite |
   CFile::modeCreate);
LONGLONG lOff = 1000;
ULONGLONG lActual = cfile.Seek(lOff, CFile::begin);

CStdioFile::WriteString

Writes data from a buffer to the file associated with the CStdioFile object.

virtual void WriteString(LPCTSTR lpsz);

Parameters

lpsz
Specifies a pointer to a buffer that contains a null-terminated string.

Remarks

The terminating null character ( \0) is not written to the file. This method writes newline characters in lpsz to the file as a carriage return-line feed pair.

If you want to write data that is not null-terminated to a file, use CStdioFile::Write or CFile::Write.

This method throws a CInvalidArgException* if you specify NULL for the lpsz parameter.

This method throws a CFileException* in response to file system errors.

Example

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

f.WriteString(buf);

See also

CFile Class
Hierarchy Chart
CFile Class
CFile::Duplicate
CFile::LockRange
CFile::UnlockRange
CNotSupportedException Class