2010-03-11 10 views
5

C++에서 다음 코드를 사용합니다. 이진 파일을 쓸 수 없습니다.

int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 
ofstream output("Sample.txt", ios::out | ios::binary); 

for(int i = 0; i < 10; i++) 
{ 
    output<<arr[i]; 
} 

는 지금의 Sample.txt는 다음과 같이이다 :

12345678910 

는 "의 Sample.txt는"바이너리 있어야 아닌가? 이진 모드로 스트림을 열면 모든 것이 이진으로 변환되지 않는 이유는 무엇입니까? 어떻게해야합니까 배열에있는 모든 요소의 바이너리가 필요하고 다음 파일에 인쇄 할 수 있습니다.

+0

"바이너리"란 무엇을 의미합니까? – GManNickG

+0

배열의 해당 정수에 대한 이진 값이므로 배열의 정수가 5 인 경우 5 대신 101을 인쇄해야합니다. – Jay

+0

글쎄, 원시 데이터를 출력하려면'write' 함수를 사용해야합니다. 하지만 그걸로 디스크에 101을 인쇄합니다. (아마도 0000000000000101과 비슷할 것입니다.) 파일을보기 위해 무엇을 사용하든 실제로는 원래의 것과 0을 표시하지 않을 것입니다. 텍스트 파일 뷰어는 텍스트 파일 편집기에서 바이너리 파일을 열면 왜곡 된 쓰레기가 표시되는 이유는이를 ASCII로 해독하려고합니다. 당신은 1과 0을 보지 못합니다. 아마도 그렇게하는 16 진 편집기가 더 적합 할 것입니다. – GManNickG

답변

3

"Sample.txt"가 바이너리가 아닌가요?

No. std::ios::binary'\n'과 플랫폼 관련 EOL의 변환을 방지하기위한 것입니다. 데이터 바이트의 내부 표현과 문자열 변환 사이의 변환은 건너 뛰지 않습니다. 결국, 그것은 모든 흐름에 관한 것입니다. (또한 이진 표현으로 포인터를 포함하는 사용자 정의 형식의 객체를 스트리밍하는 방법을 생각해보십시오.)

실제로 이진 객체를 사용하려면 std::ostream::write()을 사용하십시오. 그러나 결과는 플랫폼에 따라 다릅니다.

+0

배열을 이진 값으로 파일에 쓰려면 어떻게해야합니까? – Jay

+0

output.write ((char *) arr, sizeof (arr)); –

+0

만약 내가 말한다면, output.write ((char *) arr [i], sizeof (int)); 프로그램이 충돌하고 output.write ((char *) arr, sizeof (arr))는 Sample.txt 파일에 아무 것도 출력하지 않습니다 – Jay

0

이진 모드는 주로 프로그램하는 개행 문자와 행의 끝을 표시하는 것으로 생각하는 플랫폼 (예 : "\ r \ n") 사이에 변환이 없음을 의미합니다. Windows의 경우 "Ma"의 "\ r").

실제로 바이너리를 작성하려면 일반적으로 ofstream.write()을 사용합니다.

0

바이너리는 개행 문자가 OS 고유의 형식으로 /에서 변환되지 않는다는 것을 의미합니다. int 유형의 값을 ofstream과 함께 출력하면 십진수 (일반 ASCII 텍스트)로 형식이 지정됩니다.

바이너리를 의미하는 경우 char 유형의 값을 쓰거나 형식이 지정되지 않은 함수 output.write (docs here)을 사용해야합니다.

0

'not text'와 같은 바이너리는 새 줄과 같이 서식이 지정되지 않는다는 것을 의미합니다.

See

: 독립적 형식 고려 입출력 동작을 수행 바이너리 모드에서 열

파일 스트림. 비 이진 파일은 텍스트 파일로 알려져 있으며 일부 특수 문자 (예 : 줄 바꿈 및 캐리지 리턴 자)의 형식으로 인해 이 번역 될 수 있습니다.

01 형식으로 변환되지 않습니다. PC의 모든 내용은 binary 형식을 사용하지만 파일을 열어 편집기로 읽을 때 편집기는 이진 데이터를 읽고 ASCII 문자를 표시합니다.

관련 문제