2013-12-12 1 views
0

저는 이번에는 더 많은 설명을하려고 노력할 것입니다. 저는 연구를 해왔지만 그것을 이해하지 못하는 것 같습니다. I는 다음과 같습니다 클래스라는 시간을 가지고 : 두 번째 숫자는 각 라인의 첫 번째 숫자는 times[i].hours입니다한 줄의 파일을 한 객체의 두 변수로 읽어들입니다.

90 1 3.0 
1 1 100.0 
2 34 5.1 

:

 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; 
}; 

나는이처럼 보이는 파일이 times[i].minutes이고, 세 번째 값은 math[i]에 저장 될 double 값입니다. 변수가 private이기 때문에 '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]; 

물론 심지어 일을 거 야, 경우? 감사!

답변

1

Time에 대한 입력 연산자를 만들고 입력 행은

if (!(std::istringstream(input) >> std::skipws >> time[i])) { 
    // report input error 
} 
0이 될 것입니다.

우스운 std::skipws은 (a const&에 결합 할 수있는 임시 std::istringstream로부터 스트림 (std::istream&)에 비 const 기준을 얻는 데 필요한 사용 입력 연산자 std::istream의 부재로 발생하고 반환하기 때문에이 작동 std::istream&).

당신은 당신 Time 클래스에 대한 입력 운영자, 예컨대 :

std::istream& operator>> (std::istream& in, Time& time) { 
    int value; 
    if (in >> value) { 
     time.setTimeMinutes(value); 
    } 
    return in; 
} 

은 아마 입력 운영자가 조금 더 복잡 이것보다 보이지만 기본적인 아이디어는 동일하게 유지를 구현하는 것입니다.

+0

나는 이것도 시험해 볼 것이다, 정말로 고마워! – user2990286

1

minutes 이후 및 hours 변수는 작동합니다 세 줄

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

와 함께이 라인

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

교체, (확실히 좋은 생각입니다) 개인이다.

또 다른 해결책이처럼 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]; 
+0

아, 정말 고마워요!나는 한 줄로 그것을하려고 노력했지만, 이것은 그 목적을 똑같이 할 것입니다! 몇 분 안에 수락 할 것입니다! – user2990286

0

먼저 임시 개체로 읽어해야합니다

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

당신의 대안은 시간에 대한 다른 클래스 나 구조를 만들고 클래스/구조체에 대한 오버로드 된 연산자를 >> 가질 수 있습니다.

관련 문제