関数 - みる会図書館


検索対象: Linux/FreeBSDで学ぶC言語
268件見つかりました。

1. Linux/FreeBSDで学ぶC言語

◎ファイルにデータを書き込む : 82 ~ 101 行目 ファイルを開いたら、まず 94 行目の文でデータの件数を保存しています。 fwrite 関数では、最初のパラメータにはメモリのアドレスを渡す必要があります。変数 membercount のアドレスは「 &membercount 」で表すことができますので、それを fwrite 関数に渡しています。 また、 membercount は int 型の変数で、配列ではないので個数は 1 個になります。 したがって、 2 番目のパラメータは「 sizeof(int) 」、 3 番目は「 1 」になっています。 次に、 96 行目の文で住所録の内容を保存します。住所録の先頭アドレスはポイン ◎ファイルからデータを読み出す : 103 ~ 131 行目 age メンバの値 phonenumber メンバの値 address メンバの値 neme メンバの値 age メンバの値 phonenumber メンバの値 address メンバの値 neme メンバの値 ( 変数 membercount の値 ) データの件数 ・ Fig4.2 : 住所録のデータファイルの中身 最終的に、ファイルの中身は下図のようになります。 「 membercount 」を指定しています。 そして、書き込む個数は住所録のデータの件数なので、 3 番目には は「 sizeof(struct addressdata) 」となります。 また、データ 1 個分のサイズは構造体のサイズに等しいので、 2 番目のパラメータ タ adr に入っているので、 fwrite 関数の最初のパラメータは「 adr 」になります。 次に、データの件数分だけメモリを確保して、 124 ~ 125 行目の文でデータを読み タの件数を保存しているので、その値を取り出しているわけです。 membercount に代入しています。 Fig4.2 に示したように、ファイルの先頭にはデー ファイルを開いたあと、 120 行目の文で int 型の値を 1 つ読み出し、変数 出しています。 メモリの内容を直接読み書きする 185

2. Linux/FreeBSDで学ぶC言語

実際、この関数を 5 回呼び出してみると結果は次のようになります。 値が 1 ずつ増えていくのがわかります。 マリスト 5.12 の実行結果 $ count Count Count Co 咫 n セ Co n セ Count 0 変数の使い分け 変数 count の 変数には自動・外部・静的といった種類があるわけですが、それらはどのように使 い分ければいいのでしようか ? これについて考えてみましよう。 ます、大半の変数は自動変数にする方がいいでしよう。自動変数は関数内だけで使 うものになり、他の関数と干渉しないので、 " 関数によってプログラムを部品化する " という効果を得やすいことになります。これは大きなメリットです。 一方、プログラム全体で共有したい情報があれば、それは外部変数で扱うようにす ると便利です。ただし、外部変数を使いすぎると、プログラムの各関数が相互に依存 する形になって、プログラムの見通しが悪くなるというデメリットがあります。 たとえば、 3 つの関数があって、いずれも val という外部変数を読み書きするとし ましよう。このとき、ある関数が val の値を書き換えると、あとの 2 つの関数にもそ の影響が及ぶことになります。これがデメリットになることがあるわけです。 最後の静的変数ですが、先ほどの例で示したように、関数が呼び出された回数をカ ウントするときなどに利用できますが、使う機会はそれほど多くないでしよう。 233 変数の通用範囲と存在時間

3. Linux/FreeBSDで学ぶC言語

