📄 mitab_middatafile.cpp
字号:
/**********************************************************************
* $Id: mitab_middatafile.cpp,v 1.14 2006/01/27 13:54:06 fwarmerdam Exp $
*
* Name: mitab_datfile.cpp
* Project: MapInfo TAB Read/Write library
* Language: C++
* Purpose: Implementation of the MIDDATAFile class used to handle
* reading/writing of the MID/MIF files
* Author: Stephane Villeneuve, stephane.v@videotron.ca
*
**********************************************************************
* Copyright (c) 1999, 2000, Stephane Villeneuve
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
**********************************************************************
*
* $Log: mitab_middatafile.cpp,v $
* Revision 1.14 2006/01/27 13:54:06 fwarmerdam
* fixed memory leak
*
* Revision 1.13 2005/10/04 19:36:10 dmorissette
* Added support for reading collections from MIF files (bug 1126)
*
* Revision 1.12 2005/09/29 19:46:55 dmorissette
* Use "\t" as default delimiter in constructor (Anthony D - bugs 1155 and 37)
*
* Revision 1.11 2004/05/20 13:50:06 fwarmerdam
* Call CPLReadLine(NULL) in Close() method to clean up working buffer.
*
* Revision 1.10 2002/04/26 14:16:49 julien
* Finishing the implementation of Multipoint (support for MIF)
*
* Revision 1.9 2002/04/24 18:37:39 daniel
* Added return statement at end of GetLastLine()
*
* Revision 1.8 2002/04/22 13:49:09 julien
* Add EOF validation in MIDDATAFile::GetLastLine() (Bug 819)
*
* Revision 1.7 2001/09/19 14:49:49 warmerda
* use VSIRewind() instead of rewind()
*
* Revision 1.6 2001/01/22 16:03:58 warmerda
* expanded tabs
*
* Revision 1.5 2000/01/15 22:30:44 daniel
* Switch to MIT/X-Consortium OpenSource license
*
* Revision 1.4 1999/12/19 17:41:29 daniel
* Fixed a memory leak
*
* Revision 1.3 1999/11/14 17:43:32 stephane
* Add ifdef to remove CPLError if OGR is define
*
* Revision 1.2 1999/11/11 01:22:05 stephane
* Remove DebugFeature call, Point Reading error, add IsValidFeature() to
* test correctly if we are on a feature
*
* Revision 1.1 1999/11/08 04:16:07 stephane
* First Revision
*
*
**********************************************************************/
#include "mitab.h"
/*=====================================================================
* class MIDDATAFile
*
*====================================================================*/
MIDDATAFile::MIDDATAFile()
{
m_fp = NULL;
m_szLastRead[0] = '\0';
m_szSavedLine[0] = '\0';
m_pszDelimiter = "\t"; // Encom 2003 (was NULL)
m_dfXMultiplier = 1.0;
m_dfYMultiplier = 1.0;
m_dfXDisplacement = 0.0;
m_dfYDisplacement = 0.0;
}
MIDDATAFile::~MIDDATAFile()
{
Close();
}
void MIDDATAFile::SaveLine(const char *pszLine)
{
if (pszLine == NULL)
{
m_szSavedLine[0] = '\0';
}
else
{
strncpy(m_szSavedLine,pszLine,MIDMAXCHAR);
}
}
const char *MIDDATAFile::GetSavedLine()
{
return m_szSavedLine;
}
int MIDDATAFile::Open(const char *pszFname, const char *pszAccess)
{
if (m_fp)
{
return -1;
}
/*-----------------------------------------------------------------
* Validate access mode and make sure we use Text access.
*----------------------------------------------------------------*/
if (EQUALN(pszAccess, "r", 1))
{
m_eAccessMode = TABRead;
pszAccess = "rt";
}
else if (EQUALN(pszAccess, "w", 1))
{
m_eAccessMode = TABWrite;
pszAccess = "wt";
}
else
{
return -1;
}
/*-----------------------------------------------------------------
* Open file for reading
*----------------------------------------------------------------*/
m_pszFname = CPLStrdup(pszFname);
m_fp = VSIFOpen(m_pszFname, pszAccess);
if (m_fp == NULL)
{
CPLFree(m_pszFname);
m_pszFname = NULL;
return -1;
}
SetEof(VSIFEof(m_fp));
return 0;
}
int MIDDATAFile::Rewind()
{
if (m_fp == NULL || m_eAccessMode == TABWrite)
return -1;
else
{
VSIRewind(m_fp);
SetEof(VSIFEof(m_fp));
}
return 0;
}
int MIDDATAFile::Close()
{
if (m_fp == NULL)
return 0;
// Close file
VSIFClose(m_fp);
m_fp = NULL;
// clear readline buffer.
CPLReadLine( NULL );
CPLFree(m_pszFname);
m_pszFname = NULL;
return 0;
}
const char *MIDDATAFile::GetLine()
{
const char *pszLine;
if (m_eAccessMode == TABRead)
{
pszLine = CPLReadLine(m_fp);
SetEof(VSIFEof(m_fp));
if (pszLine == NULL)
{
m_szLastRead[0] = '\0';
}
else
{
strncpy(m_szLastRead,pszLine,MIDMAXCHAR);
}
//if (pszLine)
// printf("%s\n",pszLine);
return pszLine;
}
else
CPLAssert(FALSE);
return NULL;
}
const char *MIDDATAFile::GetLastLine()
{
// Return NULL if EOF
if(GetEof())
{
return NULL;
}
else if (m_eAccessMode == TABRead)
{
// printf("%s\n",m_szLastRead);
return m_szLastRead;
}
// We should never get here (Read/Write mode not implemented)
CPLAssert(FALSE);
return NULL;
}
void MIDDATAFile::WriteLine(const char *pszFormat,...)
{
va_list args;
if (m_eAccessMode == TABWrite && m_fp)
{
va_start(args, pszFormat);
vfprintf( m_fp, pszFormat, args );
va_end(args);
}
else
{
CPLAssert(FALSE);
}
}
void MIDDATAFile::SetTranslation(double dfXMul,double dfYMul,
double dfXTran,
double dfYTran)
{
m_dfXMultiplier = dfXMul;
m_dfYMultiplier = dfYMul;
m_dfXDisplacement = dfXTran;
m_dfYDisplacement = dfYTran;
}
double MIDDATAFile::GetXTrans(double dfX)
{
return (dfX * m_dfXMultiplier) + m_dfXDisplacement;
}
double MIDDATAFile::GetYTrans(double dfY)
{
return (dfY * m_dfYMultiplier) + m_dfYDisplacement;
}
GBool MIDDATAFile::IsValidFeature(const char *pszString)
{
char **papszToken ;
papszToken = CSLTokenizeString(pszString);
// printf("%s\n",pszString);
if (CSLCount(papszToken) == 0)
{
CSLDestroy(papszToken);
return FALSE;
}
if (EQUAL(papszToken[0],"NONE") || EQUAL(papszToken[0],"POINT") ||
EQUAL(papszToken[0],"LINE") || EQUAL(papszToken[0],"PLINE") ||
EQUAL(papszToken[0],"REGION") || EQUAL(papszToken[0],"ARC") ||
EQUAL(papszToken[0],"TEXT") || EQUAL(papszToken[0],"RECT") ||
EQUAL(papszToken[0],"ROUNDRECT") || EQUAL(papszToken[0],"ELLIPSE") ||
EQUAL(papszToken[0],"MULTIPOINT")|| EQUAL(papszToken[0],"COLLECTION") )
{
CSLDestroy(papszToken);
return TRUE;
}
CSLDestroy(papszToken);
return FALSE;
}
GBool MIDDATAFile::GetEof()
{
return m_bEof;
}
void MIDDATAFile::SetEof(GBool bEof)
{
m_bEof = bEof;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -