오버로드 연산자 >> C ++의 Char 버퍼에 - 스트림 길이를 알려줄 수 있습니까?

StackOverflow https://stackoverflow.com/questions/1686385

문제

나는 커스텀 C ++ 충돌 코스에 있습니다. 나는 몇 년 동안 기본 사항을 알고 있었지만 현재 내 기억을 새로 고치고 더 많이 배우려고 노력하고 있습니다. 이를 위해 두 번째 작업으로 (링크 된 목록을 기반으로 스택 클래스를 작성한 후) 내 자신의 문자열 클래스를 작성합니다.

지금까지 꽤 순조롭게 진행되었습니다. 오퍼레이터를 과부하하고 싶습니다 >> cin >> my_string;. 같은 일을 할 수 있습니다. 문제는 Istream을 올바르게 읽는 방법을 모른다는 것입니다 (또는 문제는 스트림을 모른다는 것입니다 ...). 한 번에 .read () s 128 바이트를 한 번 (! stream.eof ()) 루프를 시도했지만 예상대로 EOF에서만 중지했습니다. Cin >>과 함께 std :: string에 얻는 것처럼 Newline에 읽고 싶습니다.

내 문자열 클래스에는 메모리에 메모리를 할당하는 alloc (size_t new_size) 함수가 있으며 그 부분을 수행하는 부록 (const char *) 기능이 있지만, 나는 완충기.

이것을 구현하는 방법에 대한 조언이 있습니까? 나는 seingg () 및 tellg ()를 사용하여 istream 길이를 얻지 못했고 (-1을 반환하지 않음), 한 번에 하나의 덩어리를 읽는 EOF (Newline에서 읽지 않음)까지 루핑을 말한 것처럼 한 번에 하나의 덩어리를 읽었습니다.

도움이 되었습니까?

해결책

줄이 끝날 때까지 스트림에서 문자를 읽으려면 루프를 사용하십시오.

char c;
while(istr.get(c) && c != '\n')
{
     // Apped 'c' to the end of your string.
}
// If you want to put the '\n' back onto the stream
// use istr.unget(c) here
// But I think its safe to say that dropping the '\n' is fine.

방이 떨어지면 더 큰 크기로 버퍼를 재 할당하십시오. 데이터를 복사하고 계속하십시오. 학습 프로젝트를 위해 화려할 필요가 없습니다.

다른 팁

cin :: getline (buffer*, buffer_size)을 사용할 수 있습니다. 그러면 나쁜, EOF 및 실패 깃발을 확인해야합니다.

std :: cin.bad (), std :: cin.eof (), std :: cin.fail ()

불량 또는 eof가 설정되지 않으면, 실패 플래그 설정이 일반적으로 버퍼 오버 플로우를 나타냅니다. 따라서 버퍼를 재 할당하고 std :: cin.clear ()를 호출 한 후 새 버퍼로 계속 읽어야합니다.

참고 사항 : STL에서 Istream의 연산자 >>는 이러한 종류의 기능을 제공하거나 ( *char) 글로벌 함수를 제공하기 위해 과부하되어 있습니다. 수업에서 연산자를 과부하시키는 대신 사용자 정의 오버로드를 제공하는 것이 더 현명 할 수도 있습니다.

이에 대한 Jerry Coffin의 답변을 확인하십시오 의문.

그가 사용한 첫 번째 방법은 매우 간단하며 (도우미 클래스 만) 입력을 std::vector<std::string> 여기서 벡터의 각 요소는 원래 입력의 선을 나타냅니다.

그것은 나중에 처리 할 때 정말 쉬워집니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top