C ++ с использованием getline и stringstream с несколькими классами и оператором перегруженного потока - PullRequest
0 голосов
/ 26 апреля 2018

Я работаю над университетским заданием по чтению данных из файла и могу действительно использовать некоторую помощь!

Файл данных содержит данные о погоде и выглядит следующим образом:

31/03/2016 9: 00,14,6,175,17,0,1013,4,1016,9,1017,0,68,2,6,512,22,7,24.1,25,5

Для присвоения требуется, чтобы класс считывал и сохранял дату, время и все значения типа int / double. Я должен использовать класс даты, чтобы прочитать дату, класс времени, чтобы прочитать время, и класс WeatherData объединяет все это, используя перегруженный оператор потока.

Я занимаюсь модульным тестированием класса WeatherData (который будет использоваться в массиве классов WeatherData) с файлом данных, который включает дату, время и только одну двойную переменную: 31.03.2016 9: 00,14.6

Вывод, который я получаю: 31.03.2016 0: 0

Я протестировал классы Date и Time, и они работают как положено. Я не могу понять, почему это не удается после даты. Любая помощь будет принята с благодарностью!

TestWeatherData.cpp

#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
#include <cstdlib>
#include "../Practice/date.h"
#include "../Practice/time.h"
#include "../Practice/weatherdata.h"

using namespace std;

istream & operator >>( istream & input, Date & D )
{
  string temp;
  string convertToInt;
  int tempDay;
  int tempMonth;
  int tempYear;

  getline(input, temp);
  stringstream ss(temp);
  getline(ss, convertToInt, '/');
  tempDay = atoi(convertToInt.c_str());
  D.SetDay(tempDay);
  getline(ss, convertToInt, '/');
  tempMonth = atoi(convertToInt.c_str());
  D.SetMonth(tempMonth);
  getline(ss, convertToInt);
  tempYear = atoi(convertToInt.c_str());
  D.SetYear(tempYear);

  return input;
}

ostream & operator <<( ostream & os, const Date & D )
{

  os << D.GetDay() << "/" << D.GetMonth()
     << "/" << D.GetYear();

  return os;
}

istream & operator >>( istream & input, Time & T )
{
  string temp;
  string convertToInt;
  int tempHours;
  int tempMinutes;

  getline(input, temp);
  stringstream ss(temp);
  getline(ss, convertToInt, ':');
  tempHours = atoi(convertToInt.c_str());
  T.SetHours(tempHours);
  getline(ss, convertToInt);
  tempMinutes = atoi(convertToInt.c_str());
  T.SetMinutes(tempMinutes);

  return input;
}

ostream & operator <<( ostream & os, const Time & T )
{

  os << T.GetHours() << ":" << T.GetMinutes();

  return os;
}

istream & operator >>( istream & input, WeatherData & W )
{
  string temp;
  string convertToDouble;
  Date tempDate;
  Time tempTime;
  double tempDP;

  input >> tempDate >> tempTime;
  W.setDate(tempDate);
  W.setTime(tempTime);
  getline(input, temp);
  stringstream ss(temp);
  getline(ss, convertToDouble);
  tempDP = atof(convertToDouble.c_str());
  W.setDP(tempDP);

  return input;
}

ostream & operator <<( ostream & os, const WeatherData & W )
{

  os << W.getDate() << ' ' << W.getTime() << ' ' << W.getDP();

  return os;
}

int main()
{
    ifstream infile( "data.txt" );
    if( !infile ) return -1;

    WeatherData W;

    infile >> W;

    cout << W;

    return 0;
}

1 Ответ

0 голосов
/ 27 апреля 2018

Спасибо, Джерри Иеремия и Г.М! Теперь я вижу, что я читал всю строку в классе Date, поэтому в первой строке getline я добавил разделитель пробела. В классе Time на первой getline я добавил разделитель запятой. Теперь все работает как положено!

  getline(input, temp, ' '); // added delimiter here
  stringstream ss(temp);
  getline(ss, convertToInt, '/');
  tempDay = atoi(convertToInt.c_str());
  D.SetDay(tempDay);
  getline(ss, convertToInt, '/');
  tempMonth = atoi(convertToInt.c_str());
  D.SetMonth(tempMonth);
  getline(ss, convertToInt);
  tempYear = atoi(convertToInt.c_str());
  D.SetYear(tempYear);
  return input;

  getline(input, temp, ','); // added delimiter here
  stringstream ss(temp);
  getline(ss, convertToInt, ':');
  tempHours = atoi(convertToInt.c_str());
  T.SetHours(tempHours);
  getline(ss, convertToInt);
  tempMinutes = atoi(convertToInt.c_str());
  T.SetMinutes(tempMinutes);
  return input;
...