亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? mitab_datfile.cpp

?? mitab,讀取MapInfo的地圖文件
?? CPP
?? 第 1 頁 / 共 5 頁
字號:
/**********************************************************************
 * $Id: mitab_datfile.cpp,v 1.19 2008/01/29 20:46:32 dmorissette Exp $
 *
 * Name:     mitab_datfile.cpp
 * Project:  MapInfo TAB Read/Write library
 * Language: C++
 * Purpose:  Implementation of the TABIDFile class used to handle
 *           reading/writing of the .DAT file
 * Author:   Daniel Morissette, dmorissette@dmsolutions.ca
 *
 **********************************************************************
 * Copyright (c) 1999-2001, Daniel Morissette
 *
 * 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_datfile.cpp,v $
 * Revision 1.19  2008/01/29 20:46:32  dmorissette
 * Added support for v9 Time and DateTime fields (byg 1754)
 *
 * Revision 1.18  2007/10/09 17:43:16  fwarmerdam
 * Remove static variables that interfere with reentrancy. (GDAL #1883)
 *
 * Revision 1.17  2004/06/30 20:29:03  dmorissette
 * Fixed refs to old address danmo@videotron.ca
 *
 * Revision 1.16  2001/05/01 12:32:03  daniel
 * Get rid of leading spaces in WriteDateField().
 *
 * Revision 1.15  2000/04/27 15:42:03  daniel
 * Map variable field length (width=0) coming from OGR to acceptable default
 *
 * Revision 1.14  2000/02/28 16:52:52  daniel
 * Added support for writing indexes, removed validation on field name in
 * NATIVE tables, and remove trailing spaces in DBF char field values
 *
 * Revision 1.13  2000/01/28 07:31:49  daniel
 * Validate char field width (must be <= 254 chars)
 *
 * Revision 1.12  2000/01/16 19:08:48  daniel
 * Added support for reading 'Table Type DBF' tables
 *
 * Revision 1.11  2000/01/15 22:30:43  daniel
 * Switch to MIT/X-Consortium OpenSource license
 *
 * Revision 1.10  1999/12/20 18:59:20  daniel
 * Dates again... now returned as "YYYYMMDD"
 *
 * Revision 1.9  1999/12/16 17:11:45  daniel
 * Date fields: return as "YYYY/MM/DD", and accept 3 diff. formats as input
 *
 * Revision 1.8  1999/12/14 03:58:29  daniel
 * Fixed date read/write (bytes were reversed)
 *
 * Revision 1.7  1999/11/09 07:34:35  daniel
 * Return default values when deleted attribute records are encountered
 *
 * Revision 1.6  1999/10/19 06:09:25  daniel
 * Removed obsolete GetFieldDef() method
 *
 * Revision 1.5  1999/10/01 03:56:28  daniel
 * Avoid multiple InitWriteHeader() calls (caused a leak) and added a fix
 * in WriteCharField() to prevent reading bytes past end of string buffer
 *
 * Revision 1.4  1999/10/01 02:02:36  warmerda
 * Added assertions to try and track TABRawBinBlock leak.
 *
 * Revision 1.3  1999/09/26 14:59:36  daniel
 * Implemented write support
 *
 * Revision 1.2  1999/09/20 18:43:20  daniel
 * Use binary access to open file.
 *
 * Revision 1.1  1999/07/12 04:18:23  daniel
 * Initial checkin
 *
 **********************************************************************/

#include "mitab.h"

/*=====================================================================
 *                      class TABDATFile
 *
 * Note that the .DAT files are .DBF files with some exceptions:
 *
 * All fields in the DBF header are defined as 'C' type (strings),
 * even for binary integers.  So we have to look in the associated .TAB
 * file to find the real field definition.
 *
 * Even though binary integers are defined as 'C' type, they are stored
 * in binary form inside a 4 bytes string field.
 *====================================================================*/


/**********************************************************************
 *                   TABDATFile::TABDATFile()
 *
 * Constructor.
 **********************************************************************/
TABDATFile::TABDATFile()
{
    m_fp = NULL;
    m_pszFname = NULL;
    m_eTableType = TABTableNative;

    m_poHeaderBlock = NULL;
    m_poRecordBlock = NULL;
    m_pasFieldDef = NULL;

    m_numFields = -1;
    m_numRecords = -1;
    m_nFirstRecordPtr = 0;
    m_nBlockSize = 0;
    m_nRecordSize = -1;
    m_nCurRecordId = -1;
    m_bCurRecordDeletedFlag = FALSE;
    m_bWriteHeaderInitialized = FALSE;
}

/**********************************************************************
 *                   TABDATFile::~TABDATFile()
 *
 * Destructor.
 **********************************************************************/
