c ++读取.csv文件,将数据放入变量然后放入对象

时间:2018-03-06 02:31:47

标签: c++ class csv object

嗨到了我不确定如何继续的地步。 我的计划的主要目标:

1)从文件(.csv)中读取5个值

  • 日期(3个变量的类 - 日,月,年)

  • 时间(有2个变量的课程 - 分钟,小时)

  • 浮动wSpeed(在课堂天气下)

  • 浮动温度(在天气下)

  • 浮动solarRadiation(在天气下)

2)放入一个对象

3)将其放入载体

主要

   int main()
{
 string filename;
 ifstream input;

Vector<weather> windlog; //have a vector called windlog

cout <<"enter file name:" <<endl;
cin >> filename;

input.open(filename.c_str());
input.ignore(500,'\n');

string sDay, sMonth, sYear, sHH, sMM, wind, solar, temperature;
date d1;
time t1;
weather w1;

getline(input, sDay,'/'); //stop getting input at '/'
getline(input, sMonth,'/');
getline(input, sYear,' ');
getline(input, sHH,':');
getline(input, sMM,',');

int day1 = atoi(sDay.c_str()); //convert string to int (atoi)
int month1 = atoi(sMonth.c_str());
int year1 = atoi(sYear.c_str());
int hour1 = atoi(sHH.c_str());
int min1 = atoi(sMM.c_str());

d1.setDate(day1,month1,year1); //set date using converted string
t1.setTime(min1, hour1); //set time using converted string

         // skip the first 9 columns of .csv file
    for(int i=0; i<9; i++) 
     {
        input.ignore(50, ','); //ignore ','
     }

        //location now at wSpeed date of .csv file
    getline(input, wind,',');
    float wS1 = atof(wind.c_str()); // convert string to float

       //next location is the location solarRadiation
    getline(input, solar,',');
    float sR1= atof(solar.c_str()); // convert string to float

      //move 5 columns
     for(int i=0; i< 5; i++)
     {
      input.ignore(50, ',');
     }

      //at location of temperature
     getline(input, temperature,'\n');
    float temperature1 = atof(temperature.c_str()); // convert string to 
                                                       float

    //when i print it out, it gives me the correct data
    /*
cout << d1; //date class that contains dd,mm,yy
cout << t1;//time class that contains hh, mm
cout << wS1 ;
cout << sR1;
cout << temperature1 << endl;
    */

 //trying to put these data into an object file: weather

 //i tried doing something like this
weather obj1(wS1, sR1, temperature1, d1, t1);
cout << objt1;//gives me weird values but when i cout each variable, it 
 works out fine

不会写整个日期/时间.h / cpp因为我认为它会占用太多空间

date.h

  public:
  setday, setmonth, setyear, setdate(day,month,year);
  getday,getmonth,getyear;
  private: day,month,year;

time.h中

  public:
  setminute, sethour, settime(minute,hour);
  getminute,get hour;
  private: minute, hour;

天气等级(我遇到问题)

·H

  #ifndef H_WEATHER  
  #define  H_WEATHER
  #include <iostream>
  #include <string>
  #include "time.h"
  #include "date.h"
  using namespace std;

  class weather: public date, time
     {
     friend ostream& operator << (ostream&, const weather&);
     friend istream& operator >> (istream&, weather&);
        public:
          weather();
          weather(float wSpeed, float solarRadiation, float temperature, 
          date d1, time t1);

          ~weather();

           void setWspeed(float wSpeed);
           void setSolarRadiation(float solarRadiation);
           void setTemperature(float temperature);

           float getWspeed() const ;
           float getSolarRadiation() const;
           float getTemperature() const;
           void setWeather(float wS, float sR, float t,date d1, time t1);
           date getDate();
           time getTime();
           date d1;//mm, hh
           time t1;//dd,mm,yy
        private:
           float wSpeed;
           float solarRadiation;
           float temperature;
           };
      #endif

.CPP

   #include <iostream>
   #include "weather.h"
   #include "date.h"
   #include "time.h"

    weather::weather()
    {
     wSpeed=0;
     solarRadiation=0;
     temperature = 0;
     }

     weather::weather(float wS, float sR, float t, date d1, time 
     t1):date(day,month,year), time(hours,minute)
      {

         wS = wS;
         sR = sR;
         t =t;
         d1.setDate(day,month, year);
         t1.setTime(hours,minute);
       }
       weather::~weather() {}

       void weather::setWeather(float wS, float sR, float t)
      {
        wSpeed =wS;
        solarRadiation=sR;
        temperature =t;
       }
      void weather::setWspeed(float wS)
       {
        wSpeed =wS;
       }
      void weather::setSolarRadiation(float sR)
      {
       solarRadiation=sR;
      }

      void weather::setTemperature(float t)
      {
       temperature = t;
       }
       void weather::setWeather(float wS,float sR, float t, date d1, time 
       t1)
       {
         wSpeed=wS;
         solarRadiation=sR;
         temperature = t;
       }
       float weather::getWspeed() const
       {
       return wSpeed;
       }
       float weather::getSolarRadiation() const
       {
        return solarRadiation;
       }
       float weather::getTemperature() const
        {
        return temperature;
        }



         ostream& operator<< (ostream& osObject, const weather& weather1)
       {

        osObject << weather1.wSpeed <<"  " << weather1.solarRadiation <<""
        << weather1.temperature <<  weather1.d1 << weather1.t1 ;
        return osObject;
       }
       istream& operator >> (istream& isObject, weather& weather1)
       {
       isObject >> weather1.wSpeed>> weather1.solarRadiation >> 
       weather1.temperature >>  weather1.d1 >> weather1.t1;
       return isObject;
        }

如何将值放入对象?它是否正确我必须使用继承所以我可以重载天气构造函数,以便它可以采取日期和时间类?

1 个答案:

答案 0 :(得分:0)

你几乎拥有它,但是......

您不必继承以便能够使用成员对象。在

class weather: public date, time

: public date, time没有必要。这也意味着天气是一个没有意义的日期和时间。除非有一些逻辑is-a relationship

,否则请避免继承
weather::weather(float wS, float sR, float t, date d1, time  t1):
    date(day,month,year), // you want the member name now, not the type 
                          // plus where did day month and year come from?
    time(hours,minute) // not ditto, but close enough.
{
     wS = wS; // self assigns. In other word, does nothing
     sR = sR; // ditto
     t =t; // ditto
     d1.setDate(day,month, year); // where did day month and year come from?
     t1.setTime(hours,minute); // not ditto, but close enough.
}

没有做任何事情。它主要具有分配给自己的参数。这没有意义,因为它们是相同的变量,它们是临时变量。您要做的是分配成员变量。这是一个构造函数,所以你不妨一直使用Member Initializer List

weather::weather(float wS,
                 float sR,
                 float t,
                 date d1,
                 time t1) :
        wSpeed(wS), 
        solarRadiation(sR), 
        temperature(t), 
        d1(d1), // note this is about the only time you can use the same name twice. 
                // Enjoy it. But don't do it. It confuses people.
        t1(t1)  // ditto
{
}

然后我们下到setWeather

void weather::setWeather(float wS, float sR, float t)
{
    wSpeed =wS;
    solarRadiation=sR;
    temperature =t;
}

与班级

中的定义不符
void setWeather(float wS, float sR, float t,date d1, time t1);

显然我们想要更像

的东西
void weather::setWeather(float wS, float sR, float t, date pd1, time pt1)
{
    wSpeed = wS;
    solarRadiation = sR;
    temperature = t;
    d1 = pd1;
    t1 = pt1;
}

注意我没有在参数列表中重复d1。我改了它,所以我不会d1 = d1;没有任何用处。最好为成员和参数提供更具描述性的名称。 d1传达关于变量是否以及如何使用变量的零信息。