這是Brian在cs50第4周實驗中解釋的代碼
//修改一個音頻檔案的音量。
//.wav頭的位元組數
const int HEADER_SIZE = 44;
int main(int argc, char *argv[])
{
//檢查命令列引數。
if (argc != 4)
{
printf("用法。./volume input.wav output.wav factor
")。)
return 1。
}
//打開檔案并確定縮放系數。
FILE *input = fopen(argv[1], "r"/span>)。
if (input == NULL)
{
printf("Could not open file.
")。)
return 1;
}
FILE *output = fopen(argv[2], "w") 。
if (output == NULL)
{
printf("Could not open file.
")。)
return 1;
}
float factor = atof(argv[3]) 。
// TODO:從輸入檔案復制頭檔案到輸出檔案。
uint8_t header[HEADER_SIZE]。
fread(header, HEADER_SIZE, 1, input))
fwrite(header,HEADER_SIZE, 1, output)。
// TODO:從輸入檔案讀取樣本并將更新的資料寫入輸出檔案。
int16_t buffer。
while(fread(&buffer, sizeof(int16_t), 1, input)
{
buffer *= factor;
fwrite(&buffer, sizeof(int16_t ), 1 ,output) 。
}
//關閉檔案。
fclose(input);
fclose(output);
}
我對fread()和fwrite()的作用感到疑惑。 它說:
while(fread(header, HEADER_SIZE, 1, input)
不應該是 :
while(fread(header,sizeof(uint8_t), HEADER_SIZE, input)
因為語法是 :
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)。
ptr,這是讀取資料的記憶體地址(第一個位元組)。
size,是要讀取的資料型別的大小(以位元組為單位),
nmemb,是要讀取的資料型別的大小(以位元組為單位)。
nmemb,這是一次要讀的這些型別的數量,以及
stream,這是要讀的資料型別的大小(位元組)。
stream,它是由 fopen 回傳的指向 FILE 的指標。
為什么我們在fwrite()和fread()中使用buffer的地址,而在fwrite()和fread()中不使用header?每次回圈后,緩沖區的值是否會被覆寫?
uj5u.com熱心網友回復:
這取決于。
如果你想接收一個完整的頭,然后把它作為一個頭來處理,具有頭的各個部分的意義,那么你應該要求一份你想處理的那種頭的副本:
fread(header, HEADER_SIZE, 1, input)
如果你想接收一些位元組(恰好是一個頭的大小),然后將它們作為獨立的位元組進行處理(即忽略它們一起構成一個頭的事實),那么你應該要求許多位元組:
fread(header,sizeof(uint8_t), HEADER_SIZE, input)
(經明確許可,我添加了WeatherVance的貢獻。它為我試圖解釋語意的方法增加了技術后果的細節。)
fread(header, 1, 44, input)和fread(header, 44, 1, input)都將試圖讀取多達44位元組。
如果只能讀取2個位元組,那么fread將在第一種情況下回傳2,在第二種情況下回傳0。因為第一種情況是試圖讀取44個大小為1的專案,第二種情況是想讀取1個大小為44的專案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/332271.html
標籤:
