現在位置: ホーム その他 講義関連 FY2009 交通シミュレーション特論 reflist1.cpp

reflist1.cpp

サンプルプログラム (第5回, 第6回)

reflist1.cpp — C++ source code, 3 kB (3584 bytes)

ファイルコンテンツ

// -*- C++ -*-

#include <iostream>
#include <iomanip>
#include <cstring>
#include <cstdlib>
#include "tinyxml.h"

using std :: cout ;
using std :: cerr ;
using std :: endl ;


void
printUsage
( const char * argzero )
{
  cerr << "Usage:" << endl << " " << argzero << endl
       << " No command line arguments allowed." << endl ;
}


// Copied from TinyXML tutorial ----

// Indents per space
const unsigned int NUM_INDENTS_PER_SPACE = 2 ;

const char *
getIndent
( unsigned int numIndents )
{
  static const char * pINDENT="                                      + " ;
  static const unsigned int LENGTH = strlen ( pINDENT ) ;
  unsigned int n = numIndents * NUM_INDENTS_PER_SPACE ;
  if ( n > LENGTH )
    n = LENGTH ;

  return & pINDENT [ LENGTH - n ] ;
}


// same as getIndent but no "+" at the end
const char *
getIndentAlt
( unsigned int numIndents )
{
  static const char * pINDENT="                                        " ;
  static const unsigned int LENGTH = strlen ( pINDENT ) ;
  unsigned int n = numIndents * NUM_INDENTS_PER_SPACE ;
  if ( n > LENGTH )
    n = LENGTH ;

  return & pINDENT [ LENGTH - n ] ;
}


int
dump_attribs_to_stdout
( TiXmlElement * pElement ,
  unsigned int indent )
{
  if ( ! pElement )
    return 0 ;

  TiXmlAttribute * pAttrib = pElement -> FirstAttribute () ;
  int i = 0 ;
  int ival ;
  double dval ;
  const char * pIndent = getIndent ( indent ) ;
  cout << endl ;
  while ( pAttrib )
  {
    cout << pIndent << pAttrib -> Name () << ": value=["
         << pAttrib -> Value () << "]" ;
    if ( pAttrib -> QueryIntValue ( & ival ) == TIXML_SUCCESS )
      cout << " int=" << ival ;
    if ( pAttrib -> QueryDoubleValue ( & dval ) == TIXML_SUCCESS )
      cout << " d=" << std :: setprecision ( 1 ) << dval ;
    cout << endl ;
    ++ i ;
    pAttrib = pAttrib -> Next () ;
  }
  return i ;
}


void
dump_to_stdout
( TiXmlNode * pParent ,
  unsigned int indent = 0 )
{
  if ( ! pParent ) return ;

  TiXmlNode * pChild ;
  TiXmlText * pText ;
  int t = pParent -> Type () ;
  cout << getIndent ( indent ) ;
  int num ;

  switch ( t )
  {
  case TiXmlNode :: DOCUMENT :
    cout << "Document" ;
    break ;

  case TiXmlNode :: ELEMENT :
    cout << "Element [" << pParent -> Value () << "]" ;
    num = dump_attribs_to_stdout ( pParent -> ToElement () , indent + 1 ) ;
    switch ( num )
    {
    case 0 :
      cout << " (No attributes)" ;
      break ;
    case 1 :
      cout << getIndentAlt ( indent ) << "1 attribute" ;
      break ;
    default :
      cout << getIndentAlt ( indent ) << num << " attributes" ;
      break ;
    }
    break ;
  case TiXmlNode :: COMMENT :
    cout << "Comment: [" << pParent -> Value () << "]" ;
    break ;
  case TiXmlNode :: UNKNOWN :
    cout << "Unknown" ;
    break ;
  case TiXmlNode :: TEXT :
    pText = pParent -> ToText () ;
    cout << "Text: [" << pText -> Value () << "]" ;
    break ;
  case TiXmlNode :: DECLARATION :
    cout << "Declaration" ;
    break ;
  default :
    break ;
  }
  cout << endl ;
  for ( pChild = pParent -> FirstChild () ; pChild != 0 ;
        pChild = pChild -> NextSibling () ) 
  {
    dump_to_stdout ( pChild, indent + 1 ) ;
  }
}



int
main
( int argc ,
  char * * argv )
{
  if ( argc != 1 )
  {
    cerr << "Error: too many arguments." << endl ;
    printUsage ( argv [ 0 ] ) ;
    return 1 ;
  }

  TiXmlDocument doc ( "references-list.xml" ) ;
  bool loadOkay = doc . LoadFile () ;
  if ( ! loadOkay )
  {
    cerr << "Failed to load file \"references-list.xml\"" << endl ;
    exit ( 1 ) ;
  }

  dump_to_stdout ( & doc ) ;
  exit ( 0 ) ;
}
2020 年 4月 »
4月
1234
567891011
12131415161718
19202122232425
2627282930