2013-02-07 2 views
0

내가 만든 WAV 파일을 저장하기위한 기능을 writting 오전하지만 난 스트림에 숫자를 보내는 방법을 모르는 :이 WAVE 파일 구조를 구현하기 위해 노력하고보내기 정수로 리틀 엔디안에게 fstream하기

ofstream file; 
file.open("sound.wav"); 
file << "RIFF"; 
file << (int) 32; 
file << "WAVE"; 

: https://ccrma.stanford.edu/courses/422/projects/WaveFormat/

과 문제는 출력이 같다 여기에 있습니다 :

RIFF32WAVE 

답변

3

스트리밍 연산자 <<의 형식을 갖습니다. 출력 - 값을 텍스트로 변환합니다. 바이너리 파일 형식으로 쓰는 것이 아닙니다. 단일 바이트 putwrite을 여러 바이트 :

file.write("RIFF", 4); 

// The length field is little-endian, so write the lowest byte first 
file.put(length); 
file.put(length >> 8); 
file.put(length >> 16); 
file.put(length >> 24); 

file.write("WAVE", 4); 

UPDATE :

는 대신, 포맷되지 않은 출력 기능을 사용하고자하는 의견에 명시된 바와 같이, 당신은 또한에서 파일을 열어야합니다 바이너리 모드 그리고 inbue 고전 "C"로케일, 당신이 쓰는 바이트로 장난에서 아무것도를 방지하기 위해 :

file.open("sound.wav", std::ios_base::out | std::ios_base::binary); 
file.imbue(std::locale::classic()); 
+0

당신은 파일을 바이너리 모드로 열립니다하고 고전적인 로케일 스며해야한다는 얘기를 깜빡 했네요. (그렇지 않으면 : 그것은 사람이 아니라 일부 특정 구현과 작동 단지 해킹보다 깨끗하고 올바른 해결책을 제안 볼 수있는 즐거움이다.) –

+0

@JamesKanze : 그 중 하나가 포맷되지 않은 출력에 차이가 있습니까? (현지화가 필요없는 코드를 작성하는 리눅스 프로그래머로서, 나는 그런 것들에 대해 자세히 알지 못했다.) –

+0

예. 유닉스에서는 바이너리와 텍스트간에 실제 차이가 없지만 거의 모든 다른 시스템에는 바이너리와 텍스트가 있습니다. 클래식 로케일 이외의 로케일은 입력 및 출력에서 ​​트랜스 코드 할 수 있습니다. (IMHO,이 또한 바이너리 모드에서 사용할 수 그러나 그것은 아니다되어야한다. 그것은 마력 깃든 로케일의 통제하에 완전히이다.) 나도 몰라, 핸드 오프, 사용 가능한 로케일 중 하나가 실제로 유닉스에서 트랜스 코딩 할 여부를하지만, 가능성은 존재한다. (FWIW :'codecvt'에'always_noconv' 함수가 있는데'true'를 반환하면 OK입니다.) –

0

당신은 진 출력 모드에서 파일을 열고 다음에 인쇄해야합니다.

는 작업을 수행하는 방법에 대한 this question 참조하십시오.

0

스트림 사업자 인 형식의 I/O (텍스트)을 위해, 바이너리가 아닙니다. 대신 write 메소드를 살펴 보자. 작은 대 빅 엔디안 문제에 관해서는, 당신은 단순히 당신의 OS에 의해 제공되는 htonl() 함수를 사용할 수 있습니다.