231 lines
4.6 KiB
C++
231 lines
4.6 KiB
C++
|
////////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// 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);
|
||
|
}
|
||
|
}
|