午前导师给个任务,用c++写个程序,完成对wav格式的二进制读写

上午导师给个任务,用c++写个程序,完成对wav格式的二进制读写
上午导师给个任务,用c++写个程序,完成对wav格式的二进制读写,要求输入任何一首wav格式的歌曲,能从wav的二进制格式头文件读出歌曲属性,比如声道,比特率等,编程菜鸟,求助
------解决方案--------------------
参考
http://blog.****.net/zhihu008/article/details/7854529
------解决方案--------------------
供参考。


#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>


#pragma warning(disable:4996) /* _CRT_SECURE_NO_WARNINGS */


/*
 * Each .wav file has got 4 types of block:
 * . RIFF block
 * . fmt block
 * . fact block(optional)
 * . data block
 * and each start with the block IDs defined as follows:
 */
#define CHUNK_ID_RIFF "RIFF"
#define CHUNK_ID_FMT "fmt "
#define CHUNK_ID_FACT "fact"
#define CHUNK_ID_DATA "data"

#define RIFF_FMT_WAV "WAVE"

/*
 * RIFF block.
 */
struct RIFF_HEADER
{
char  szRiffID[4];    // 'R','I','F','F'
DWORD  dwRiffSize;
char  szRiffFormat[4];  // 'W','A','V','E'
};


struct WAVE_FORMAT
{
   WORD  wFormatTag;
   WORD  wChannels;
   DWORD  dwSamplesPerSec;
   DWORD  dwAvgBytesPerSec;
   WORD  wBlockAlign;
   WORD  wBitsPerSample;
};

/*
 * Format block. 
 */
struct FMT_BLOCK
{
char    szFmtID[4]; // 'f','m','t',' '
DWORD    dwFmtSize;
struct WAVE_FORMAT wavFormat;
};


/*
 * fact block
 */
struct FACT_BLOCK
{
   char szFactID[4]; // 'f','a','c','t'
   DWORD    dwFactSize;
   char data[4];
};


/*
 * data block
 */
struct DATA_BLOCK
{
char  szDataID[4]; // 'd','a','t','a'
DWORD  dwDataSize;
};


enum { OFMT_BIN, OFMT_CFILE };



static void usage(const char *progname);
static int  wave_dump(const char *wavefile, const char *outfile, int outfmt, int dump_chs);



int main(int argc, char *argv[])
{
int outfmt = OFMT_CFILE; // output file format: default to 'OFMT_CFILE'
int dump_chs = 0;  // defalut to disable dump data for each channel
int i;

#ifdef _DEBUG
argc = 3;
argv[1] = "sample.wav";
//argv[1] = "AlienStorm.wav";
//argv[2] = "-dc";
//argv[3] = "AlienStorm.c";
argv[2] = "sample.c";
//argv[3] = "sample.c";
//argv[3] = "-fb";
//argv[4] = "sample.bin";
//argv[4] = "AlienStorm.bin";
//argv[2] = "AlienStorm.bin";
#endif

if (argc < 3 
------解决方案--------------------
 argc > 5) {
usage(argv[0]);
exit(EXIT_FAILURE);
}

/* parse parameters */
for (i = 2; i < argc - 1; i++)
{
if (_strnicmp(argv[i], "-f", 2) == 0) /* output file format */
{
switch (argv[i][2]) {
case 'b': case 'B': outfmt = OFMT_BIN; break;
case 'c': case 'C': outfmt = OFMT_CFILE; break;
default: usage(argv[0]); exit(EXIT_FAILURE); break;
}
}
else if (stricmp("-dc", argv[i]) == 0) /* check if user wants to dump data for each channel at the same time */
{
dump_chs = 1;
}
else
{
fprintf(stderr, "unknown option %s\n\n", argv[i]);
usage(argv[0]);
exit(EXIT_FAILURE);
}
}


/* dump wave data */
if (!wave_dump(argv[1], argv[argc - 1], outfmt, dump_chs))
return 1;


#ifdef _DEBUG
getch();
#endif
return 0;
}


static void usage(const char *progname)
{
fprintf(stderr, 
"USAGE: %s wave-file [options] output-file\n"
"options:\n"
"-f<c,b>: output file format, \n"
"         -fc means output a c file, it's default\n"
"         -fb means output a binary file\n"
"-dc    : dump data for each channel at the same time, default to disabled\n",