2017-05-01 2 views
1

다음 코드를 사용하여 파일에서 데이터 쌍을 읽으려고합니다. 컴파일 할 때파일에서 데이터 쌍을 읽는 중

#include <iostream> 
#include <fstream> 
#include <vector> 


using namespace std; 

int main() 
{ 
//**** Opening data file **** 

    ifstream infile; 
    infile.open("reg_data_log.inp"); 

    if (infile.is_open()) 
    { 
     cout << "File successfully open" << endl; 

    } 
    else 
    { 
    cout << "Error opening file"; 
    } 

//**** Reading data *** 

    vector<pair<double, double> > proteins; 

    pair<double, double> input; 

    while (infile >> input.first >> input.second) 
    { 
     proteins.push_back(input); 
    } 

//**** Show data in screen **** 

    cout << "Proteins analized: " << proteins.size() << endl; 

    for(unsigned int i=0; i<proteins.size(); i++) 
    { 
     cout << i.first << ", " << i.second << endl; 
    } 

} 

나는 다음과 같은 메시지를 내가이 문제를 해결 내 머리를 얻을 수

"65:13: error: request for member ‘first’ in ‘i’, which is of non-class type ‘unsigned int’" 
"65:13: error: request for member ‘first’ in ‘i’, which is of non-class type ‘unsigned int’" 

있습니다. 아무도 도와 줄 수 있니?

감사

+0

오류가 명확합니다. 마지막 루프에서'i'를 사용합니다. 그것은'int'입니다. 그러나 당신은'i.first'에 접근하려고합니다. –

+1

이터레이터를 사용해야합니다. 예 :'for (auto i : proteins) {cout << i.first << ","<< i.second << endl;}' –

+0

iterator는 컴파일러 오류 63 : 7을줍니다 : 경고 : 'auto' C++ 11에서 의미를 변경합니다. 그것을 제거하십시오 [-WC++ 0x-compat] – berkboy

답변

2

당신은 정수 값 i의 재산 first에 액세스하려고

for(unsigned int i=0; i<proteins.size(); i++) 
{ 
    cout << i.first << ", " << i.second << endl; 
} 

루프에 더 봐. 정수에는 해당 속성이 없으므로 pair 개체의 속성입니다.

필자는 반복기와 인덱스를 사용하여 반복하는 것 사이에 혼란스러워지고 있다고 생각합니다. 간단한 수정은 이미 언급 된대로 루프를 기반으로하는 범위를 사용하는 것입니다.

for(auto d: proteins) 
{ 
    cout << d.first << ", " << d.second << endl; 
} 

이제 벡터의 요소가 정수가 아닙니다. 이제 firstsecond에 액세스 할 수 있습니다.

루프 기반 범위를 사용할 수없고 auto을 사용할 수없는 경우 루프 방식으로 이전 반복기를 사용할 수 있습니다.

for(vector<pair<double, double> >::iterator it = proteins.begin(); 
    it != proteins.end(); 
    ++it) 
{ 
    cout << it->first << ", " << it->second << endl; 
} 

다른 사람은 이미이 인덱스를 사용하여 수행 할 수있는 방법을 게시하고있다, 그래서 여기에 반복되지 않습니다.

+0

설명해 주셔서 감사합니다. 나는 내 실수를 본다. – berkboy

1

John Mopp은 그의 의견에서 참으로 당신은 int가 아닌 쌍 유형을 참조하고 있습니다. 나는 아직 테스트하지 않았다

cout << "Proteins analized: " << proteins.size() << endl; 

for(unsigned int i=0; i<proteins.size(); i++) 
{ 
    cout << proteins[i].first << ", " << proteins[i].second << endl; 
} 

,하지만 난이 방법으로 문제가 해결 꽤 확신 다음 루프는 가장 가능성이 문제가 해결됩니다.

+0

감사합니다. 예, 작동합니다. – berkboy

관련 문제