2013-08-14 3 views
1

나는 표준 라이브러리 그런 식으로 코드에서 템플릿 유형 (? 아니오)에는 sizeof 연산자를 호출 할 수 있다고 생각 :iostream :: write()에서 sizeof()가 필요합니까?

#include <fstream> 

int main() 
{ 
    std::ofstream file("test.bin", std::ios::binary | std::ios::out); 
    char buf = 42; 

    file.write(&buf, sizeof(buf)); 
} 

그래서에서 작성하는 요소의 크기 프로그래머를 요청하는 이유가 ostream :: write()?

PS : 이것은 내 첫 번째 질문은 내가하지 영어 해요, 당신은 포인터에서 크기를 얻을 수

+1

'ostream :: write'은 템플릿이 아닙니다. 'char *'만 허용합니다. –

+1

'write'는 포인터를 취하고 두 번째 매개 변수는 쓸 요소 수를 나타 내기 때문입니다. – juanchopanza

+0

@BenjaminLindley : 제가 질문을 읽었을 때, 그것은 실제 서명이 아니라 이론적 근거에 관한 것입니다. _ 왜 그것이 템플릿이 아닌가? – MSalters

답변

1

char *은 예에서와 같이

char const c = 'a'; 
char const * ptr = &c;  // char const * 

수 있습니다,하지만 당신은 당신이 최대로 결정 방법, 단지 포인터를 사용할 수있을 때 그것은 또한

std::string x("some string"); 
char const * ptr = x.c_str(); // also char const *!! 

리터럴 문자열이 될 수 있는지 읽은 메모리 주소? 길이가 필요합니다 :

file.write(x.c_str(), x.length()); 
+0

감사합니다. 허용 된 것으로 표시합니다. – Johan

0

관대합니다. ostream::write

ostream& write (const char* s, streamsize n);

여기 s은 대신 그냥 포인터의 당신 크기를 줄 것이다, 당신은 당신이 쓸 필요가 얼마나 많은 바이트 알려하지 않습니다이에 sizeof를 사용하여 위치를 가리 킵니다.

0

요소의 양을 알지 못하는 배열에 대한 포인터의 크기를 알 수 없습니다.

Sizeof (ptr)는 사용 된 연산자에 따라 플랫폼 포인터의 크기 (8 바이트) 또는 지적 구조의 크기를 반환합니다.

char * ptr = "abcdef" 

printf("%ld", sizeof(ptr)); 
printf("%ld", sizeof(*ptr)); 

하는 첫 번째 반환 8 (플랫폼에 따라 다름), 심지어는 '올바른'크기를 통해 두 번째 1. 버퍼의 크기를 알아야하기 위해 따라서 6

, 당신은 크기를 통과해야합니다 추가 매개 변수로

같은 이유로 memset과 memcpy는 사용자가 포인터의 크기를 지정해야합니다.