0 ファイルから 1 文字読み出す : fgetc 関数 ファイルから 1 文字のデータを読み出すには、「 fgetc 」という関数を使います。 ~ - fge セ c ( ストリーム ) この関数を実行すると、読み込まれた文字が返されます。その文字は、変数に代入 したり、式の中で使ったりします。返される値はⅲ t 型なので、変数に代入する場合 は int 型のものを宣言しておきます。 たとえば、ストリームから 1 文字読み出して、それを変数 ch に代入するには、次の ように記述します。 ch = fgetc ( (p) ファイルの最後まで読み出しが終わると、 fgetc 関数からは「 EOF 」という値が返 されます。「 EOF 」は「 stdio. h 」の中で定義されている定数で、ファイルの最後を表 します。 fgetc 関数の例 リスト 4.3 は、 fgetc 関数を使ってファイルの内容を画面に表示する例です。最初に ファイル名を指定し、 fgetc 関数でそのファイルから 1 文字ずつ読み出して表示して います。 なお、ファイルの長さは一定ではないので、 while 文を使って、ファイルの終わり がくるまで ( fgetc 関数の結果が EOF になるまで ) 繰り返すようにしています。 第 4 章ファイルアクセス 172

4. Linux/FreeBSDで学ぶC言語

メモリの内容を直接 読み書きする fprintf 関数や fscanf 関数を使えば変数の値を読み書きできますが、メモリの内容 を直接読み書きする方が効率的なこともあります。 0 メモリの内容をファイルに書き込む : fwrite 関数 たとえば、配列変数の全要素の値をファイルに書き込みたいとした場合、 fprintf 関数では f 。 r 文の繰り返しを使って、配列の要素を 1 っすっファイルに書き込む形に なります。 しかし、このようにするより、配列の値が記憶されているメモリ領域全体をいっき にファイルに書き込む方が高速に処理できます。あるメモリ領域の内容をファイルに 書き込むには、「 fwrite 」という関数を使います。 ~ - - fwrite ( 先頭アドレス , 単位サイズ , 個数 , ストリーム ) く単位サイズ > で書き込みたいデータの 1 個あたりのサイズを、く個数 > で書き込 むデータの個数を指定します。 たとえば、「 int a [ 10 ] ; 」のように 10 個の要素を持つ int 型の配列があるとした場合、 この配列の全要素をいっきにファイルに書き込みたいとしましよう。 この場合、書き込みたいデータは int 型の数値なので、 1 個あたりのサイズは 「 sizeof(int) 」で求めることができます。また、データの個数は配列の要素数なので 「 10 」になります。メモリ領域の先頭アドレスは、配列の先頭の要素のアドレスなの で「 a 」で表すことができます。 したがって、次のように指定すれば、この配列の全要素がファイルに保存されるこ とになります。 fwrite()r s 土 zeof ( 土 n セ ) ′ 10 ′ fp); 第 4 章ファイルアクセス 180

5. Linux/FreeBSDで学ぶC言語

処理を繰り返す プログラムの中では、 1 つの処理を何度も繰り返して行うことがよくあります。 C 言語では、「 for 」「 while 」「 do —while 」という文で繰り返しを行うことができます。 0 指定した回数だけ繰り返しを行う : for 文 たとえば、画面に「 He Ⅱ 0 」と 3 回表示するとしましよう。もちろん、 printf 関数を 3 回実行するようにプログラムを書けば目的を達成できますが、回数がもっと多くな ったらどうでしようか ? 回数が 100 回なら、 printf 関数を 100 回も書くことになりま す。それではあまりにも不便です。 同じような処理を何度も繰り返して行う場合は「 for 」という文を使います。 ・リスト 1 .30 : 指定した回数だけ繰り返すときの fo 「文の書き方 fo 「 ( く変数 > = 1 ; く変数〉く : く繰り返し回数 > ; く変数 > + + ) く繰り返す処理 > く変数 > には、繰り返しの回数を数えるための変数を指定します。「 i 」や「 j 」とい う名前の変数を宣言して、それを使うのが一般的です。 「 H 酬 0 」を 3 回表示する例 (forloop. c) #include く stdio. h> main() fo 「 (i printf("HeIIoh"); ・リスト 1 .31 : 本 基 の 章 第 70

6. Linux/FreeBSDで学ぶC言語

