Sponsored Content
Top Forums Programming passing object to function, columns class Post 302513260 by LMHmedchem on Tuesday 12th of April 2011 05:04:04 PM
Old 04-12-2011
Quote:
Originally Posted by Corona688
Keeping them as vectors but not using 2/3 of the vector positions is very wasteful. Why have all those different types anyway, instead of one class that contains a string and has operators to return float, int, char? It'd let you keep everything in one vector.
I have changed this into 2 classes. In some files I have, the first several rows are like extended header rows that give information about the data type and exactly what is stored in the column. I am now creating a metadata object for each col to hold the info from these first rows, and then a second object to hold the actual data. I put the different vector types into the class because the columns could contain any of those data types. For each column, only one vector will have data added to it. I presumed that the declaration of the vectors doesn't cost any significant resource since they have no size at that point.

Quote:
Originally Posted by Corona688
Why do you store each and every row in a vector when you don't need them later? Why not process the row then discard it?
This is probably temporary, in that I tend to start with a method that I know will work. In some cases, I need to look at allot of the data before I decide what to do with it, so I may not be able to process it one row at a time.

Quote:
Originally Posted by Corona688
I don't understand this at all, but I think I sort of get your pseudocode -- you want to load data from a string.
I need to load tabular data from a text file. Reading the data into a string for each row, and then parsing the row by the delimiter is the only way I know how to do that at the moment.

Here is an updated version of the code.
Header file,
Code:
// class columns in columns .h

class col_metadata {
public:
   // initialize class members
   col_metadata()
      : scaleMin(0.0),
        scaleMax(0.0),
        content(""),
        type(""),
        scale_type("") { }

   float scaleMin, scaleMax;
   std::string content, type, scale_type, header;
};

class column_data {
public:
   // initialize class members
   column_data()
      : header("") { }

   std::string header;
   std::vector<std::string> inputDataString;
   std::vector<char> inputDataChar;
   std::vector<int> inputDataInt;
   std::vector<float> inputDataFloat;
};

std::vector<col_metadata> metadata;  // create vector of col_metadata objects
std::vector<column_data> columns;  // create vector of column_data objects

Main function,
Code:
#include <string>
#include <vector>
#include <iostream>
#include <fstream>
#include <sstream>

#include "columns.h"

using namespace std;

// creates a data object and meta data object for each column
int createColObjs( stringstream &colsRowStream ){
   std::string rowCell;
   // parse header row into cells, tab delimiter
   while(getline(colsRowStream,rowCell,'\t')) {
      // create new column data object
      col_metadata newColMeta;  metadata.push_back(newColMeta);
      // create new column data object
      column_data newCol;  columns.push_back(newCol);
   }
   // clear the buffer
   colsRowStream.clear();
}


int main(int argc, char **argv) {

// declarations for args
   // file names
   int cmdArguments;
   std::string colsInFile, splitsInFile, outputFile;

//---------------------------------------------------------------------
//  Parse command line arguments
while ((cmdArguments = getopt (argc, argv, "c:i:o:d:h")) != -1)
   switch (cmdArguments)
   {
      case 'c':
         colsInFile = optarg;
      break;
      case 'i':
         splitsInFile = optarg;
      break;
      case 'o':
         outputFile = optarg;
      break;
      case 'd':
         //set delimiter;
      break;
      case 'h':
         std::cout << std::endl; // print help blurb
         exit(0);
      break;
   }

//---------------------------------------------------------------------
// check args

   if(splitsInFile.length() == 0) {
      std::cout << "  -> no input file was specified" << std::endl;
      return(-1);
   }
//---------------------------------------------------------------------
// declarations
   int i; // loop iterator
   std::string newSplitsLine, rowCell;
   std::vector<std::string> storeSplitsRows;    // storage structure for input rows
   stringstream colsRowStream;

//---------------------------------------------------------------------

   // create an input stream and open the parameter file
   ifstream splitsInput;
   splitsInput.open( splitsInFile.c_str() );

   // read innput file and store,
   while(getline(splitsInput,newSplitsLine)) {
      // remove '\r' EOL chars
      newSplitsLine.erase (remove(newSplitsLine.begin(),newSplitsLine.end(),'\r') , newSplitsLine.end());
      // store row data in vector of string
      storeSplitsRows.push_back(newSplitsLine);
   }

   //use first row to create objects for each col
   colsRowStream << storeSplitsRows[0];
   createColObjs ( colsRowStream );


   // load information from metadata row 0 to metadata[i].content
   colsRowStream << storeSplitsRows[0];
   i = 0;
   // parse header row into cells, tab delimiter
   while(getline(colsRowStream,rowCell,'\t')) {
      metadata[i].content = rowCell;
      i++;
   }
   // clear the buffer
   colsRowStream.clear();

   // load information from metadata row 1 to metadata[i].type
   colsRowStream << storeSplitsRows[1];
   i = 0;
   // parse header row into cells, tab delimiter
   while(getline(colsRowStream,rowCell,'\t')) {
      // add header row content to content field
      metadata[i].type = rowCell;
      i++;
   }
   // clear the buffer
   colsRowStream.clear();

   // load information from metadata row 1 to metadata[i].scale_type
   colsRowStream << storeSplitsRows[2];
   i = 0;
   // parse header row into cells, tab delimiter
   while(getline(colsRowStream,rowCell,'\t')) {
      // add header row content to content field
      metadata[i].scale_type = rowCell;
      i++;
   }
   // clear the buffer
   colsRowStream.clear();

   std::cout << std::endl;
   for (i=0; i<metadata.size(); i++) {
      std::cout << "metadata[" << i << "].content     " << metadata[i].content << std::endl;
      std::cout << "metadata[" << i << "].type        " << metadata[i].type << std::endl;
      std::cout << "metadata[" << i << "].scale_type  " << metadata [i].scale_type << std::endl;
      std::cout << std::endl;
   }

} // main EOF brace

