|
|
////////////////////////////////////////////////////////////////////////////////////
//
// File: fileio.cpp
//
// History: 06-Apr-01 markder Created.
//
// Desc: This file contains classes to encapsulate MBCS and UNICODE files.
//
////////////////////////////////////////////////////////////////////////////////////
#include "StdAfx.h"
#include "FileIO.h"
CTextFile::CTextFile( LPCTSTR lpszFileName, UINT nOpenFlags ) : CFile(lpszFileName, nOpenFlags) { }
CANSITextFile::CANSITextFile(LPCTSTR lpszFileName, UINT dwCodePage, UINT nOpenFlags) : CTextFile(lpszFileName, (nOpenFlags & (~CFile::typeText)) | CFile::typeBinary) { m_dwCodePage = dwCodePage; }
CUTF8TextFile::CUTF8TextFile(LPCTSTR lpszFileName, UINT nOpenFlags) : CTextFile(lpszFileName, (nOpenFlags & (~CFile::typeText)) | CFile::typeBinary) { UCHAR EncodingMarker[3];
EncodingMarker[0] = (UCHAR) 0xEF; EncodingMarker[1] = (UCHAR) 0xBB; EncodingMarker[2] = (UCHAR) 0xBF;
Write(&EncodingMarker, 3); }
CUTF16TextFile::CUTF16TextFile(LPCTSTR lpszFileName, UINT nOpenFlags) : CTextFile(lpszFileName, (nOpenFlags & (~CFile::typeText)) | CFile::typeBinary) { UCHAR EncodingMarker[2];
EncodingMarker[0] = (UCHAR) 0xFF; EncodingMarker[1] = (UCHAR) 0xFE;
Write(&EncodingMarker, 2); }
void CANSITextFile::WriteString(LPCTSTR lpsz) { LPVOID lpBuf = NULL; LPVOID lpAllocatedBuffer = NULL; LONG nBufSize = 0; LONG nBytesToWrite = 0; CString csStringToWrite(lpsz);
csStringToWrite.Replace(_T("\012"), _T("\015\012"));
#ifdef UNICODE
nBufSize = WideCharToMultiByte( m_dwCodePage, 0, csStringToWrite, -1, NULL, 0, NULL, NULL ); lpAllocatedBuffer = malloc(nBufSize); if (lpAllocatedBuffer == NULL) { AfxThrowMemoryException(); }
lpBuf = lpAllocatedBuffer;
nBytesToWrite = WideCharToMultiByte( m_dwCodePage, 0, csStringToWrite, -1, (LPSTR) lpBuf, nBufSize, NULL, NULL );
//
// Take off NULL terminator
//
nBytesToWrite--;
#else
lpBuf = (LPVOID) (LPCSTR) csStringToWrite; nBytesToWrite = strlen(csStringToWrite); // we use strlen to get total bytes
#endif
if (nBytesToWrite == 0) { goto eh; }
Write(lpBuf, nBytesToWrite);
eh: if (lpAllocatedBuffer) { free(lpAllocatedBuffer); } }
void CUTF8TextFile::WriteString(LPCTSTR lpsz) { LPVOID lpBuf = NULL; LPVOID lpAllocatedBuffer = NULL; LONG nBufSize = 0; LONG nBytesToWrite = 0; CString csStringToWrite(lpsz);
csStringToWrite.Replace(_T("\012"), _T("\015\012"));
#ifdef UNICODE
nBufSize = WideCharToMultiByte( CP_UTF8, 0, csStringToWrite, -1, NULL, 0, NULL, NULL ); lpAllocatedBuffer = malloc(nBufSize); if (lpAllocatedBuffer == NULL) { AfxThrowMemoryException(); }
lpBuf = lpAllocatedBuffer;
nBytesToWrite = WideCharToMultiByte( CP_UTF8, 0, csStringToWrite, -1, (LPSTR) lpBuf, nBufSize, NULL, NULL );
//
// Take off NULL terminator
//
nBytesToWrite--;
#else
lpBuf = (LPVOID) (LPCSTR) csStringToWrite; nBytesToWrite = strlen(csStringToWrite); // we use strlen to get total bytes
#endif
if (nBytesToWrite == 0) { goto eh; }
Write(lpBuf, nBytesToWrite);
eh: if (lpAllocatedBuffer) { free(lpAllocatedBuffer); } }
void CUTF16TextFile::WriteString(LPCTSTR lpsz) { LPVOID lpBuf = NULL; LPVOID lpAllocatedBuffer = NULL; LONG nBufSize = 0; LONG nBytesToWrite = 0; CString csStringToWrite(lpsz);
csStringToWrite.Replace(_T("\012"), _T("\015\012"));
#ifdef UNICODE
lpBuf = (LPVOID) (LPCWSTR) csStringToWrite; nBytesToWrite = csStringToWrite.GetLength() * sizeof(WCHAR);
#else
nBufSize = MultiByteToWideChar( CP_ACP, 0, csStringToWrite, -1, NULL, 0); lpAllocatedBuffer = malloc(nBufSize); if (lpAllocatedBuffer == NULL) { AfxThrowMemoryException(); }
lpBuf = lpAllocatedBuffer;
nBytesToWrite = MultiByteToWideChar( CP_ACP, 0, csStringToWrite, -1, lpBuf, nBufSize);
//
// Take off NULL terminator
//
nBytesToWrite -= sizeof(WCHAR);
#endif
if (nBytesToWrite == 0) { goto eh; }
Write(lpBuf, nBytesToWrite);
eh: if (lpAllocatedBuffer) { free(lpAllocatedBuffer); } }
|