# HG changeset patch # User dbateman # Date 1182911271 0 # Node ID 301885c9d265ffb66323897dd17c0bc05166036c # Parent dd8cef76043d0fdc4e02fa7050852a27e99b1834 [project @ 2007-06-27 02:27:51 by dbateman] diff -r dd8cef76043d -r 301885c9d265 src/ChangeLog --- a/src/ChangeLog Tue Jun 26 15:54:41 2007 +0000 +++ b/src/ChangeLog Wed Jun 27 02:27:51 2007 +0000 @@ -1,3 +1,9 @@ +2007-06-27 David Bateman + + * src/load-save.cc (Fsave): Ensure header is written for non + existent file with "-append". + * src/ls-hdf5.h: First steps towards having append work for hdf5. + 2007-06-26 John W. Eaton * src/load-save.cc (Fsave): Open files correctly for -append. diff -r dd8cef76043d -r 301885c9d265 src/load-save.cc --- a/src/load-save.cc Tue Jun 26 15:54:41 2007 +0000 +++ b/src/load-save.cc Wed Jun 27 02:27:51 2007 +0000 @@ -1,4 +1,4 @@ -/* +`= 0) { @@ -1688,23 +1688,25 @@ || format == LS_MAT7_BINARY) mode |= std::ios::binary; - bool write_header_info = ! append; - #ifdef HAVE_HDF5 if (format == LS_HDF5) { + // FIXME. It should be possible to append to HDF5 files. if (append) { error ("save: appending to HDF5 files is not implemented"); return retval; } - hdf5_ofstream hdf5_file (fname.c_str ()); + bool write_header_info = ! (append && + H5Fis_hdf5 (fname.c_str ()) > 0); - if (hdf5_file.file_id >= 0) + hdf5_ofstream hdf5_file (fname.c_str (), mode); + + if (hdf5_file.file_id != -1) { save_vars (argv, i, argc, hdf5_file, format, - save_as_floats, true); + save_as_floats, write_header_info); hdf5_file.close (); } @@ -1726,6 +1728,8 @@ if (file) { + bool write_header_info = ! file.tellp (); + save_vars (argv, i, argc, file, format, save_as_floats, write_header_info); @@ -1744,6 +1748,8 @@ if (file) { + bool write_header_info = ! file.tellp (); + save_vars (argv, i, argc, file, format, save_as_floats, write_header_info); diff -r dd8cef76043d -r 301885c9d265 src/ls-hdf5.h --- a/src/ls-hdf5.h Tue Jun 26 15:54:41 2007 +0000 +++ b/src/ls-hdf5.h Wed Jun 27 02:27:51 2007 +0000 @@ -44,13 +44,20 @@ hdf5_fstreambase () { file_id = -1; } + ~hdf5_fstreambase () { close (); } + hdf5_fstreambase (const char *name, int mode, int /* prot */ = 0) { if (mode & std::ios::in) file_id = H5Fopen (name, H5F_ACC_RDONLY, H5P_DEFAULT); else if (mode & std::ios::out) - file_id = H5Fcreate (name, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - + { + if (mode & std::ios::app && H5Fis_hdf5 (name) > 0) + file_id = H5Fopen (name, H5F_ACC_RDWR, H5P_DEFAULT); + else + file_id = H5Fcreate (name, H5F_ACC_TRUNC, H5P_DEFAULT, + H5P_DEFAULT); + } if (file_id < 0) std::ios::setstate (std::ios::badbit); @@ -74,8 +81,13 @@ if (mode & std::ios::in) file_id = H5Fopen (name, H5F_ACC_RDONLY, H5P_DEFAULT); else if (mode & std::ios::out) - file_id = H5Fcreate (name, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); - + { + if (mode & std::ios::app && H5Fis_hdf5 (name) > 0) + file_id = H5Fopen (name, H5F_ACC_RDWR, H5P_DEFAULT); + else + file_id = H5Fcreate (name, H5F_ACC_TRUNC, H5P_DEFAULT, + H5P_DEFAULT); + } if (file_id < 0) std::ios::setstate (std::ios::badbit);