I have a c++ code for CSV reading. It is supposed to read the rows in accordance with the input. But it is reading only the first element of the input element row and is going to the next row giving me a diagonal output
#ifndef CSVREADER_H
#define CSVREADER_H
#include <string>
#include <map>
#include <fstream>
#include <sstream>
#include <iostream>
#include <chrono>
#include <time.h>
class CsvReader
{
public:
CsvReader(std::string fileName)
: m_nextLine(""), m_nextUpdate(0), m_infile(fileName.c_str())
{
m_start = std::chrono::steady_clock::now();
if(m_infile.is_open())
{
/* read type and name from file */
std::string type, name;
std::getline(m_infile, type); // type
std::getline(m_infile, name); // name
std::stringstream ssname(name);//##assigning to object?
std::stringstream sstype(type);
m_type.clear();
while (!ssname.eof())
{
std::string n,t;
std::getline(ssname, n, ',');
if(!sstype.eof())
{
std::getline(sstype, t, ',');
}
m_type.insert(std::pair<std::string, std::string>(n,t));
}
std::getline(m_infile, m_nextLine); // first
m_nextUpdate = (m_nextLine.length() > 0) ? atoi(m_nextLine.c_str()) : INT_MAX;
}
}
int getInt(const char * varName);
char getChar(const char * varName);
float getFloat(const char * varName);
private:
void update(void);
std::ifstream m_infile;
std::string m_nextLine;
std::chrono::steady_clock::time_point m_start;
int m_nextUpdate;
std::map<std::string, std::string> m_line;
std::map<std::string, std::string> m_type;
};
#endif
//main
#include "csvreader.h"
#include <Windows.h>
using namespace std;
void printData(CsvReader *csvReader)
//printData(CsvReader *csvReader)
{
cout << csvReader->getInt("var1") << '\t'
<< csvReader->getInt("var2") << '\t'
<< csvReader->getFloat("var3") << '\t'
<< csvReader->getFloat("var4") << '\t'
<< csvReader->getChar("var5") << '\t'
<< csvReader->getInt("var6") << endl;
}
int main()
{
CsvReader *csvReader = new CsvReader("input.csv");
Sleep(10); cout << 10 << '\t'; printData(csvReader);
Sleep(210); cout << 210 << '\t'; printData(csvReader);
Sleep(20); cout << 20 << '\t'; printData(csvReader);
Sleep(10); cout << 10 << '\t'; printData(csvReader);
Sleep(510); cout << 210 << '\t'; printData(csvReader);
Sleep(20); cout << 20 << '\t'; printData(csvReader);
//int i = csvReader->getInt("var1");
//cout<<i;}*/
return 0;
}
//cpp defined
#include "csvreader.h"
void CsvReader::update(void)
{
std::chrono::steady_clock::time_point now = std::chrono::steady_clock::now();
long long elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(now - m_start).count();
/* Read new values if the time is elapsed*/
if(elapsed >= m_nextUpdate)
{
if(m_nextLine.length() > 0)
{
/* parse this line elements */
m_line.clear();
std::stringstream ssline(m_nextLine);
std::map<std::string, std::string>::iterator itr;
for (itr = m_type.begin(); itr != m_type.end(); ++itr)
{
if(!ssline.eof())
{
std::string element;
std::getline(ssline, element, ',');
m_line.insert(std::pair<std::string, std::string>(itr->first, element));
}
else
{
std::cout << "Error: invalid number of elements" << '\n';
}
}
/* set next timer value */
std::getline(m_infile, m_nextLine);
m_nextUpdate = (m_nextLine.length() > 0) ? atoi(m_nextLine.c_str()) : INT_MAX;
}
}
}
int CsvReader::getInt(const char * varName)
{
update();
return atoi(m_line[std::string(varName)].c_str());
}
char CsvReader::getChar(const char * varName)
{
update();
return m_line[std::string(varName)].c_str()[0];
}
float CsvReader::getFloat(const char * varName)
{
update();
return atof(m_line[std::string(varName)].c_str());
}
The nextUpdate is the line supposed to do the operation of reading the next element but after reading a complete row first