覚えるのではなく,原理を理解することが重要です。 |
まず 関数 fopen( ) でファイルを"開きます"。 |
実際のデータの"書き込み",または"読み込み"のコードを書きます。 |
処理が終ったら,関数 fclose( ) でファイルを"閉じます"。 |
FILE *fp;
といったように,FILE型へのポインタ(ここでは変数名 fp
としている)を宣言します。これで,FILE型へのポインタ型の変数として,fp
が使用できるようになります。もし,別の変数名を使って,
FILE *xxxx;
と宣言した場合には,以下では fp
を全て xxxx
で読み替えてください。
fp = fopen(filename, mode);
というコードを書きます。ここで, filename
には実際のファイル名を,文字リテラル(文字列の定数)や文字列(char型の配列)で与えます。mode
には,fopen( )
は,FILE型へのポインタ型を返してきますので,それを,先程宣言しておいた,変数 fp
に代入しておきます。(この変数 fp
は,後で実際にファイルに読み書きするときに使用します。)fopen( )
は,NULL(\0)を返してきます。よって,その場合には,別のファイル名を与え直してみるといった処理をしたり,あるいはプログラムをその時点で終了するようにコードを書けばよいでしょう。fopen( )
でファイルを開いたら,FILE型へのポインタ型である変数 fp
に向けて,実際にデータを読み書きする作業をします。
fscanf(fp, format, ...);
fprintf(fp, format, ...);
format
以降は, scanf( )
や printf( )
と全く同じ書き方をします。scanf( )
fscanf( )
printf( )
fprintf( )
fscanf( )
,fprintf( )
の使い方のコツとしては,以下のようになります。printf( )
( scanf( )
)を使ったコードをためしに書いておいて,f
をひっつけ,引数に fp
(ファイル・ポインタ)を追加する
fclose(fp);
と書くだけです。この操作をし忘れると,せっかく作ったファイルが壊れる可能性がありますので,必ず忘れずに行って下さい。(重要) 出席登録のための実習問題は,授業時間中に必ず提出して下さい。
short tap;
double fs, T, Nf, time, data, x[15000];
char fname[64];
FILE *fp;
printf("時間波形のファイル名を入力して下さい:");
scanf("%s", fname);
printf("%sから読み込みます\n", fname);
printf("標本化周波数を入力して下さい:");
scanf("%lf", &fs);
printf("標本化周波数は%f Hzです\n", fs);
T = 1./fs; /* 標本化周期[s]*/
Nf = fs/2.; /* ナイキスト周波数[Hz] */
if( (fp = fopen(fname, "r")) == NULL ){
printf("\aファイルをオープンできません。\n");
}
else{
tap = 0;
while( fscanf(fp, "%lf%lf", &time, &data) == 2 ){
x[tap] = data;
tap++;
}
printf("時間波形の長さは%hd tapsです\n", tap);
fclose(fp);
}
double dftReal(double x[ ], short tap, double omega, double T)
/* 離散時間信号のフーリエ変換の実部を計算する関数
x[ ]:離散時間信号,tap:離散時間信号の長さ[taps],omega:角周波数[1/s],T:標本化周期[s] */
{
.
.
.
}
double frequency, omega, cReal, cImag, energy;
printf("フーリエ変換のファイル名を入力して下さい:");
scanf("%s", fname);
printf("%sに保存します\n", fname);
if( (fp = fopen(fname, "w")) == NULL ){
printf("\aファイルをオープンできません。\n");
}
else{
frequency = 0.;
while(frequency<=Nf){ /* frequency:周波数を,0 Hzから,Nf:ナイキスト周波数[Hz]まで */
omega = 2.*PAI * frequency; /* 角周波数 */
cReal = dftReal(x, tap, omega, T); /* フーリエ変換の実部 */
cImag = dftImag(x, tap, omega, T); /* フーリエ変換の虚部 */
energy = 2.*(cReal*cReal + cImag*cImag); /* エネルギスペクトル */
fprintf(fp, "%f %f\n", frequency, energy);
frequency += 1.; /* freqを1 Hz増やす */
}
fclose(fp);
}
最近は便利なソフト(しかし高価なもの,10数万円もする!)がたくさんあって,周波数分析(をはじめとして他のいろいろな科学技術計算)をするソフトをC言語で一から作らなくてもよい世の中になってきていますが, 皆さんが将来,たとえそのようなソフトが買えない貧乏・どん底状態になったとしても, (1) そこらへんに捨てられてあるパソコンを拾ってきて, (2) お昼ごはんを一回がまんして,例えば「自分でできるLinuxサーバ構築 CD-ROM付き」(仮名,古本で約170円!),みたいな本を買って, (3) Linux(UNIXの一種)をインストールし, (4) C言語で科学技術計算をするソフトを自分で作って, (5) いろいろな技術を独力で開発・駆使できるような, “本物の技術者” になってほしいと,私は思っています!!! |
(重要) 今日の宿題その1とその2の締切は,2月19日(金)までとします。じっくりと考えて,いいものを作って下さいね。(これらの宿題の解答例は,3/1になったらこのweb上に掲示します。)