# HelloWorld.cxx

    /*=========================================================================

      Program: GDCM (Grassroots DICOM). A DICOM library
      Module:  $URL$

      Copyright (c) 2006-2010 Mathieu Malaterre
      All rights reserved.
      See Copyright.txt or http://gdcm.sourceforge.net/Copyright.html for details.

         This software is distributed WITHOUT ANY WARRANTY; without even
         the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
         PURPOSE.  See the above copyright notice for more information.

    =========================================================================*/
    /*
     * This example is ... guess what this is for :)
     */

    #include "gdcmReader.h"
    #include "gdcmWriter.h"
    #include "gdcmAttribute.h"

    #include <iostream>

    int main(int argc, char *argv[])
    {
      if( argc < 3 )
        {
        std::cerr << argv[0] << " input.dcm output.dcm" << std::endl;
        return 1;
        }
      const char *filename = argv[1];
      const char *outfilename = argv[2];

      // Instanciate the reader:
      gdcm::Reader reader;
      reader.SetFileName( filename );
      if( !reader.Read() )
        {
        std::cerr << "Could not read: " << filename << std::endl;
        return 1;
        }

      // If we reach here, we know for sure only 1 thing:
      // It is a valid DICOM file (potentially an old ACR-NEMA 1.0/2.0 file)
      // (Maybe, it's NOT a Dicom image -could be a DICOMDIR, a RTSTRUCT, etc-)

      // The output of gdcm::Reader is a gdcm::File
      gdcm::File &file = reader.GetFile();

      // the dataset is the the set of element we are interested in:
      gdcm::DataSet &ds = file.GetDataSet();

      // Contruct a static(*) type for Image Comments :
      gdcm::Attribute<0x0020,0x4000> imagecomments;
      imagecomments.SetValue( "Hello, World !" );

      // Now replace the Image Comments from the dataset with our:
      ds.Replace( imagecomments.GetAsDataElement() );

      // Write the modified DataSet back to disk
      gdcm::Writer writer;
      writer.CheckFileMetaInformationOff(); // Do not attempt to reconstruct the file meta to preserve the file
                                            // as close to the original as possible.
      writer.SetFileName( outfilename );
      writer.SetFile( file );
      if( !writer.Write() )
        {
        std::cerr << "Could not write: " << outfilename << std::endl;
        return 1;
        }

      return 0;
    }

    /*
     * (*) static type, means that extra DICOM information VR & VM are computed at compilation time.
     * The compiler is deducing those values from the template arguments of the class.
     */