2012-07-27 4 views
1

스트림에서 fgetc 함수는 몇 비트를 읽습니까?스트림에서 fgetc가 읽는 비트 수는 얼마입니까?

fgetc의 맨 페이지는이 함수가 "문자"를 읽지 만 문자는 나를위한 명확한 정의가 아니라고 알려줍니다. 얼마나 많은 비트가 "문자"를 포함합니까? 바이트를 읽는 것과 fgetc가 같은 문자를 읽는 것이 맞습니까?

기계의 아키텍처와 "char"또는 "byte"의 크기에 따라 다릅니 까?

내 목표는 이식성있는 스트림 (바이트 = 8 비트 또는 바이트 = 16 비트)에서 이진 데이터를 읽는 것입니다. 스트림에서 읽는 비트 수를 제어하기 위해 fgetc 대신 uintN_t와 같은 유형의 fread/fwrite를 사용하는 것이 더 좋은 생각입니까? 더 나은 해결책이 있습니까?

답변

2

"문자"는 몇 비트입니까?

문자에는 정확히 CHAR_BIT 비트, limits.h에 정의 된 구현 특정 값이 포함됩니다.

/* Number of bits in a `char'. */ 
# define CHAR_BIT  8 

가 바이트를

그래 읽기로는 fgetc의 동등한 문자를 읽고 있습니다, fgetc 정확히 하나의 바이트를 읽습니다.

이 이식성 문제는 쉽게 해결할 수 없습니다. 그 주위의 가장 좋은 방법은 이진 표현에 대한 가정을하지 않는 것입니다.

+0

감사합니다. 그러나 서로 다른 아키텍쳐를 가진 머신간에 공유되는 파일에 바이너리 데이터를 쓰고 싶다면 바이너리 표현에주의해야합니다. 나는 당신이 endianness에도주의를 기울인다면 uintN_t를 사용하는 것이이 문제를 해결한다고 생각한다. – mvera

+0

@mvera 엔디안 독립적 인 출력이 필요한 경우 "BOM"(UTF-16 및 UTF-32의 경우 바이트 순서 표시)을 작성하거나 소프트웨어를 실행하려는 각 플랫폼에 8을 사용해야합니다 비트 바이트는 오늘날 중요한 규모로 사용되는 모든 인기있는 플랫폼입니다. – rubenvb

1

플랫폼에 가장 작은 데이터 단위가 있으며 이는 C 데이터 형식 char에 해당합니다. 모든 I/O는 char 단위로 발생합니다. 문자가 0 – 127이고 0 – 255 또는 127 값을 가질 수 있습니다. 그 밖의 모든 문자는 플랫폼에 따라 다릅니다. (char 내의 실제 비트 수는 매크로 CHAR_BIT에 포함되어 있습니다.

즉, 광고 된 범위 내의 값을 각 문자로 쓰고 읽는 한, 프로그램이 작동한다는 보장을받습니다 모든 준수 플랫폼. 당신이 이 아닌 유일한 것은이 아니며 결과 데이터 스트림이 2 진적으로 동일하다는 것입니다.

+0

당신은 서명 된'char'에 대해 -128을 보증하지 않습니다. -127. –

+0

사실'-127 to 127'! – Shahbaz

+1

그래서 "문자"는 fgetc의 맨 페이지에서 "char"을 의미합니다. 그래서 만약 내가 4 작은 정수로 해석하고자하는 4 옥텟 (32 비트)을 포함하는 바이너리 파일을 가지고 있다면, 8 비트 또는 16 비트 기계의 아키텍쳐에 따라 fgetc를 사용하면 안된다. OEF 전에 각각 2 문자 또는 4 문자를 읽게 될 것이다. . 사실입니까? – mvera

1

fgetc 정확히 하나의 바이트을 읽습니다. 문자 유형 (signed char, char, unsigned char 및 정규화 된 버전)은 비트 (<limits.h>)를 포함하며 이는 8보다 큰 상수입니다.

관련 문제