dat - みる会図書館


検索対象: C言語によるプログラミング 基礎編 第2版
44件見つかりました。

1. C言語によるプログラミング 基礎編 第2版

9 章構造体とユーザ定義型 / ☆名前 0 ー ー構造体メンバの操作 構造体のメンバの参照方法について述べましよう。 次の形式で参照できます。 構造体変数名 . メンバ名 構造体の各メンバは、 ビリオド (. ) を用いて これを用いて 9.1.1 項の構造体変数 my ー data のメンバ zip を参照してみましよう。次の例では、構 造体メンバの値を別の変数 n に代入しています。 int n; my—data . zip = 1234567 : my—data . zip, n / ☆郵便番号に「 1234567 」を代入する☆ / / ☆ int 型変数 n に郵便番号を代入する☆ / それでは、構造体変数 my ー data を使った名簿表示プログラムを次に示します。 / ☆構造体宣言と構造体変数定義☆ / int main ( VOid ) #include く string. h> #include く s セ d 土 0 . h> リスト 9.1 構造体の利用 struct て 011 { char int int Char Char } my—data ー name [ 32 ] : birth ・ zip; address[ 82 セ el [ 20 ]; / ☆構造体メンバへのデータの代入☆ / my—data . name, "Hinako" ) : my—data . birth = 19890225 ー my—data. zip = 1234567 my—data . address ′ "Yokohama my—data . tel, " 045 ー 123 ー 4567 ' strcpy ( s trcpy ( strcpy ( / ☆名簿表示 * / "ADDRESS printf ( "YnNAME / ☆タイトル表示☆ / -shi 2 工 P / * 生年月日☆ / / ☆郵便番号☆ / / ☆住所 * / / ☆電話番号☆ / / ☆電話番号☆ / / ☆住所☆ / Kanagawa Pref. / ☆郵便番号☆ / / ☆生年月日 * / / ☆名前 BIRTHDAY TELYn" ) ー printf( " 1 ユ 0 .10S % 11.8 10 .7d ー 30 . 30S ー 12 .12sYn " my—data . address / my—data. セ el ) : my—dat@. name ,my—data . birth ′ my—data. zip ′ \ 第叮、 ( をづ第 ) 、 300

2. C言語によるプログラミング 基礎編 第2版

1 0 章 366 ファイル ( 1 ) 標準入力をリダイレクションする 次のようにタイプして、プログラムを動かしてみてください。 This is input data. このプログラムの動作は、ディスプレイに test く data.in えることができます。この例では、プログラムがキーポードから入力するデータが、 data. in ファイル を付けることによって、そのプログラムの標準入力を、入力ファイル名で指定したファイルに切り替 く入力ファイル名 プログラムを動かすときに、そのコマンド名の後ろに と表示するだけです。これより、キーポードからの入力が必要なくなったことに気がつかれるでしょ 次のようにタイプしてプログラムを動かしてみてください。 ( 2 ) 標準出力をリダイレクションする ( その 1 ) から入力されたことになります。 test > data. out このプログラムの動作は、 て、 This is first data. まず gets 関数のところでキーポードからの入力を待ちます。 したがっ のように、適当な文字列を入力しリターンキーを押してみてください。本当ならば、入力した文字列 が puts 関数に渡されて、ディスプレイに表示されるはずなのですが、実際には何も表示しないで終 了してしまいました。 こで、 Windows ( MS ー DOS コマンドプロンプト ) ならば、 type data. out また、 UNIX ならば、 cat data. out とタイプして、 data. out ファイルの内容を確かめてみてください。いま入力した文字列が レイに表示されることが確認できるでしよう。 、ディスプ

3. C言語によるプログラミング 基礎編 第2版

