2016-08-26 3 views
-1

여기에 초보자 실수가있을 것이라고 확신하지만, 내 인생을 생각할 수는 없습니다.C++ getline()이 줄 끝에서 멈추지 않습니까?

getline()을 사용하여 두 단어 줄 (성 및 이름)을 읽고 구조체의 멤버 필드로 이름을 정렬하려고합니다. 그러나 getline()은 줄 끝을 지나가고 다음 줄의 첫 번째 줄을 줄의 마지막 줄에 추가합니다.

즉, 행의 마지막 단어를 읽으려고 할 때 getline()은 그 단어와 다음 행의 첫 번째 단어를 읽습니다.

입력 파일의 형식은 :

시애틀 매리너스
Norichiki 아오키
세스 스미스
로빈슨 카노는

여기 내 코드입니다 :

struct Player { 
    string firstName; 
    string lastName; 
    float avg; 
}; 

struct Team { 
    Player roster[8]; 
    string teamName; 
}; 

Team home = {}; 
stringstream iss; 
string token; 
string lineread; 

while (getline(inFile, lineRead, '\n')){ 
    iss << lineRead; 
    if (getline(iss, token, ' ')) 
    { 
     if(s % 2 == 0) 
      home.roster[s/2].firstName = lineRead; 
     else 
      home.roster[s/2].lastName = lineRead; 
    } 
    s++; 
    cout << "token:" << token << endl; 
} 

출력 나는 g이다. 랩탑 설치는 다음과 같습니다

토큰 : 시애틀
토큰 : MarinersNorichiki
토큰 : AokiSeth
토큰 : SmithRobinson

하지만

토큰을 가지고 싶다을 : 시애틀
토큰 : Mariners
토큰 : Norichiki
토큰 : 아오키 더이 대신 같은 것을 시도

+2

문제는'getline()'사용과 관련이 없다. 기대하는 결과물은 'stringstream' 연산자'<<'를 사용하여 이전 내용을 지울 수 있습니다. 그렇지 않습니다. – Peter

+0

getline을 두 번 사용하는 이유. 's' 변수는 무엇입니까? ** 모든 ** 관련 코드를 포함하십시오. 고마워요, 레미, –

답변

0

:

struct Player { 
    string firstName; 
    string lastName; 
    float avg; 
}; 

struct Team { 
    Player roster[8]; 
    string teamName; 
}; 

Team home = {}; 
int s = 0; 
string line; 

while (getline(inFile, line)) 
{ 
    istringstream iss(line); 
    iss >> home.roster[s].firstName; 
    iss >> home.roster[s].lastName; 
    home.roster[s].avg = ...; 
    cout << "first: " << home.roster[s].firstName << ", last: " << home.roster[s].lastName << endl; 
    if (++s == 8) break; 
} 
+0

. 매우 감사 –

0

표준 : cin.getline() 표준 : CIN>와 함께 사용할 때 문제가 실행할 수 있습니다 > var.

getline은 세 번째 인수 - "정지"문자를 제공 할 수 있습니다. 이 문자는 getline의 입력을 끝냅니다. 캐릭터가 먹 혔고 문자열이 종료되었습니다. 예 : std :: cin.getline (str, 100, '|') std :: cin.getline()이 세 번째 인수로 "중지"문자를 제공하지 않으면 줄 바꿈에 도달하면 중지됩니다.

float fl; 
std::cin >> fl; 
char str[101] 
std::cin.getline(str, 101); 

을 그리고 당신은 입력 : 을 감안할 때 3.14

3.14은 플로리다로 읽습니다. 3.14에 이어지는 개행 문자는 여전히 입력 버퍼에 있습니다. std :: cin.getline (str, 101)은 입력 버퍼에있는 개행을 즉시 처리합니다. str은 빈 문자열이됩니다. 응용 프로그램이 std :: cin.getline() 문을 "건너 뛴다"는 환상이 있습니다.

해결책은 std :: cin.ignore();를 추가하는 것입니다. 첫 번째 std :: cin 문 바로 뒤에. 이것은 입력 버퍼 (이 경우 개행 문자)에서 문자를 꺼내 버립니다.) (표준 : cin.ignore을;

  1. 인수 : 단일 문자 입력 버퍼에서 촬영하고 폐기

    표준 : cin.ignore() 세 가지 방법을 호출 할 수있다 // 1 문자를 버리십시오.

  2. 하나의 인수 : 지정된 문자 수는 입력 버퍼에서 가져와 버려집니다. std :: cin.ignore (33); // 33자를 버리십시오.
  3. 두 인수 : 지정된 문자 수를 버리거나 지정된 구분 기호 (둘 중 먼저 오는 부분)를 버립니다. std :: cin.ignore (26, '\ n'); // 26 문자 또는 줄 바꿈을 무시한다. 어느 것이 든 먼저 오는 쪽