2011-04-09 3 views
1

필자는 바이너리 또는 텍스트 파일에서 링크 된 목록을로드하는 데 사용하는 코드 조각을 가지고 있습니다. 텍스트 파일에는 잘 작동하지만 바이너리의 경우 항상 여분의 행을로드합니다. 그래서 getline 작동 :getline()은 어떻게 작동합니까?

while(1) 
{ 
    if(!file.good()) 
      break; 

    getline(file,line); 
    student.name=line; 

    getline(file,line); 
    student.phone=line; 

    current->insert(student); 
} 
+0

"그것은 텍스트 파일에 대한 잘 작동하지만 항상 진 경우 별도의 라인을로드"죄송합니다, wwwhat 다음과 같이 루프 내부의 파일에서 간단한 데이터를로드의 정식 방법은 뭔가? – iehrlich

답변

3

는 항상 여분의 라인 물론

로드 : 당신은 당신이 성공적으로 읽을 것을 확인하지 않고 읽은 내용 삽입된다.

file.good() 테스트 읽기 시도 후에 이동해야합니다.

또한 good을 명시 적으로 테스트 할 필요가 없으며 getline의 결과는 이미 상태를 제공합니다.

student_type student; 
while (getline(file, student.name) and getline(file, student.phone)) 
    current->insert(student_type(student)); // Makes explicit copy! 
+0

만약 내가 그 텍스트 파일을로드 할 누락 된 줄을 읽었습니다. – Ahmed

+0

@Ahmed 그런 경우에는 텍스트 파일에 운영 체제가 아닌 줄 끝 문자가 포함됩니다. –

2

getline()은 \ n 또는 EOF 종료 된 행을 읽습니다.

따라서 바이너리 파일에서는 그다지 의미가 없습니다. 문자 추출되었거나 리미팅 캐릭터 (이 파라미터는 별도로 '\ n'지정된 경우, 또는 DELIM이다) 발견된다 - 하나 (1 N)까지

문자가 추출된다. 입력 순서 에서 파일의 끝에 도달하거나 입력 조작 중 오류가 발생하면 추출도 중지됩니다.

+0

동의. 이것이 진정한 바이너리 파일이라면 개행 문자를 찾는 것이 아무런 의미가 없습니다. 단지 파일 유형에 사용 된 인코딩이 0xD 0xA 또는 0xA를 생성했음을 의미합니다. – user470379