・ Fig4.1 : 上記の文の動作 a ロ・← CD 番地 sizeof(int) a[2] a[31 a[41 a[5] a[6] a[7] a[8] a[9] 個数 10 個 ファイルへ 書き込み 0 ファイルからメモリに - 読み出す : fread 関数 メモリの内容を直接読み書きする ータがないので、 count には 0 が代入されることになります。 また、ファイルの終わりに到達しているときに上の文を実行すると、読み出せるデ きに上記の文を実行すると、 c 。 unt には 3 カ玳入されることになります。 個数よりも少なくなります。たとえば、ファイルに int 型のデータが 3 個しかないと 読み出しの途中でファイルの終わりに到達すると、返される値は指定したデータの 00 咫 n セ = fread(), sizeof(int) ′ 10 ′ fp); 10 個分のデータがあれば、 count の値は 10 になります。 すると、変数 count には読み出したデータの個数が代入されます。ファイルに int 型 なお、この関数は読み出したデータの個数を返します。たとえば、次のように記述 fread()' s 土 zeof ( 土 n セ ) ′ 10 ′ fp); になります。 ルから int 型 10 個分のデータが読み出されて、それが配列変数 a に書き込まれること たとえば、「 int a は 0 旧として int 型の配列を宣言後、次の文を実行すると、ファイ ~ f て ead ( 先頭アドレス , 単位サイズ , 個数 , ストリーム ) ます。それは「 fread 」で、書き方は fwrite と同じです。 fwrite 関数と反対に、ファイルから読み出した内容をメモリに書き込む関数もあり

7. Linux/FreeBSDで学ぶC言語

0 住所録プログラムを複数のソースファイルに分ける こまでの知識に基づいて、住所録プログラムを作り変えてみましょ それでは、 う。第 4 章でファイルにデータを読み書きできるようにしましたが ( → P182 ・リス ト 4.7 ) 、そのプログラムを元に、複数のソースファイルに分けることにします。 自動変数と外部変数の使い分け こではそれを「デー リスト 4.7 では全処理を main 関数の中で行っていましたが、 タ入力部分」「表示部分」「ファイル書き込み部分」「読み出し部分」に分けます。 こで 1 つ考えなければいけないことがあります。それは、 " 自動変数と外 さて、 部変数をどう使い分けるか " ということです。 このプログラムでは住所録のデータを構造体 (adr) に保存しますが、その構造体 は「データ入力」「表示」「書き込み」「読み出し」のすべての部分で使います。また、 データの件数を表す変数 (membercount) もすべての部分で使います。 こでは、これらの部分を別々の 4 つの関数に分けるので、「 adr 」「 membercount 」 の 2 つの変数を 4 つの関数で共有できるようにすれば、プログラムを作りやすくなり ます。 そこで、これら 2 つの変数は外部変数として宣言することにします。そして、 extern 文を使って各ソースファイルでも使えるようにします。この extern 文はすべ てのソースファイルで必要なので、ヘッダーファイルとして記述して共有できる形に ・リスト 5.13 : 住所録プログラムのメインの部分 (main. c) う名前でプログラムのメイン部分となるソースファイルを作ります。 それでは、実際にソースファイルを分けていきましよう。ますは、「 main. c 」とい メインの部分 しておきます。 1 2 3 4 5 6 7 8 9 10 11 12 13 #include く s 士 dio. h 〉 # i ncl ude "add 「 ess. h i nt membe rcount ; st ruct add 「 essdat a xad 「 ; main() i nt menuno ; / * データの件数を 0 に初期化する * / membe rcount : 0 ; 第 5 章関数とモジュール化 238

8. Linux/FreeBSDで学ぶC言語

0 他のソースファイルの外部変数を使う ソースファイルを複数に分けた場合、 " あるソースファイルで宣言した外部変数を 他のソースファイルの中で使う " という場面も出てきます。住所録プログラムの場合 なら、すべてのソースファイルでデータの件数 ( 変数 membercount) を使います。 この場合、変数 menbercount を「 main. c 」で外部変数として宣言し、残りのソー スファイル中で membercount を使うという形にすることが考えられます。 それには、「 extern 」というキーワードを使って、 " この外部変数は他のソースファ extern 文の書き方は次のとおりです。この extern 文は関数の外に書きます。 イルで宣言されている " ということを指定します。 extern 土セ membercount なります。 ~ ・ extern 型名変数名ー この例の場合なら、 main. c 以外のソースファイルに次の文を入れればいいことに ・ Fig5.8 : exte 「 n 文で他のソースファイルにある外部変数を使えるようにする main. C / * 外部変数の宣言 * / int membercount; / * メインの関数 * / maino input. C / * データ入力関数 * / extern int membercount; 使えるようにする * / /*main. c の外部変数を inputdata( ・・・ ) ソースファイルを複数に分ける 235

9. Linux/FreeBSDで学ぶC言語

・ putcha 「 /getcha 「関数 条件によって処理の流れを変える ・条件を満たしたときだけ処理を行う ・条件を満たさなかったときも処理を行う ・条件判断を次々と行う ・ if のネスト ・ 2 つ条件を満たしたときのみ処理する ・ 2 つの条件のどちらかを満たしたときに処理する ・複数の条件を同時に判断する ・変数の値に応じて処理を分ける : switch 文 処理を繰り返す ・指定した回数だけ繰り返しを行う : f0 「文 ・ fo 「文の本来の意味 ・条件が満たされるまで繰り返す : do—while ・ while 文・・ ・・ 74 ・繰り返しのネスト ・繰り返しを途中で抜ける : b 「 eak 文・ ・・・ 79 その他の基本的な構文 ・定数を定義する ・ソースファイルにコメントを入れる ・長い行を分割する ・条件式の中で一般の処理を行う ・中括弧の省略 ・途中の処理を飛ばす . goto 文 9 0 4 6 9 2 3 4 5 4 5 5 5 5 6 6 6 6 50 70 81 2 3 3 5 5 8 8 8 8 8 8 第 2 章配列変数と構造体 配列変数を使う ・配列変数とは ? ・配列変数を使う ・配列変数の初期化 ・配列変数を使った例 2 次元の配列変数 ・ 2 次元配列を使う ・ 2 次元配列を使った例 文字の配列で文字列を扱う ・文字配列の宣言 ・文字配列に文字列を代入する 88 2 8 9 8 8 9 9 95 ・・ 96 ・・ 98 1 OO ・・ 1 OO ・・ 1 0 1

10. Linux/FreeBSDで学ぶC言語

カラー表示を始める : start_color 関数 次に 「 start_color 」 has ー colors 関数で色がサポートされていることがわかったら、 という関数を実行して、色を初期化します。 ~ ・土 n セ start 0010 て ( 0 土 d ) 色が正常に初期化された場合は、この関数は「 OK 」という値を返します。 カラーベアを定義する curses では、「カラーベア」というもので色を定義するようになっています。文字 と背景とに別々の色を設定できますが、その組み合わせをカラーベアで指定します。 カラーベアは「 init_pair 」という関数で定義します。 ー - 土 n セ土 n 土セー a 土 r ( short a 土て numberr 土 n セ foreground' 土 n セ background ) 「 pair-number 」でカラーベアの番号を指定します。この番号には自分の好きな番 号を選ぶことができますが、番号の最大値は通常 64 までです。「 COLOR-PAIRS 」 という変数を調べれば、指定可能な最大値がわかります。 「 foreground 」「 background 」は、それぞれ文字の色・背景の色を指定するのに使 います。色は下の表の定数で指定します。 マ色を表す定数 黒 COLOR BLACK 青 COLOR BLUE 赤 COLOR RED 紫 COLOR MAGENTA 定 COLOR GREEN 水色 COLOR CYAN オレンジ COLOR YELLOW 白 COLOR WHITE たとえば、次のように指定するとカラーベアの 1 番が定義され、文字は白、背景は 黒になります。 土 n 土セー pa 土て ( 1 ′ CO ル OR WHITE ′ COLOR—BLACK) ー 第 7 章画面とキーボードを制御する 282