這裏是我遇到的麻煩的部分代碼:爲什麼的fread(fmtChunkId,的sizeof(char)的,4,FP);閱讀11個字符?
fread(fmtChunkId, sizeof(char), 4, fp);
if(strcmp(fmtChunkId, "WAVE") != 0) {
cout << "Not WAVE format: " << fmtChunkId << endl;
return 0;
}
當我運行程序時,它打印Not WAVE format: WAVE e∞@
這是長期的,而不是4。但是11個字符,它工作正常,當我更換fmtChunkId
與type
,這混淆了我,因爲我聲明這兩個變量相同。
#include <iostream>
#include <string.h>
using namespace std;
int main() {
/*Get file path*/
char filepath[261];
cout << "Please enter the file path of a .wav file: ";
cin.getline(filepath, sizeof(filepath));
FILE *fp = NULL;
fp = fopen(filepath, "rb");
if(!fp) {
cout << "Failed to open file: " << filepath;
return 0;
}
cout << endl;
/*Declarations*/
char type[4];
char riffChunkId[4];
int riffChunkSize;
char fmtChunkId[4];
int fmtChunkSize;
short audioFormat;
short numChannels;
int sampleRate;
int byteRate;
short blockAlign;
short bitsPerSample;
int dataSize;
/*Read file data*/
fread(riffChunkId, sizeof(char), 4, fp);
if(strcmp(riffChunkId, "RIFF") != 0) {
cout << "Not RIFF format: " << riffChunkId << endl;
return 0;
}
fread(&riffChunkSize, sizeof(int), 1, fp);
fread(fmtChunkId, sizeof(char), 4, fp);
if(strcmp(fmtChunkId, "WAVE") != 0) {
cout << "Not WAVE format: " << fmtChunkId << endl;
return 0;
}
fread(type, sizeof(char), 4, fp);
if(strcmp(type, "fmt ") != 0) {
cout << "Not fmt: " << type << endl;
return 0;
}
fread(&fmtChunkSize, sizeof(int), 1, fp);
fread(&audioFormat, sizeof(short), 1, fp);
fread(&numChannels, sizeof(short), 1, fp);
fread(&sampleRate, sizeof(int), 1, fp);
fread(&byteRate, sizeof(int), 1, fp);
fread(&blockAlign, sizeof(short), 1, fp);
fread(&bitsPerSample, sizeof(short), 1, fp);
fread(type, sizeof(char), 4, fp);
if(strcmp(type, "data") != 0) {
cout << "Not data: " << type << endl;
return 0;
}
fread(&dataSize, sizeof(int), 1, fp);
/*Print file data*/
cout << "RIFF Chunk Size: " << riffChunkSize << endl;
cout << "fmt Chunk Size: " << fmtChunkSize << endl;
cout << "Audio Format: " << audioFormat << endl;
cout << "Number of Channels: " << numChannels << endl;
cout << "Sample Rate: " << sampleRate << endl;
cout << "byteRate: " << byteRate << endl;
cout << "blockAlign: " << blockAlign << endl;
cout << "Bits Per Sample: " << bitsPerSample << endl << endl;
return 0;
}
解決這些問題的最佳工具是使用調試器,但不在你這樣做之前先問Stack Overflow。告訴我們您在檢查您的代碼時所做的所有觀察。您也可以閱讀[**如何調試小程序(由Eric Lippert撰寫)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)**] At最少給我們留下一個** [MCVE] **,它可以再現您的問題。 (這是個人評論由πάνταῥεῖ™提供) –
無效終止。 –
要展開,您的char數組可以包含4個字符。你讀了4個字符,但也需要附加一個空字節,因爲fread不會爲你做。 – zachyee