質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

バイナリ

バイナリは、「0」と「1」だけで表現されている2進数のデータ形式。または、テキスト以外の情報でデータが記述されているファイルを指します。コンピューター内の処理は全て2進数で表記されています。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

Q&A

解決済

1回答

578閲覧

wavの書き込みがバイナリにならない

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

バイナリ

バイナリは、「0」と「1」だけで表現されている2進数のデータ形式。または、テキスト以外の情報でデータが記述されているファイルを指します。コンピューター内の処理は全て2進数で表記されています。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

0グッド

0クリップ

投稿2019/08/24 07:18

テキストデータの振幅値を書き込んでwavファイルを生成しようとしています.
しかし,書き込むファイルをバイナリモードで開いているのに,振幅値がバイナリで書き込まれません.
元となるwavデータから振幅値を取ってきてテキストファイルに書き込み,それをこのプログラムで読み取ってwavファイルを生成したのですが,元のような音にならず,バイナリエディタで確認したところ,元のwavファイルでは振幅値の部分は文字化けのように意味をなさない数字や記号が並ぶのですが,書き出したwavファイルでは振幅値の数字がそのままスペースで感覚を空けつつ並んでいます.そのような書き込みをするように書いたつもりはないのですが,どうしたら元のwavファイルと同様のものを生成できるようになりますか?

C

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4 5#define WAVOUT "wavFData.txt" 6 7typedef struct{ 8 char id[4]; 9 unsigned long size; 10 char form[4]; 11} riff_chunk; 12 13typedef struct{ 14 char id[4]; 15 unsigned long size; 16 unsigned short format_id; 17 unsigned short channel; 18 unsigned long fs; 19 unsigned long byte_sec; 20 unsigned short byte_samp; 21 unsigned short bit; 22} fmt_chunk; 23 24typedef struct 25{ 26 char id[4]; 27 unsigned long size; 28} data_chunk; 29 30 31riff_chunk riff; 32fmt_chunk fmt; 33data_chunk data; 34 35 36int main(){ 37 FILE *readfp; 38 FILE *writefp; 39 short fdata; 40 char filename[12]; 41 int sampleAmount; 42 43 readfp=fopen(WAVOUT,"r"); 44 if(readfp==NULL){ 45 printf("cannot open %s\n",WAVOUT); 46 exit(0); 47 } 48 49 sampleAmount=0; 50 while(fscanf(readfp,"%hd",&fdata)!=EOF) sampleAmount++; 51 52 printf("出力するwavファイル名を入力(拡張子は不要)\n"); 53 printf(">>"); 54 fscanf(stdin,"%12s",filename); 55 strcat(filename,".wav"); 56 writefp=fopen(filename,"wb"); 57 if(writefp==NULL){ 58 printf("cannot open %s\n",filename); 59 exit(0); 60 } 61 62 memcpy(riff.id,"RIFF",sizeof(riff.id)); 63 riff.size=sampleAmount*2+36; 64 memcpy(riff.form,"WAVE",sizeof(riff.form)); 65 66 memcpy(fmt.id,"fmt ",sizeof(fmt.id)); 67 fmt.size=16; 68 fmt.format_id=1; 69 fmt.channel=1; 70 fmt.fs=11025; 71 fmt.byte_sec=22050; 72 fmt.byte_samp=2; 73 fmt.bit=16; 74 75 memcpy(data.id,"data",sizeof(data.id)); 76 data.size=sampleAmount*2; 77 78 79 fwrite(riff.id,1,4,writefp); 80 fwrite(&riff.size,4,1,writefp); 81 fwrite(riff.form,1,4,writefp); 82 83 fwrite(fmt.id,1,4,writefp); 84 fwrite(&fmt.size,4,1,writefp); 85 fwrite(&fmt.format_id,2,1,writefp); 86 fwrite(&fmt.channel,2,1,writefp); 87 fwrite(&fmt.fs,4,1,writefp); 88 fwrite(&fmt.byte_sec,4,1,writefp); 89 fwrite(&fmt.byte_samp,2,1,writefp); 90 fwrite(&fmt.bit,2,1,writefp); 91 92 printf("size:%ld\n",riff.size); 93 printf("channel:%hd\n",fmt.channel); 94 printf("fs:%ld\n",fmt.fs); 95 printf("bit:%hd\n",fmt.bit); 96 97 fwrite(data.id,1,4,writefp); 98 fwrite(&data.size,4,1,writefp); 99 100 printf("sample:%ld\n",data.size); 101 printf("time:%ld\n",(data.size/2)/fmt.fs); 102 103 rewind(readfp); 104 for(int i=0;i<(data.size/2);i++){ 105 fread(&fdata,2,1,readfp); 106 fwrite(&fdata,2,1,writefp); 107 } 108 109 fclose(readfp); 110 fclose(writefp); 111}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

for(int i=0;i<(data.size/2);i++){

fread(&fdata,2,1,readfp); fwrite(&fdata,2,1,writefp); }

読み込んでるファイルはテキストファイルなんですから、読み込んだデータをそのまま書き込めばテキストを書き込んでることになりますね

投稿2019/08/24 07:31

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/08/24 07:50

そのへんあんまり詳しくないんですが,"wb"で開いてfwrite()で書き込めばバイナリデータになるわけではないんですか?
y_waiwai

2019/08/24 07:54

そこのtとbは、単に改行コードを\nに変換するかどうかってだけで、データ変換されるわけじゃないです
退会済みユーザー

退会済みユーザー

2019/08/24 08:06

なるほど...fread()で普通に数値で読み込めたので逆にfwrite()で書き込めばどうにかなると思っていました... ではどのようにすれば正しく再生されるwavファイルが生成できますか? 検索でもいまいちピンと来るサイトが見つからなかったので教えて欲しいです.
y_waiwai

2019/08/24 08:10

バイナリをテキストに変換してファイルにしてるなら、そこからテキストを読んで変換してやらないとダメってことですね
退会済みユーザー

退会済みユーザー

2019/08/24 08:41

失礼しました...冷静に考えればテキストファイル なのでfread()ではなくfscanf()とかで読み込むべきでしたよね... fscanf()で解決しました.ありがとうございました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問