2011-03-11 54 views
0
double buf[1000]; 
double value; 
double *ptr = &value; 
for(i=0; i < no_of_iterations; i++) { 
    for(j=0; j < chunkSize; j++) { 
    num_bytes_read = fread(ptr,1,pcm_sample_size,fptr); //read one sample 
    if(num_bytes_read == 2) { 
     sum_sq += (*ptr) * (*ptr); //calculate power of each sample 
     buf[j] = *ptr; 
    } 
    else { 
     flag = 0; 
     break; 
    } 
    } 
    if(!flag) { 
    printf("exiting loop"); 
    break; 
    } 
    power = sum_sq/chunkSize;//calculate rms value of signals for chunkSize samples 
    if(power < threshold) //compare with some value 
    printf("power is lower than threshold"); //silence-don't write 
    else { //write 
    ret = fwrite(buf,1,pcm_sample_size,optr); 
    if(ret != 1) 
     printf("error in fwrite %d", ret); 
    } 
} 
printf("done"); 
fclose(fptr); 
fclose(optr); 

以上是我寫的一些pcm樣本取決於某些條件的代碼,但我得到fread錯誤。 控件不會輸入if(num_bytes_read == 2)塊。我認爲這個錯誤是因爲我想讀取大小爲2個字節的pcm樣本,我需要在某處存儲它。可以使用哪種數據類型來存儲2字節的pcm值(pcm值不是int值)。 請指教。fread失敗的C程序

回答

2

在此行中:

num_bytes_read = fread(ptr,1,pcm_sample_size,fptr);//read one sample 

PTR指向價值的地址,以便它必須是sizeof(double)和1,當你在閱讀只是一個值。

fread的結果是讀取的項數,而不是字節數。

您是否在初始化sum_sq需要的地方?

要讀2個雙打:

double readbuf[2]; 
num_items_read = fread(readbuf, sizeof(double), 2, fptr); 
if(num_items_read == 2) 
{ 
    covariance_sum += readbuf[0] * readbuf[1]; 
} 

不知道你想什麼倍增,但很明顯,如果是2個不同的值,它是不是一個「廣場」。我會讓你修復你的代碼到你的實際邏輯。

+0

我需要第二個和第三個參數是相同的。那麼,我怎樣才能改變ptr,使它是一個2字節的變量? ok點指出,是的,我已經初始化sum_sq爲0.0 – Namratha 2011-03-11 10:44:23

+3

這是fread(membuf,sizeof_item,num_items,fptr)。你正在讀1倍,所以它應該是fread(ptr,sizeof(double),1,fptr)。它只會在你的情況下返回1或0。 – CashCow 2011-03-11 11:18:32

+0

糟糕,是的,你是對的。但輸出文件仍然是0字節 – Namratha 2011-03-11 11:42:25