From 32b46c106df4421490b88001036d756c5af34056 Mon Sep 17 00:00:00 2001 From: Emilio <Emilio.Meschi@cern.ch> Date: Mon, 24 Oct 2022 01:54:35 +0200 Subject: [PATCH] make file opening and filename calculation more robust in separate class --- src/OutputFileHandler.cc | 30 ++++++++++++------------------ src/OutputFileHandler.h | 37 +++++++++---------------------------- 2 files changed, 21 insertions(+), 46 deletions(-) diff --git a/src/OutputFileHandler.cc b/src/OutputFileHandler.cc index 7d28f28e..081360ea 100644 --- a/src/OutputFileHandler.cc +++ b/src/OutputFileHandler.cc @@ -1,5 +1,6 @@ #include "OutputFileHandler.h" #include "log.h" +#include <iomanip> void OutputFileHandler::create_output_directory_maybe( std::string &output_directory) { @@ -28,33 +29,26 @@ void OutputFileHandler::create_output_directory_maybe( void OutputFileHandler::open_file(uint32_t index, uint32_t run) { // Create a new file create_output_directory_maybe(working_files_basepath_); - std::string current_filename_a = - output_directory + "/" + - format_run_file_stem(my_output_filename_prefix, current_run_number, - index_); - std::string filename = output_directory + "/" + - format_run_file_stem(my_output_filename_prefix, - control.run_number, index_); - LOG(INFO) << "opening file with index " << index_; - outFile.setFile(fopen(filename.c_str(), "w")); - outFile.setIndex(index_); - if (outFile.getFile() == NULL) { + std::string filename = working_files_base_path_ + "/" + + format_filename(control.run_number, index); + LOG(TRACE) << "opening file with index " << index; + current_file_ = fopen( filename.c_str(), "wbx" )); + if (current_file_ == NULL) { std::string err = tools::strerror("ERROR when creating file '" + current_filename_a + "'"); LOG(ERROR) << err; throw std::runtime_error(err); } + current_index_ = index; } /* * Create a properly formatted file name - * TODO: Change to C++ */ -std::string OutputFileHandler::format_filename(std::string &path, - uint32_t run_number, +std::string OutputFileHandler::format_filename(uint32_t run_number, uint32_t index) { - char run_order_stem[PATH_MAX]; - snprintf(run_order_stem, sizeof(run_order_stem), "%s_%06d_%06d.dat", - filename_prefix.c_str(), run_number, file_count); - return std::string(run_order_stem); + std::ostringstream ofilename; + ofilename << filename_prefix_ << "_" << std::setfill(0) << std::setw(6) + << run_number << "_" << index << ".dat"; + return ofilename.str(); } diff --git a/src/OutputFileHandler.h b/src/OutputFileHandler.h index 922f8d43..8d8ff9da 100644 --- a/src/OutputFileHandler.h +++ b/src/OutputFileHandler.h @@ -8,38 +8,19 @@ class OutputFileHandler { public: - OutputFileHandler(const std::string filename_base_path, + OutputFileHandler(const std::string base_path, const std::string filename_prefix) - : filename_base_path_(filename_base_path), - filename_prefix_(filename_prefix), - working_files_basepath_(filename_base_path_ + "/" + working_dir_) { - create_output_directory_maybe(working_files_basepath_); + : base_path_(base_path), filename_prefix_(filename_prefix), + working_files_base_path_(filename_base_path_ + "/" + working_dir_), + current_run_number_(0), current_file_(0), current_index_(-1) { + create_output_directory_maybe(working_files_base_path_); } virtual ~OutputFileHandler() {} void open_file(uint32_t index, uint32_t run); // Used for fixedNorbits per file option - { - // Create a new file - std::string output_directory = my_output_filename_base + "/" + working_dir; - create_output_directory(output_directory); - std::string current_filename_a = - output_directory + "/" + - format_run_file_stem(my_output_filename_prefix, current_run_number, - index_); - std::string filename = output_directory + "/" + - format_run_file_stem(my_output_filename_prefix, - control.run_number, index_); - LOG(INFO) << "opening file with index " << index_; - outFile.setFile(fopen(filename.c_str(), "w")); - outFile.setIndex(index_); - if (outFile.getFile() == NULL) { - std::string err = tools::strerror("ERROR when creating file '" + - current_filename_a + "'"); - LOG(ERROR) << err; - throw std::runtime_error(err); - } - } + + std::string format_filename(uint32_t run_number, uint32_t index); private: void create_output_directory_maybe(std::string &output_directory); @@ -51,9 +32,9 @@ private: // filename static constexpr std::string journal_file_{"index.journal"}; - std::string filename_base_path_; + std::string base_path_; std::string filename_prefix_; - std::string working_files_basepath_; + std::string working_files_base_path_; uint32_t current_run_number_; FILE *current_file_; int32_t current_index_; -- GitLab