TABDATFile::~TABDATFile()
{
    Close();
}

/**********************************************************************
 *                   TABDATFile::Open()
 *
 * Open a .DAT file, and initialize the structures to be ready to read
 * records from it.
 *
 * We currently support NATIVE and DBF tables for reading, and only
 * NATIVE tables for writing.
 *
 * Returns 0 on success, -1 on error.
 **********************************************************************/
int TABDATFile::Open(const char *pszFname, const char *pszAccess,
                     TABTableType eTableType /*=TABNativeTable*/)
{
    int i;

    if (m_fp)
    {
        CPLError(CE_Failure, CPLE_FileIO,
                 "Open() failed: object already contains an open file");
        return -1;
    }

    /*-----------------------------------------------------------------
     * Validate access mode and make sure we use binary access.
     *----------------------------------------------------------------*/
    if (EQUALN(pszAccess, "r", 1) && (eTableType==TABTableNative ||
                                      eTableType==TABTableDBF)  )
    {
        m_eAccessMode = TABRead;
        pszAccess = "rb";
    }
    else if (EQUALN(pszAccess, "w", 1) && eTableType==TABTableNative)
    {
        m_eAccessMode = TABWrite;
        pszAccess = "wb";
    }
    else
    {
        CPLError(CE_Failure, CPLE_FileIO,
                 "Open() failed: access mode \"%s\" not supported", pszAccess);
        return -1;
    }

    /*-----------------------------------------------------------------
     * Open file for reading
     *----------------------------------------------------------------*/
    m_pszFname = CPLStrdup(pszFname);
    m_fp = VSIFOpen(m_pszFname, pszAccess);
    m_eTableType = eTableType;

    if (m_fp == NULL)
    {
        CPLError(CE_Failure, CPLE_FileIO,
                 "Open() failed for %s", m_pszFname);
        CPLFree(m_pszFname);
        m_pszFname = NULL;
        return -1;
    }

    if (m_eAccessMode == TABRead)
    {
        /*------------------------------------------------------------
         * READ ACCESS:
         * Read .DAT file header (record size, num records, etc...)
         * m_poHeaderBlock will be reused later to read field definition
         *-----------------------------------------------------------*/
        m_poHeaderBlock = new TABRawBinBlock(m_eAccessMode, TRUE);
        m_poHeaderBlock->ReadFromFile(m_fp, 0, 32);

        m_poHeaderBlock->ReadByte();       // Table type ??? 0x03
        m_poHeaderBlock->ReadByte();       // Last update year
        m_poHeaderBlock->ReadByte();       // Last update month
        m_poHeaderBlock->ReadByte();       // Last update day

        m_numRecords      = m_poHeaderBlock->ReadInt32();
        m_nFirstRecordPtr = m_poHeaderBlock->ReadInt16();
        m_nRecordSize     = m_poHeaderBlock->ReadInt16();

        m_numFields = m_nFirstRecordPtr/32 - 1;

        /*-------------------------------------------------------------
         * Read the field definitions
         * First 32 bytes field definition starts at byte 32 in file
         *------------------------------------------------------------*/
        m_pasFieldDef = (TABDATFieldDef*)CPLCalloc(m_numFields, 
                                                   sizeof(TABDATFieldDef));

        for(i=0; i<m_numFields; i++)
        {
            m_poHeaderBlock->GotoByteInFile((i+1)*32);
            m_poHeaderBlock->ReadBytes(11, (GByte*)m_pasFieldDef[i].szName);
            m_pasFieldDef[i].szName[10] = '\0';
            m_pasFieldDef[i].cType = (char)m_poHeaderBlock->ReadByte();

            m_poHeaderBlock->ReadInt32();       // Skip Bytes 12-15
            m_pasFieldDef[i].byLength = m_poHeaderBlock->ReadByte();
            m_pasFieldDef[i].byDecimals = m_poHeaderBlock->ReadByte();

            m_pasFieldDef[i].eTABType = TABFUnknown;
        }

        /*-------------------------------------------------------------
         * Establish a good record block size to use based on record size, and 
         * then create m_poRecordBlock
         * Record block size has to be a multiple of record size.
         *------------------------------------------------------------*/
        m_nBlockSize = ((1024/m_nRecordSize)+1)*m_nRecordSize;
        m_nBlockSize = MIN(m_nBlockSize, (m_numRecords*m_nRecordSize));

        CPLAssert( m_poRecordBlock == NULL );
        m_poRecordBlock = new TABRawBinBlock(m_eAccessMode, FALSE);
        m_poRecordBlock->InitNewBlock(m_fp, m_nBlockSize);
        m_poRecordBlock->SetFirstBlockPtr(m_nFirstRecordPtr);
    }
    else
    {
        /*------------------------------------------------------------
         * WRITE ACCESS:
         * Set acceptable defaults for all class members.
         * The real header initialization will be done when the first
         * record is written
         *-----------------------------------------------------------*/
        m_poHeaderBlock = NULL;

        m_numRecords      = 0;
        m_nFirstRecordPtr = 0;
        m_nRecordSize     = 0;
        m_numFields = 0;
        m_pasFieldDef = NULL;
        m_bWriteHeaderInitialized = FALSE;
    }

    return 0;
}

