From ebe4174b5cbab12abd05e68ae463d73ac090f29a Mon Sep 17 00:00:00 2001 From: Christopher LaChance Date: Thu, 12 Oct 2017 10:00:54 -0500 Subject: [PATCH] Converted data file traversal from strtold to strtok. --- .../sim_services/MonteCarlo/MonteVarFile.cpp | 98 +++++++++++-------- .../sim_services/MonteCarlo/MonteVarFixed.cpp | 7 +- 2 files changed, 61 insertions(+), 44 deletions(-) diff --git a/trick_source/sim_services/MonteCarlo/MonteVarFile.cpp b/trick_source/sim_services/MonteCarlo/MonteVarFile.cpp index ceeedf53..c1a2b5ac 100644 --- a/trick_source/sim_services/MonteCarlo/MonteVarFile.cpp +++ b/trick_source/sim_services/MonteCarlo/MonteVarFile.cpp @@ -8,8 +8,7 @@ #include "trick/message_proto.h" #include "trick/exec_proto.h" -Trick::MonteVarFile::MonteVarFile(std::string in_name, std::string in_file_name, unsigned int in_column, std::string in_unit) : - input_file_stream(NULL) +Trick::MonteVarFile::MonteVarFile(std::string in_name, std::string in_file_name, unsigned int in_column, std::string in_unit) : input_file_stream(NULL) { this->name = in_name; this->column = in_column; @@ -19,7 +18,8 @@ Trick::MonteVarFile::MonteVarFile(std::string in_name, std::string in_file_name, buffer = new char[4096]; } -Trick::MonteVarFile::~MonteVarFile() { +Trick::MonteVarFile::~MonteVarFile() +{ delete input_file_stream; delete buffer; } @@ -30,7 +30,7 @@ std::string Trick::MonteVarFile::describe_variable() std::stringstream ss; ss << "#NAME:\t\t" << this->name << "\n" - << "#TYPE:\t\tFILE\n" + << "#TYPE:\t\tFILE\n" << "#UNIT:\t\t" << this->unit << "\n" << "#FILE:\t\t" << this->file_name << "\n" << "#COLUMN:\t" << this->column << "\n"; @@ -38,56 +38,70 @@ std::string Trick::MonteVarFile::describe_variable() return ss.str(); } -std::string Trick::MonteVarFile::get_next_value() { - if (input_file_stream->good()) { - double file_value; - char *current_position = buffer; - do { +std::string Trick::MonteVarFile::get_next_value() +{ + if (input_file_stream->good()) + { + // Skip the comments and empty lines in the data file. + do + { input_file_stream->getline(buffer, 4096); - file_value = strtold(buffer, ¤t_position); - if (input_file_stream->eof()) { + + if(input_file_stream->eof()) + { input_file_stream->close(); return "EOF"; } - } while (file_value == 0 && current_position == buffer && input_file_stream->good()); + } + while(buffer[0] == '#' || buffer[0] == '\0'); - // Count the number of columns in the input file - char* token; + // Count the number of columns in the input file. + char *token; unsigned int ntokens = 0; char temp_str[4096]; - strcpy(temp_str, buffer) ; - token = strtok( temp_str, " \t" ); - while ( token != NULL ) { - token = strtok( NULL, " \t" ); + strcpy(temp_str, buffer); + token = strtok(temp_str, " \t"); + while (token != NULL) + { + token = strtok(NULL, " \t"); ntokens++; } - // Verify the input column number is valid - if ( (column == 0) || (column > ntokens) ) { + // Verify the input column number is valid. + if ((column == 0) || (column > ntokens)) + { char string[100]; sprintf(string, "Trick:MonteVarFile An invalid column number %d, valid column numbers are 1 - %d", column, ntokens); exec_terminate_with_return(-1, __FILE__, __LINE__, string); } - if (current_position != buffer) { - for (unsigned int i = 1; i < column; ++i) { - file_value = strtold(current_position, ¤t_position); - } + // Get the next value. + strcpy(temp_str, buffer); + token = strtok(temp_str, " \t"); - std::stringstream string_stream; - string_stream.precision(std::numeric_limits::digits10); - string_stream << file_value ; - value = string_stream.str(); - string_stream.str(""); - if (unit.empty()) { - string_stream << name << " = " << file_value ; + for(unsigned int i = 1; i < column; i++) + { + // Iterate through each token in the temp_str. + if(token != NULL) + { + token = strtok(NULL, " \t"); } - else { - string_stream << name << " = " << "trick.attach_units(\"" << unit << "\", " << file_value - << ")"; - } - return string_stream.str() ; } + + // Return the value as a string. + this->value = token; + std::stringstream ss; + + if(unit.empty()) + { + ss << this->name << " = " << token; + } + else + { + ss << this->name << " = " << "trick.attach_units(\"" << unit << "\", " << token << ")"; + } + + return ss.str(); } char string[100]; sprintf(string, "Trick:MonteVarFile the input file \"%s\" is not open for reading", file_name.c_str()); @@ -96,22 +110,24 @@ std::string Trick::MonteVarFile::get_next_value() { return NULL; } -void Trick::MonteVarFile::set_file_name(std::string in_file_name) { +void Trick::MonteVarFile::set_file_name(std::string in_file_name) +{ delete input_file_stream; input_file_stream = new std::ifstream(in_file_name.c_str(), std::ifstream::in); - if (input_file_stream->fail()) { + if (input_file_stream->fail()) + { std::stringstream string_stream; string_stream << "Error: " << strerror(errno) << std::endl - << " Trick:MonteVarFile input file \"" << in_file_name << "\" failed to open"; + << " Trick:MonteVarFile input file \"" << in_file_name << "\" failed to open"; exec_terminate_with_return(-1, __FILE__, __LINE__, string_stream.str().c_str()); } this->file_name = in_file_name; } -void Trick::MonteVarFile::set_column(unsigned int in_column) { +void Trick::MonteVarFile::set_column(unsigned int in_column) +{ this->column = in_column; } - diff --git a/trick_source/sim_services/MonteCarlo/MonteVarFixed.cpp b/trick_source/sim_services/MonteCarlo/MonteVarFixed.cpp index 4fc77161..7b927c0d 100644 --- a/trick_source/sim_services/MonteCarlo/MonteVarFixed.cpp +++ b/trick_source/sim_services/MonteCarlo/MonteVarFixed.cpp @@ -14,9 +14,10 @@ std::string Trick::MonteVarFixed::describe_variable() { std::stringstream ss; - ss << "#NAME:\t" << this->name << "\n" - << "#TYPE:\tFIXED\n" - << "#UNIT:\t" << this->unit << "\n"; + ss << "#NAME:\t\t" << this->name << "\n" + << "#TYPE:\t\tFIXED\n" + << "#UNIT:\t\t" << this->unit << "\n" + << "#VALUE:\t\t" << this->value << "\n"; return ss.str(); }