title: "Best" Input File Formats for C++?
body: <p>I am starting work on a new piece of software that will end up needing some robust and expandable file IO.  There are a lot of formats out there.  XML, JSON, INI, etc.  However, there are always plusses and minuses so I thought I would ask for some community input.  </p>
  
  <p>Here are some rough requirements:</p>
  
  <ol>
  <li>The format is a "standard"...I don't want to reinvent the wheel if I don't have to.  It doesn't have to be a formal IEEE standard, but something you could Google and get some information on as a new user, may have some support tools (editors) beyond vi.  (Though the software users will generally be computer savvy and happy to use vi.)</li>
  <li>Easily integrates with C++.  I don't want to have to pull along a 100mb library and three different compilers to get it up and running.</li>
  <li>Supports tabular input (2d, n-dimensional)</li>
  <li>Supports POD types</li>
  <li>Can expand as more inputs are required, binds well to variables, etc.</li>
  <li>Parsing speed is not terribly important</li>
  <li>Ideally, as easy to write (reflect) as it is to read</li>
  <li>Works well on Windows and Linux</li>
  <li>Supports compositing (one file referencing another file to read, and so on.)</li>
  <li>Human Readable</li>
  </ol>
  
  <p>In a perfect world, I would use a header-only library or some clean STL implementation, but I'm fine with leveraging Boost or some small external library if it works well.</p>
  
  <p>So, what are your thoughts on various formats?  Drawbacks?  Advantages?</p>
  
  <p><strong>Edit</strong></p>
  
  <p>Options to consider?  Anything else to add?</p>
  
  <ul>
  <li>XML</li>
  <li>YAML</li>
  <li>SQLite</li>
  <li>Google Protocol Buffers</li>
  <li>Boost Serialization</li>
  <li>INI</li>
  <li>JSON</li>
  </ul>