/**********************************************************************
 *                   TABDATFile::Close()
 *
 * Close current file, and release all memory used.
 *
 * Returns 0 on success, -1 on error.
 **********************************************************************/
int TABDATFile::Close()
{
    if (m_fp == NULL)
        return 0;

    /*----------------------------------------------------------------
     * Write access: Update the header with number of records, etc.
     * and add a CTRL-Z char at the end of the file.
     *---------------------------------------------------------------*/
    if (m_eAccessMode == TABWrite)
    {
        WriteHeader();

        char cEOF = 26;
        if (VSIFSeek(m_fp, 0L, SEEK_END) == 0)
            VSIFWrite(&cEOF, 1, 1, m_fp);
    }
    
    // Delete all structures 
    if (m_poHeaderBlock)
    {
        delete m_poHeaderBlock;
        m_poHeaderBlock = NULL;
    }

    if (m_poRecordBlock)
    {
        delete m_poRecordBlock;
        m_poRecordBlock = NULL;
    }

    // Close file
    VSIFClose(m_fp);
    m_fp = NULL;

    CPLFree(m_pszFname);
    m_pszFname = NULL;

    CPLFree(m_pasFieldDef);
    m_pasFieldDef = NULL;

    m_numFields = -1;
    m_numRecords = -1;
    m_nFirstRecordPtr = 0;
    m_nBlockSize = 0;
    m_nRecordSize = -1;
    m_nCurRecordId = -1;
    m_bWriteHeaderInitialized = FALSE;

    return 0;
}


/**********************************************************************
 *                   TABDATFile::InitWriteHeader()
 *
 * Init the header members to be ready to write the header and data records
 * to a newly created data file.
 *
 * Returns 0 on success, -1 on error.
 **********************************************************************/
