爲了學習文件結構,我試圖讀取一個.wav文件並只是打印有關它的信息。我有一個持有定義爲這樣的所有信息的結構:爲什麼printf(「%s」,charstr)對每個fread()的打印效果都超過預期?
typedef struct{
char chunkId[4];
unsigned int chunkSize;
char format[4];
char subchunk1Id[4];
unsigned int subchunk1Size;
unsigned short audioFormat;
unsigned short numChannels;
unsigned int sampleRate;
unsigned int byteRate;
unsigned short blockAlign;
unsigned short bitsPerSample;
char subchunk2Id[4];
unsigned int subchunk2Size;
void *data;
} WavFile;
發生的事情是,每次我fread
通過文件,它會導致我的C字符串來打印長。下面是一個示例代碼段:
fseek(file, SEEK_SET, 0);
fread(wavFile.chunkId, 1, sizeof(wavFile.chunkId), file);
fread(&wavFile.chunkSize, 1, sizeof(wavFile.chunkSize), file);
fread(wavFile.format, 1,sizeof(wavFile.format), file);
fread(wavFile.subchunk1Id, 1, sizeof(wavFile.subchunk1Id), file);
fread(&wavFile.subchunk1Size, 1, sizeof(wavFile.subchunk1Size), file);
fread(&wavFile.audioFormat, 1, sizeof(wavFile.audioFormat), file);
printf("%s\n",wavFile.chunkId);
printf("%d\n",wavFile.chunkSize);
printf("%s\n",wavFile.format);
printf("%s\n",wavFile.subchunk1Id);
printf("%d\n",wavFile.subchunk1Size);
printf("%d\n",wavFile.audioFormat);
東西在我有我struct
設置的方式,我讀文件的方式,或者說printf()
是看到該字符串導致輸出打印爲顯示方式:
RIFF�WAVEfmt
79174602
WAVEfmt
fmt
16
1
預期輸出:
RIFF
79174602
WAVE
fmt
16
1
我不明白,C字符串必須空終止,但後來我開始思考如何從二進制文件打印字符串與打印字符串文字(如printf("test");
)不同?文件規格要求成員的大小具有在我的struct
中定義的確切大小。做char chunkId[5];
,然後chunkId[4]='\0';
似乎不是這個問題的一個很好的解決方案。
我一直在試圖解決這個問題已經有幾天了,所以現在我來到這裏也許會朝着正確的方向前進。
爲了全面披露,這裏是文件相關部分的十六進制輸出,因爲這個webform並沒有顯示出現在輸出中的所有亂碼。
52 49 46 46 CA 1B B8 04 57 41 56 45 66 6D 74 20 10 00 00 00 01 00 02 00 44 AC 00 00 98 09 04 00 06 00 18 00 64 61 74 61
這就是它的一部分,但我也試圖理解爲什麼在這個例子中'fread'和'printf'相關聯。理論上,如果我讀完整個文件,printf會嘗試顯示文件的全部79Mb。 –
(缺少其他格式化程序),printf將一直運行,直至找到0字節。在79 MB數據中找不到0字節是非常不可能的(但並非不可能)! – abelenky
所以我猜字符串文字,編譯器在程序集中添加了空終止符? –