1 0 章 ファイル if( ( fpin printf ( fopen ( " indata . dat" " ファイルが見つかりません。 exit ( EXIT_FA 工 LURE ) if ( ( fpout fopen ( "out . dat" fclose ( fpin ) ー printf ( " ファイルが作成できません。 exit ( EX 工 T_FAILURE ) : / ☆入出力ファイルのオープン☆ / NULL ) indata . dat Yn" ) : NULL ) ou セ . datYn' while ( fscanf ( fpin, fprintf ( fpout ′ sum 十 = va1 : if ( cnt > 0 ) printf ( " 合計 fclose ( fpin ) ー fclose ( fpout ) : return EX 工 T SUCCESS : " 入力デ 平均値ー ! = OF ) / ☆データの入力 &val ) vaI ) ー / ☆合計・平均値の表示 ー %gYn" sum, (double) sum/cnt レ / ☆ファイルのクローズ 出力された out. dat ファイルの内容を以下に示します。ァータの出力されたテキストファイルは、 入力データ > > > 150 入力データ > > > 164 入力データ > > > 153 入力データ > > > 174 入力データ > > > 189 入力データ > > > 185 入力データ > > > 168 ータ > > > 156 ータ > > > 152 ータ > > > 174 入力データ > > > 173 入力データ > > > 169 入力デ 入力デ 入力デ 工デイタを用いれば容易に修正が可能です。 %n を fp 「 in 廿関数に記述しないで、テータを出力した場合の out. dat ファイルの内容 イルに個々の人力データがすべてつながって出力されてしまいます。 ください。もし、この指定をしないと出力される個々のデータは改行されないので、テキストファ このファイルを出力する際の fprintf 関数のフォーマットで、最後に記述してある Yn に注目して 入力データ > > > 150 入力データ > > > 164 ・ 340 ・入力データ > > > 16 9

4. C言語によるプログラミング 基礎編 第2版

10.7 ファイルの追加出力 ファイルの追加出力 前項の方法では、まったく新しいファイルが作成され、そこにデータを出力する方法を学びまし た。本節では、既存のファイルのデータの後に、データを書き込む方法を学習します。たとえば、 すでにプログラムの実行に先立ち、次の内容をもった sample. dat というファイルがあったとします。 sample. dat の内容 C 言語の勉強は難しいなあ。 このファイルに、次の 2 行を追加するわけです。 でも頑張ればきっとなんとかなりま すよ。 追加された sample. dat の内容 C 言語の勉強は難しいなあ。 でも頑張ればきっとなんとかなりま この処理を行うには、ファイルをオープンする際に、 f 叩 en 関数の第 2 引数に "w" ではなく、ファ イルに「データを追加する」という意味の "a" を用いますマ 15 。プログラムの残りの部分は、ファイ ルにデータを出力する場合とまったく同じになります。リスト 10.6 に この処理を行うプログラム を示します。 リスト 10.6 データの追加 #include く stdio . h> #include く stdlib . h> int main ( VOid ) F 工 LE *fp; if ( ( fp = fopen ( "sample . dat" printf ( " ファイルが作成できません。 exit ( EXIT_FA 工 LURE ) NULL ) sample . datYn" ) fprintf ( fp ′ fprintf ( fp ′ " でも頑張れはきっとなんとかなりま Yn " ) : " すよ。 Yn" ) : " a " というのは、叩 pend ( 追加 ) の略です。 のため、は read 、は write です。 341

5. C言語によるプログラミング 基礎編 第2版

1 0 章ファイル 複数のファイルから入力するには 複数のファイルからデータを人力するには、ストリームボインタを必要な個数分だけ宣言します。 *fpl, *fp2, *fp3; を工石 E それぞれに対して、 fopen を行います , 13 そして、 fopen ( "testl . dat" fp2 fopen ( "test2 . dat" fp 3 fopen ( "test3. dat" さらに、それぞれのファイルに対して、データの読み込みを行います。ファイルをオープンしよ うとしたときにエラーが生じると、 f 叩 en 関数はそのエラーに対応したエラーコードを返します。 ファイルを人出力するプログラムを作成しようとするときには、エラーが起こった場合の処理も考 慮する必要があります。これは、 fopen 関数に限らずファイルを計むときや書くときにも常に考慮 しなければ 0 、けな 0 、ことです。なお、 , イ ~ を読み込もうとしときの , ラーに対処する方法に ついては、 10.8 節で説明します。 ところで、ファイルはいくつまで同時に開くことができるのでしようか。ファイル名の最大の長 さと同様に、 C ではく stdio. h > に同時に開くことのできる個数をく stdio. h > のマクロ FOPEN MAX で 定義しています。 今までは、ファイルからデータを人力する方法を学んできましたが、今度は逆に、ファイルに データを書く方法について勉強しましよう。ファイルヘデータを出力するには、次の作業が必要で ファイルへの出力 ( 1 ) ファイルを読む場合と同じように、ファイルをオープンする *fp; F 工 LE fp = fopen ( "indata . dat" もちろん、 f 叩 en の後 fpl 、 fp2 、 fp3 の各値が NULL でないことをチェックする必要がありますが、 マ 13 こでは省略します。 実際には、 fp の値が NULL でないことをチェックする必要があります。 ( a ) 書き込み権限がない場合、 ( b ) ファイル名が マ 14 ファイル命名規則に違反している場合 ( co ebreak 10.3 を参照 ) 、 ( c ) ディスク容量が不足している場合は、ファイルの オープンに失敗して、 fp の値が NULL になります。 338

6. C言語によるプログラミング 基礎編 第2版

ファイルの概念ー ェータを > > > 工 63 ァータを > > > 工 56 ェータを > > > 152 ァータを > > > 174 ァータを > > > 173 ァータを > > > 工 ァータを > > > 0 10.1 ←もし、ここまでデータを入力した時点で 2 つ前の入力データ 152 は 155 の誤りだったと 気づいても、もう修正することはできない。 データを人力するときに、決してまちがえることができません。なぜなら 合計 = 2007 平均値 = 167 . 25 このプログラムでは、 イルには、名前を付けて保存します。図 10.1 のファイルには、 indata. dat という名前を付けること して、図 10.1 のようなデータファイルをプログラムの実行に先立ち作成しておきます。データファ ます。ファイルとは、データを記憶するノートのようなもので、たとえば先ほどのプログラムに対 意した正しいデータを入力する方法があります。データは、ファイル (file) に格納することができ 初から人力し直すのでは大変です。そこで、キーポードからいちいち入力しないで、あらかじめ用 データを入れ直す必要があります。しかし、まちがえるたびにプログラムを再実行し、データを最 です。正しい結果を得るには、プログラムを中断させ、もう一度プログラムを実行し、最初から ば、すでにキーポードから人力したデータは、もう修正 ( つまり、人力し直すこと ) ができないから にしましよう。 150 164 15 3 17 4 18 9 18 5 168 156 152 17 4 17 3 16 9 0 テータファイル (indata. dat) の内容 《ーデータの終わりの印 ・図 10.1 テータファイル ( indata. dat ) の内容 このファイルは、エデイタ ( edit 。 r ) を用いて作成したり、その内容を修正することができます , 1 つまり、今までエデイタを用いてプログラムテキストを作成してきたようにエデイタを用いてデー タを入力して、データファイルを作るわけです。したがって、プログラムの実行に先立ち、正確な データファイルを容易に用意することができます。それでは、この indata. dat データファイルから、 データを人力するプログラムを作ってみましよう。データファイルをプログラムで人力するには、 どうしたらよいのでしようか。 ファイルを取り扱うには、さまざまな初期準備のための処理が必要となります。この処理をオー プン (open)V2 と呼びます。 v 1 テキストファイルの修正は、エデイタ以外にも表計算ソフトなど、さまざまなアプリケーションで修正することができ ます。 日本語ではファイルをオープンすることを、「ファイルを開く」といいます。 327

7. C言語によるプログラミング 基礎編 第2版

1 0 章ファイル オープンの内部処理は、かなり複雑な作業です。しかし、ファイルからデータを入力する場合で も、ファイルにデータを出力する場合でも、 c では f 叩 en 関数を使って簡単にファイルをオープン することができます。 人力の場合の fopen 関数は、次のように用います。 << プログラムの形式 > > 10.1 入力の場合の fopen の一般形 F 工 LE *fp; fp = fopen ( "indata . dat" f 叩 en 関数の第 1 引数としてオープンしたいファイル名、第 2 引数としてこの場合「人力する」と いう意味の文字列早を指定します。 f 叩 en 関数は、 FILE 型 , 3 のポインタを返します。そのため、そ の値を格納する変数 fp を FILE 型のポインタとして定義されていることに注意してください。なお、 これをストリームボインタといいます。 FILE と書いてストリームというのも変な感じですが、本 書ではこの FILE 型で定義される値をすべてストリームボインタ , 4 と呼ぶことにします。 ファイルをオープンするときには、注意しなければならない大事な点があります。それは、オー プンしたいファイルが存在しなかった場合です。存在しないファイルマ 5 からは、人力を行うことが できません。ファイルを扱うプログラムは、このチェックを行う義務があります。 f 叩 en 関数は、 もしそのファイルが存在しなかった場合には関数値として NULL を返します。したがって、 C で f 叩 en 関数を使ってファイルをオープンするときには、次のような処理を行います。なお、 exit は プログラムを終了させるく stdlib. h > の標準関数です。 if ( ()p = fopen ( "indata . dat" printf ( " ファイルが見つかりません。 exit( 1 レ indata . datYn' なお、 exit 関数の第 1 引数には、プログラムの終了コードを入れるのが普通です。そのプログラ ムが正常終了する場合は終了コードを 0 に、エラーで終了する場合は 1 にするのが一般的です。し かし、エラーで終了する場合、く std ⅱ b. h > で定義されているマクロ EXIT-FAILURE を指定すると、 より汎用的になります。なお、正常終了に対するマクロとして EXITSUCCESS が定義されています。 #include く stdlib . h> if ( ()p = fopen ( "indata . dat" printf ( " ファイルが見つかりません。 exit ( EXIT_FAILURE ) : indata . datYn' FILE 型の定義は、共通ヘッダファイル ( stdio. h ) の中に記述されています。 ストリームボインタは、ファイルポインタと呼ばれることがあります。しかし、 UNIX の世界では、ファイルポインタ という言葉を別の意味で使うことがあり、紛らわしいので、本書では、ストリームボインタで統一します。 ファイルからデータを人力する場合の話であり、ファイルヘデータを出力する場合は、そのファイルがなくてもかまい ません。詳細は、 10.6 節を参照してください。 328

8. C言語によるプログラミング 基礎編 第2版

10.2 ファイルからの入力 ファイルからの入力 f 叩 en 関数を使ってファイルをオープンすると、ファイルからデータを人力することができるよ うになります。 C ではデータを人力するために、さまざまな関数が用意されていますが 、こでは ます fscanf 関数を紹介しましよう。 くくプロクラムの形式 > > 10.2 fscanf の一般形 int S ー fscanf ( fp, "%d" &s レ fscanf 関数の第 1 引数には、 f 叩 en 関数の戻り値である、ストリームボインタを指定します。第 2 引数には人力したい文字の書式、第 3 引数には人力したい変数のポインタを指定します。ストリー ムボインタとファイル、そして fscanf 関数との関係を次の図 10.2 に示します。 F 工 LE *fp; fp = fopen ( "indata . dat" 入力したいファイルの位置付け ファイルの情報 ストリーム indata. dat ファイル ファイル情報の入手 fscanf( fp, " 宅 d " ′ &s ) ー 329 指定します。 これには、 fclose 関数を用います。第 1 引数には、 f 叩 en 関数の関数値であるストリームボインタを 始末のための処理を実行します。それは、ファイルを閉じる ( クローズ , close ) , 6 という処理です。 データが 0 になった、すなわち、もうこれ以上データを取り込んで計算する必要がなくなれば、後 ます。これで、実際にテキストファイルよりデータを取り込む方法がわかりました。そして入力 ようです。 fscanf 関数を用いると、ファイルからの人力を自分の好きな書式で読み込むことができ f は、ファイルを扱うという意味です。 C では、ファイルに関する関数は先頭に f が付くことが多い したのと同じような扱いとなります。 fscanf 関数は scanf 関数のファイル版です。 fscanf の頭文字の " % d " ) に従ってデータを人力します。これは、ちょうどキーポードから scanf を用いてデータを人力 fscanf 関数はストリームボインタの示すファイルから、指定されたフォーマット ( この例では ・図 10.2 fopen と fscanf の関係

9. C言語によるプログラミング 基礎編 第2版

10 章ファイル 前回のプログラムでは、人力できるファイルは indata. dat に限られていました。プログラムを工 夫すると、データファイルの名前をキーポードから入力することができます。データファイル名の 入力が可能になると、たとえばプログラムを変更せずに異なる名前のファイル名を扱うことができ るようになります。 f 叩 en 関数で指定したファイル名の部分は、文字配列でも指定できます , ファイル名を指定した入力 7 Cha r Fi1eName [ 16 ] ー この変数 FileName にファイル名をセットします。 ファイル名は、配列の定義で直接 char Fi1eName [ 16 ] "indata . dat" としてもよいし、人力文で scanf ( "%s" ′ Fi1eName ) さを FILENAME-MAX にすると、その処理系で扱える最も長いファイル名に対応することができ の最大の長さを FILENAME ー MAX というマクロで定義しています。したがって、文字配列の大き ファイル名の最大の長さは、処理系によって異なります。そこで、 C ではく stdio. h > にファイル名 どれぐらいの大きさにすればよいでしようか。 た。しかし、一般的にファイル名はもっと長い文字を人力することが可能です。では、文字配列は、 とすることもできます。 こでは、ファイル名を格納する文字配列の大きさを 16 文字と決めまし ますマ 8 char Fi1eName [ F 工 LENAME MAX ] : この scanf 関数は、キーボードからの入力となります。 する一連の手順は、次のようになります。 ファイル名を人力して、それをオ ープン printf( " 入力ファイル名 > > > " レ scanf( " 宅 s " ′ Fi1eName ) : if ( ( fp = fopen ( FileName' NULL ) マ 8 332 この例では、入力できるファイル名は 15 文字までです。 F ⅱ eName[16 ] となっているのは、文字列の最後の \ 0 を入れる ためです。 文字配列の大きさを FILENAME-MAX としても、 scanf 関数では FILENAME-MAX 以上の大きさの文字列を入力すると、 正常に動作しません。

10. C言語によるプログラミング 基礎編 第2版

10.6 ファイルへの出力 ファイルのオープンは人力のときと同様に f 叩 en 関数を用います。書き込みのときには、 f 叩 en 関数の第 2 引数に「書き込み」という意味の "w" を指定します。ただし、 "w" を指定して fopen を 行った場合、もしそのファイルが存在すると、そのファイルの今までの内容が、失われてしまう ( 上書きされる ) ので注意してください。ファイルに追加したい場合は、 10.7 節で説明します。 ( 2 ) ファイルにデータを出力する ( fprintf 関数 ) ファイルにデータを出力するために、 C では、 fprin ば関数を紹介します。 << プログラムの形式 > > 10.4 fprintf の一般形 FILE *fp; int S : 6 fprintf( fp, "%d" ′ s ) : さまざまな関数が用意されていますが、 こでは fprintf 関数は出力したい変数の内容を、フォーマットに従ってファイルに出力します。 fprintf の 339 F 工 LE *fpin, *fpout; int cnt int sum = 0 : 土 n セ va1 : int main ( VOid ) #include く s セ d1 土 b . h > #include く stdio . h> リスト 10.5 テータファイルへの出力 合計 = 2007 平均値 = 167.25 1 行だけです。これ以外の出力は、すべて出力ファイルに対してなされます。 き出すプログラムです。このプログラムが正常に動作した場合に、画面に表示される情報は、次の し、そのデータを、「人力データ > > > 」という見出しを付けて、 out. dat という出力ファイルに書 それでは、リスト 10.5 を紹介しましよう。これは、 indata. dat というファイルからデータを入力 力する際のクローズの処理は特に重要です。この理山は、 co 飛 ebreak10.2 を参照してください。 する処理を忘れると、出力したデータが実際には書き出されていない場合があります。データを出 人力のときと同様に、ファイルをクローズします。データを出力する場合、ファイルをクローズ fclose ( fp ) : ( 3 ) ファイルをクローズする 規則は prin ば関数と同じです。 力したい変数を指定します。 fprintf 関数は printf 関数のファイル版です。したがって、さまざまな 第 1 引数には、ストリームボインタを指定します。第 2 引数にはフォーマットを、第 3 引数には出