int  TABDATFile::InitWriteHeader()
{
    int i;

    if (m_eAccessMode != TABWrite || m_bWriteHeaderInitialized)
        return 0;

    /*------------------------------------------------------------
     * Compute values for Record size, header size, etc.
     *-----------------------------------------------------------*/
    m_nFirstRecordPtr = (m_numFields+1)*32 + 1;

    m_nRecordSize = 1;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
午夜影院在线观看欧美| 欧美精品一区二区高清在线观看| 日本一区二区三区视频视频| 国产精品一二三四区| 久久美女高清视频| 成人性生交大片免费看中文| 国产精品久久福利| 日本福利一区二区| 视频一区二区国产| 亚洲精品在线三区| 成人免费观看男女羞羞视频| 一区二区国产盗摄色噜噜| 欧美三片在线视频观看| 久久精品久久99精品久久| 久久亚洲一级片| av成人免费在线| 首页欧美精品中文字幕| 久久综合资源网| av一区二区三区四区| 视频一区二区三区在线| 国产欧美一区二区精品仙草咪| 波多野结衣精品在线| 天天色天天操综合| 久久女同互慰一区二区三区| 99精品欧美一区| 日韩精品一二三区| 欧美激情综合网| 欧美三区在线观看| 国产99久久久精品| 三级欧美在线一区| 国产日韩欧美a| 欧美日韩和欧美的一区二区| 国产做a爰片久久毛片| 一区二区三区av电影| 精品国产网站在线观看| 色婷婷久久99综合精品jk白丝| 日韩av一区二区在线影视| 国产精品乱人伦一区二区| 欧美美女一区二区| 成人黄色大片在线观看| 午夜电影网亚洲视频| 国产精品成人一区二区艾草| 日韩西西人体444www| 色哟哟在线观看一区二区三区| 美女国产一区二区三区| 亚洲免费观看高清完整版在线观看 | 琪琪久久久久日韩精品| 中文字幕在线播放不卡一区| 日韩免费看网站| 欧美午夜精品久久久久久孕妇| 国产成人啪午夜精品网站男同| 日韩激情在线观看| 亚洲在线视频免费观看| 国产精品久久久久久久浪潮网站 | 国产精品一级片在线观看| 日韩制服丝袜av| 亚洲精品亚洲人成人网在线播放| 日本道在线观看一区二区| 麻豆精品新av中文字幕| 天堂午夜影视日韩欧美一区二区| 国产农村妇女毛片精品久久麻豆| 欧美日韩另类一区| www.欧美精品一二区| 久久不见久久见免费视频1| 亚洲已满18点击进入久久| 久久婷婷一区二区三区| 欧美老人xxxx18| 欧美性大战久久久| caoporn国产一区二区| 精品一区二区日韩| 天天影视涩香欲综合网| 亚洲精品一卡二卡| 国产精品网站在线观看| 精品国产91久久久久久久妲己 | 成人一道本在线| 国产一区二区影院| 美女在线视频一区| 轻轻草成人在线| 中文字幕制服丝袜成人av | 欧洲精品在线观看| 波多野结衣一区二区三区 | 亚洲三级电影网站| 欧美韩国日本不卡| 国产三级一区二区三区| 欧美tickling挠脚心丨vk| 欧美一区二区福利在线| 欧美日韩在线一区二区| 在线一区二区视频| 99在线热播精品免费| 国产一区二区在线影院| 久久不见久久见中文字幕免费| 老汉av免费一区二区三区 | 欧美精品一区二区三区四区| 欧美性猛片xxxx免费看久爱 | 在线观看三级视频欧美| 色综合天天综合网天天狠天天| 成人国产精品免费网站| www.视频一区| 色视频一区二区| 91黄色免费观看| 欧美日韩国产色站一区二区三区| 欧美喷水一区二区| 在线亚洲免费视频| 337p亚洲精品色噜噜噜| 日韩欧美第一区| 久久午夜免费电影| 综合亚洲深深色噜噜狠狠网站| 欧美国产综合一区二区| 亚洲精品日韩专区silk| 亚洲国产欧美在线| 五月天国产精品| 久久aⅴ国产欧美74aaa| 国产九九视频一区二区三区| 成人在线综合网| 一本久道中文字幕精品亚洲嫩| 欧美视频一区二| 欧美成人乱码一区二区三区| 久久久久高清精品| 亚洲色图一区二区三区| 亚洲精品videosex极品| 五月婷婷色综合| 精品一区二区三区不卡| 99久久精品国产导航| 欧美午夜精品久久久久久孕妇| 欧美电影免费观看高清完整版在| 久久综合国产精品| 亚洲女女做受ⅹxx高潮| 日韩电影一区二区三区| 精品一区二区三区在线播放视频| 波波电影院一区二区三区| 欧美剧情电影在线观看完整版免费励志电影 | 久久久欧美精品sm网站| 亚洲欧洲美洲综合色网| 日韩精品一级二级| 丁香六月久久综合狠狠色| 欧美性极品少妇| 国产午夜精品久久久久久免费视| 一区2区3区在线看| 国产高清不卡一区二区| 欧美性做爰猛烈叫床潮| 精品视频一区 二区 三区| 国产亚洲欧洲一区高清在线观看| 亚洲在线视频免费观看| 国产91丝袜在线观看| 欧美精品欧美精品系列| 亚洲天堂成人在线观看| 极品美女销魂一区二区三区| 日本道色综合久久| 日本一区二区三级电影在线观看 | 中文字幕在线观看不卡视频| 天天亚洲美女在线视频| 成人精品gif动图一区| 欧美日韩免费在线视频| 国产日韩视频一区二区三区| 日韩黄色小视频| 99精品视频免费在线观看| 久久伊人蜜桃av一区二区| 日韩一区欧美二区| 欧美在线制服丝袜| 国产精品传媒视频| 国产91高潮流白浆在线麻豆| 欧美伦理影视网| 日本网站在线观看一区二区三区| 在线亚洲免费视频| 亚洲乱码国产乱码精品精98午夜| 国产iv一区二区三区| 精品国产一区二区三区av性色| 日韩经典一区二区| 欧美剧在线免费观看网站 | 欧美国产国产综合| 六月婷婷色综合| 制服丝袜一区二区三区| 亚洲第一狼人社区| 欧美亚洲日本一区| 亚洲色图第一区| 91在线国内视频| 中文字幕一区二区三区在线播放| 国产精品99久久久久久久女警 | 欧美精品一区二区久久久| 久久成人免费网| www国产成人| 国产麻豆成人精品| 欧美激情在线一区二区三区| 国产精品主播直播| 国产午夜精品在线观看| 国产成人精品亚洲午夜麻豆| 亚洲伦理在线免费看| 成人黄页在线观看| 国产精品久久毛片a| 99精品视频在线观看免费| 久久久电影一区二区三区| 国产精品 欧美精品| 国产精品久久久久永久免费观看 | 一本大道久久精品懂色aⅴ| 亚洲男人都懂的| 欧美在线视频你懂得| 亚洲成人av福利| 精品久久久久一区二区国产| 国产精品亚洲人在线观看| 中文字幕欧美激情一区|