将一行文件读入对象中的2个变量

时间:2013-12-12 18:45:49

标签: c++ file io

这次我会尝试更具描述性,我一直在做研究,但似乎无法弄明白。我有一个名为Time的课程,看起来像这样:

      class Time{

private:
    int minutes;
    int hours;
public:
    Time();
    Time(int h, int m);
    void addMin(int m);
    void addHour(int h);
    void setTime(int m, int h);
    void reset(int h=0, int =0);
    Time sum(const Time &t) const; //Add one time to another time.
    Time sum(int m) const;
    Time operator*(double other) const;
    void show() const;
};

我有一个看起来像这样的文件:

90 1 3.0
1 1 100.0
2 34 5.1

每行中的第一个数字是times[i].hours,第二个数字是times[i].minutes,第三个数字是要存储在math[i]中的双精度数。由于变量是私有的,我需要调用'setTimeHours(int h)'和setTimeMinutes(int m),我不知道该怎么做。这就是我所拥有的。

        int number_of_lines = 0;
        std::string line;
        while (std::getline(inputFile, line)){
            ++number_of_lines;
        }
        Time times[number_of_lines];
        double math[number_of_lines];
        std::string input;
        for(int loop=0;loop<number_of_lines;loop++){
            std::getline(inputFile, input);
            stid::istringstream(input) >> times[i].minutes >> times[i].hours >> math[i];
        } 

我需要帮助的一行是:

      stid::istringstream(input) >> times[i].setTimeMinutes(//what goes here?) >> times[i].setTimeHours(//what goes here?) >> math[i];

当然,如果它甚至可以工作?谢谢!

3 个答案:

答案 0 :(得分:1)

由于minuteshours变量是私有的(绝对是个好主意),所以替换此行

stid::istringstream(input) >> times[i].minutes >> times[i].hours >> math[i];

有三行

int hh, mm;
stid::istringstream(input) >> hh >> mm >> math[i];
times[i] = Time(hh, mm);

应该有用。

另一种解决方案是让操作员>>阅读Time,如下所示:

std::istream& operator >>(std::istream &is, Time &t) { 
    int hh, mm;
    is >> hh >> mm;
    t = Time(hh, mm);
    return is; 
}

那么你就可以在一行中阅读 - 就像这样:

stid::istringstream(input) >> times[i] >> math[i];

答案 1 :(得分:1)

只需为Time创建一个输入运算符,输入行就会变为

if (!(std::istringstream(input) >> std::skipws >> time[i])) {
    // report input error
 }

需要有趣的std::skipws才能从临时const获取对流std::istream&}的非std::istringstream引用,该临时const&只能绑定到{std::istream 1}}(这是有效的,因为使用的输入操作符恰好是std::istream&的成员并返回Time)。

您只需为std::istream& operator>> (std::istream& in, Time& time) { int value; if (in >> value) { time.setTimeMinutes(value); } return in; } 类实现一个输入运算符,例如:

{{1}}

输入操作符可能看起来比这更复杂,但基本思路保持不变。

答案 2 :(得分:0)

您需要先读取临时对象:

int m;
int h;
std::istringstream(input) >> h >> m;
times[i].setTimeMinutes(h,m);

您的替代方案可能是创建另一个类或结构,并且有一个重载的运算符&gt;&gt;对于类/结构。