This compiles and runs, giving the expected output. I have attached the src. This part just loads the data from the first few rows into the respective col objects. Later code would load the actual data, rows 7-11 in the attached data file, into a vector of the appropriate type. There is an issue that I am loading from the input file and storing as a string, and then parsing the string, possibly to int or real. I know you can convert from string to real, etc, but that seams like a silly solution. The issue is that the rows of data contain all kinds of types, so I'm not sure what else to do.

The above code is written out in blocks, where it is obvious that there should be a function to load data,
Code:
// accepts a string stream and parses the data in to columns
int metadata_row_toCol( stringstream &colsRowStream ){
   int i = 0;
   std::string rowCell;
   // parse header row into cells, tab delimiter
   while(getline(colsRowStream,rowCell,'\t')) {
      metadata[i].content = rowCell;
      i++;
   }
   // clear the buffer
   colsRowStream.clear();
}

colsRowStream << storeSplitsRows[0];
metadata_row_toCol( colsRowStream ); // loads the first row to metadata[i].content

This function works but I need to be able to pass the object.var that is being populated in the second function, since it can't be hardcoded to metadata[i].content like above.

I hope that makes it a bit more clear as to what I'm trying to do, although I'm sure it makes it no more certain I'm going about it the right way.

LMHmedchem

Last edited by LMHmedchem; 04-12-2011 at 06:58 PM..
 

10 More Discussions You Might Find Interesting

1. Programming

Listing function exports from object file

Is it possible to view all the functions exported by a given object file? "dump -tv" comes the closest, but what exactly am I looking for to determine whether the symbol exists in the object file? Essentially, I have a library that requires a call to "xdr_sizeof" and the compile is failing... (5 Replies)
Discussion started by: DreamWarrior
5 Replies

2. Programming

How to make a function friend to both base and derived class

Hi, I have a base class and derived a class from the base class, i want to print & read the data for the object created for the derived class,so i have overloaded both the << and >> operators and also have done the foward declaration. Below is the code snippet, #include <iostream> class... (3 Replies)
Discussion started by: ennstate
3 Replies

3. Shell Programming and Scripting

Passing global variable to a function which is called by another function

Hi , I have three funcions f1, f2 and f3 . f1 calls f2 and f2 calls f3 . I have a global variable "period" which i want to pass to f3 . Can i pass the variable directly in the definition of f3 ? Pls help . sars (4 Replies)
Discussion started by: sars
4 Replies

4. Programming

Handling a signal with a class member function

Hello, i am using the sigaction function to handle the SIGCHLD signal.Is it possible to use a class member function as the handler function (the sa_handler member of the sigaction structure)? The function's signature is: void (*sa_handler)(int);so i don't think i can use a static member function... (2 Replies)
Discussion started by: Zipi
2 Replies

5. Shell Programming and Scripting

How to Call external function in .C or .So (Shared Object)

Hi, Anybody know any way to Call with Shell Script an external function wrote in .C or .So (Shared Object) on AIX enviroment and returning parameters of .C or .SO to Shell Script? Tks!! (6 Replies)
Discussion started by: rdgsantos
6 Replies

6. Programming

question about function object

I have a code as following: #include <iostream> #include <algorithm> #include <list> using namespace std; //the class Nth is a predicates class Nth{ private: int nth; int count; public: Nth(int n):nth(n),count(0){} bool operator()(int){ ... (2 Replies)
Discussion started by: homeboy
2 Replies

7. UNIX and Linux Applications

opends- help with custom object class

we have 2.2.0 of opends running on RedHat 2.6.21 and we're trying to setup a structure that will suit our needs. One of the things we'd like to do is create our own custom object classes based off some of the existing ones you get out of the box. The opends documentation covers this here (sorry, it... (1 Reply)
Discussion started by: snafu
1 Replies

8. Programming

Created a wrapper for a function in a class.

I have a class called Parsing with the following function. I want to create a wrapper for it, so that I call it using GetReal rather than GetFloat. Bit confused on how to do this. class Parsing { private: int Length; // int Ptr; ... (3 Replies)
Discussion started by: kristinu
3 Replies

9. Programming

How to initialize an object with another object of different class?

How to initialize an object of class say "A", with an object of type say "B". The following code give the error message "error: conversion from âAâ to non-scalar type âBâ requested" #include <iostream> using namespace std; class B; class A{ public: A() { cout <<"\nA()" << endl; } ... (1 Reply)
Discussion started by: techmonk
1 Replies

10. Programming

C++ : Base class member function not accessible from derived class

Hello All, I am a learner in C++. I was testing my inheritance knowledge with following piece of code. #include <iostream> using namespace std; class base { public : void display() { cout << "In base display()" << endl; } void display(int k) {... (2 Replies)
Discussion started by: anand.shah
2 Replies
All times are GMT -4. The time now is 08:15 PM.
Unix & Linux Forums Content Copyright 1993-2022. All Rights Reserved.
Privacy Policy