我一直在从 .Wav 文件中读取 int 的时间。我一直遵循此处列出的 .wav 规范。我正在尝试从标头中读取一个 int (Subchunk2Size),然后将数据读取到一个短裤数组中。我遇到了 fread() 和 ifstream.read() 的障碍。我将列出我的两个阅读技巧问题,但实际上只需要一个答案。
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 的正确答案,但我无法在第二个循环中读取短裤。
我要感谢任何人考虑我的问题。