2017-02-12 1 views
2

このコードでは、最初に.wavファイルを読み込んでサンプル数を調べました。このサイズを使用して、私はそのサイズの配列を作成しようとしていました。その後、サンプルの同じ.wavファイルを読み込み、その配列に格納していましたが、762880サンプルのうち7500サンプル(約)しか読み取れませんでした。実行時にサイズが決定されるCで配列を作成する際のエラー

#include<stdio.h> 
#include<conio.h> 
#include<math.h> 
#include<stdlib.h> 

void main(){ 
    FILE *fp; 
    long n,i=0; 
    float *data; 
    FILE* inp =NULL; 
    FILE* oup =NULL; 
    float value =0; 
    signed short ss; 
     /* Open file */ 
    fp = fopen("k1s1.wav", "rb"); 
    fseek(fp, 0L, SEEK_END); 
    n = ftell(fp); 
    n=n/2-22; 
    printf("n:%ld",n); 
    fclose(fp); 


    data=malloc(n*sizeof(float)); 


    inp = fopen("k1s1.wav","rb"); 
    oup = fopen("cs123.txt","wt"); 
    fseek (inp,44,SEEK_SET);// that didn't help getting the right result !! 

    i=0; 
    for(i=0;i<n;i++){ 
     fread(&ss, sizeof(signed short) ,1 , inp); 
     //Now we have to convert from signed short to float: 
     value=((float)ss)/(unsigned)0xFFFF; 
     value= value* 2.0; 
     value= value*100000; 
     value= ceil(value); 
     value= value/100000; 
     fprintf(oup,"%f\n",value); 
     data[i]=value; 
     ///printf("%lf\t",value); 

    } 

    fclose(inp); 
    fclose(oup); 
    printf("done"); 

} 

この行を削除すると、「data [i] = value;」という行が削除されます。 forループではプログラムがうまく動作し、ファイルの出力を見ることができます。これらの値を配列に格納して、さらに計算する必要があります。何が原因なのですか?

+1

'fopen()'、 'malloc()'、 'fread()'呼び出しをエラーチェックする必要があると主張する余地があります。しかし、あなたが「n」のために分かりやすいサイズを取得している場合、私はすぐに問題を見ることはありません。私はコードを試してみたことはありません。私は 'rewind(fp)'や 'fseek(fp、0L、SEEK_SET);'を使って '.wav'ファイルを再オープンしなくても済むことを観察しました。しかし、これは最適化であり、問​​題の原因ではありません。 –

+0

コンパイラは出力に影響しますか? – Paras

+0

ここでコンパイラが大きな要因になることはまずありません。このコードでは、標準のC言語を使用しています。その機能のどれも使用していませんが、 ''を含めてはいけません。明らかに、何らかの形でコンパイラの問題にぶつかっている可能性があります。どのコンパイラを使用していますか? (私はちょうどキー機能のエラーチェックでコードのバージョンをコンパイルしましたが、問題はないようです。私のマシンで最初に見つかった '.wav'ファイルは、私はMacOS Sierra 10.12.3とGCC 6.3.0を使ってMacで作業していました) –

答えて

0

コードは大丈夫です。あなたができることは、fseekfreadの結果を調べて、期待どおりに動作していることを確認することです。 fseekについては、技術的にはftellの結果が渡され、何か計算されたものが渡されてはいけません。

私はTurboCのコメントに見ました。その場合は、「小文字の&ビッグデータ」を使用して構築してください。 「小さなコード&小さなデータ」で構築している場合、多くのデータが表示されているような問題が発生する可能性があります。

私はおそらくこのような何か書きたい:このソリューションはfseekftellなどが働いてか、それらを使用しないことで、そのためより多くのエラーをチェックしているかどうかについての不確実性を回避

#include <stdlib.h> 
#include <stdio.h> 

#define HEADER  22 
#define INCREMENT  10000 
#define CONVERSION (2.0/65535.0) 

int main() { 
    FILE *inp = NULL, *oup = NULL; 
    float *data = NULL, value; 
    signed short header[HEADER], ss; 
    long i = 0, j = 0; 

    if ((inp = fopen("k1s1.wav", "rb")) && (oup = fopen("cs123.txt","wt"))) { 
     if (fread(header, sizeof(header), 1, inp)) { 
      while (fread(&ss, sizeof(signed short), 1, inp)) { 
       value = ((float)ss) * CONVERSION; 
       if (j == i) { 
        j += INCREMENT; 
        if (!(data = realloc(data, j * sizeof(float)))) { 
         fprintf(stderr, "FAILURE: realloc failure at %ld elements\n", j); 
         return EXIT_FAILURE; 
        } 
       } 
       data[i++] = value; 
       fprintf(oup,"%.5f\n",value); 
      } 
      /* Release any extra memory */ 
      j = i; 
      if (!(data = realloc(data, j * sizeof(float)))) { 
       fprintf(stderr, "FAILURE: realloc failure at %ld elements\n", j); 
       return EXIT_FAILURE; 
      } 
      for (i = 0; i < j; i++) { 
       /* Can analyze data here */ 
      } 
     } else { 
      fprintf(stderr, "FAILURE: header not defined\n"); 
      return EXIT_FAILURE; 
     } 
    } else { 
     fprintf(stderr, "FAILURE: files could not be opened\n"); 
     return EXIT_FAILURE; 
    } 

    /* Okay to use if the arguments are NULL */ 
    free(data); 
    fclose(inp); 
    fclose(oup); 

    return EXIT_SUCCESS; 
} 

をあなたのテストケースで失敗した場合には、何が起きる可能性があります。お役に立てれば。

+1

これはコメントではなく、答えのようです。 –

関連する問題