3

私は、.Wav ファイルから int を読み取るのにかなりの時間を費やしてきました。ここにリストされている .wav 仕様に従っています。ヘッダーから int (Subchunk2Size) を読み取ってから、データを short の配列に読み取ろうとしています。fread() と ifstream.read() の両方で障害に遭遇しています。両方の読解技術の問題について私の問題をリストしますが、実際には 1 つに対する答えだけが必要です。

fread()

    sprintf(filename, "C:\\Users\\MacbookWin7\\wavs\\%s.wav", word);
FILE * infile = fopen(filename, "rb");
if (infile != NULL)
{
    int f = ferror(infile);
    int d = fseek(infile, 40, SEEK_SET);
    int * subChunk2Size = new int[1];
    int i = fread(subChunk2Size, sizeof(int), 1, infile);
    int g = ferror(infile);

問題: fread は何も読み込まず、i は常に 0 に初期化されます。

subChunk2Size の宣言、ポインター、配列の宣言 (単一要素と複数要素の両方)、nullptr の宣言、int の宣言とその参照の受け渡しのさまざまな組み合わせを試しました。

ifstream.read()

    sprintf(filename, "C:\\Users\\MacbookWin7\\wavs\\%s.wav", word);
ifstream sampleStream(filename,ios::binary);
char * samplesStr;

if (sampleStream.is_open())
{
    sampleStream.seekg(40);
    char * subChunk2SizeStr = new char[4];
    sampleStream.read(subChunk2SizeStr, 4);
    int subChunk2Size = 0;
    for (int i = 3; i >= 0; i--)
    {
        subChunk2Size = (subChunk2Size << 8) + subChunk2SizeStr[i];
    }
    int numBytes = subChunk2Size + *nsamples * 2;
    char * samplesStr = new char[numBytes];
    sampleStream.read(samplesStr, numBytes);
    sampleStream.close();
    short * samples = new short[numBytes / 2];
    for (int i = 0; i < numBytes / 2; i++)
    {
        int b = i * 2;
        samples[i] = samplesStr[b+1];
        samples[i] = (samples[i] << 8) + samplesStr[b];
    }

問題: 最初の読み取りとビット シフトでは、約 22,000 の正しい答えが得られますが、2 回目のループで short を読み取ることができません。

私の問題を考慮してくれた人に感謝したいと思います。

4

1 に答える 1