1

WAVファイルを作成して保存するための関数を作成していますが、ストリームに番号を送信する方法がわかりません。

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

私はこのWAVEファイル構造を実装しようとしています:https ://ccrma.stanford.edu/courses/422/projects/WaveFormat/

問題はここにあります出力は次のようになります:

RIFF32WAVE
4

3 に答える 3

3

ストリーミングオペレータ<<フォーマットされた出力を実行します-値をテキストに変換します。これは、バイナリファイル形式に書き込むために必要なものではありません。

代わりに、フォーマットされていない出力関数を使用する必要があります。put単一バイトおよびwrite複数バイトの場合:

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);

更新:コメントに記載されているように、ファイルをバイナリモードで開き、クラシックな「C」ロケールを追加して、書き込んだバイトが混乱しないようにする必要があります。

file.open("sound.wav", std::ios_base::out | std::ios_base::binary);
file.imbue(std::locale::classic());
于 2013-02-07T11:59:09.353 に答える
1

ファイルをバイナリ出力モードで開いてから、印刷する必要があります。

その方法については、この質問を参照してください。

于 2013-02-07T11:55:18.050 に答える
0

ストリーム演算子は、バイナリではなく、フォーマットされたI / O(テキスト)用です。代わりにwriteメソッドを見てください。リトルエンディアンとビッグエンディアンの問題については、OSが提供するhtonl()関数を使用するだけで済みます。

于 2013-02-07T11:59:28.833 に答える