カテゴリー
C++

ファイルの操作について知ろう

この章ではファイルの取り扱い方法について学習します。
これまではprintf関数などを使って、文字列や計算結果を画面に出力していましたが、その処理が終われば、データは失われてしまいます。
そこで、そのようなデータはファイルに保存しておけば後で確認したい時に便利です。
ではファイルの取り扱いの流れを説明します。
(1) ファイルをオープンします
(2)ファイルの読み書きをします
(3)ファイルをクローズします
では例をみてみましょう。11 1次にファイルをオープンするのですが、それにはfopen関数を使います。
fopen関数を実行すると、ファイル情報を持つFILE型のポインタ(ファイルポインタといいます)が返されますので、先ほどのファイル構造体の変数に代入します。1 以下のようにFILE構造体の宣言とfopen関数の代入を分けて書くこともできます。1 「オープンモード」はどのような状態でファイルをオープンするのかをアルファベットで指定します。以下の表を参考にしてください。1111
この例では”w”を使っていますが、このモードを使うとファイルの中身を上書きして、ファイルがない時は新規作成してくれます。
wモードであればこの例の「net.txt」と言うファイルが自身のフォルダに無くても、自動的に作ってくれます。1 fprintf関数はファイルポインタで指定したファイルに変換指定文字を使ってデータを書き込みます。11 この例では以下の箇所がfprintf関数の箇所です。1 この意味はdouble型のiを変換指定文字1の通りにファイルに書き込んでいます。1 次に残りのプログラムの説明します。1 NULLと言う見慣れない文字がありますが、ファイルが何らかの理由でオープンできなかった時にfopen関数がこのNULLを返します。
「fp ==NULL」はfpがNULLならば1を出力してプログラムを終了します。
「exit(1)」はexit関数を使用していますが、引数に1を使用すると異常終了という意味になり、ファイルが開かなかった時はプログラムを終了します。
ファイルが正常に開けば「net.txt」には変数iの値である8.1が入力されます。
次の例ではscanfで読み込んだデータをファイルに書き込みます。11 では説明を始めます。1 while文の中にEOFという箇所がありますが、これはキーボードで1を押すと返される値です(whileの条件式を2行で書いていますが、1行で書いていただいても結構です)。
EOFの前に「!」が付いているので、1が押されない間は入力する行為を繰り返すという意味になります。
気を付けることは以下のfprintf関数の変換指定子の箇所に「-6」という箇所がありますが、マイナス指定をするとファイルの中のデータを左詰めにするという意味になります。ファイルに書き込むときには左詰めで入力するのが基本です。11 左詰めでファイルにデータを入れているので、「net.txt」は以下のようになります。1
次は「net.txt」に書き込んだデータを取り出してみましょう。111 ファイルからデータを読み込むにはfscanf関数を使用します。このfscanf関数は書式指定文字に従ってデータを取り出します。1 この例でfscanfが使われている箇所は以下です。1 ここでもEOFが出てきますが、1の意味はファイルの終端までデータを読み込むと言う意味になります。
読み込む時にはfopen関数のオープンモードは「r」になります。
結果は以下の通りです。1
次の例ではfputs関数を使ってデータをファイルに書き込む方法について説明します。11fputs関数はファイルポインタで指定したファイルへ1行ずつ文字列を出力します。1 結果は以下の通りです。1 注意点としては以下のように改行を入れないと1行でファイルに書き込まれるので気を付けてください。もちろん、初めから1行で書き込む意図があるのならば改行は入れる必要はありません。1 結果は以下の通りです。1 次の例は「net.txt」に書き込んだテキストファイルから指定した文字数を読み込むプログラムです。11 ファイルから指定した文字を読み込むにはfgets関数が必要です。1 fgetsはファイルポインタで指定したファイルから、指定した文字の数だけを読み込んで、配列に代入します。そして、読み取るものが無くなるとNULLを返すので、NULLになったらwhile文を終了します。
読み取るときのオープンモードは1を指定してください。1 次の例は「net.txt」に書き込んだテキストファイルから1文字ずつ読み込むプログラムです。11 fgetc関数はファイルポインタで指定したファイルから1文字読み取ります。1 この例では以下の箇所がfgetc関数が使われている箇所です。1 ここでは読み込んだ1文字をchar型の変数に入れています。
読み込みに成功すると、その読み込んだ1文字を返し、ファイルの終わりまで読んだ場合は、EOFを返します。ここでは最後にEOFが返された時にループを終了します。
putcharは1文字ずつ出力する機能があります。
11

カテゴリー
C++

ユーザーに文字を入力させる方法

この章ではユーザーにキーボードから入力させる方法について説明します。
この方法もC言語で使われていますがC++でも使えるので説明をします。
では例をみてみましょう。1 1gets(配列名);は文字列と文字列の間に空白を入れることが出来ます。
例えば,「dog cats」のようにdog とcatsの間に空白を入れて複数入力することが出来ます。
例えば以下のように出力されます。1 この後に説明するscanfでは1のように空白を文字列に入れることはできません。
scanfについては説明しましたが、復習のつもりでもう一度説明します。
scanfはエンターキーを押すまで入力することが可能になります。
では例をみてみましょう。1 結果は以下の通りです。11 1111scanfの中の文字を入れる配列は複数書くことが出来ます。
この例ではxとsの2つを設定しています。
その場合にはそれぞれの配列をカンマで区切ります。1 結果は以下の通りです。1 もう一つユーザーにキーボードから入力させる方法があります。1 入力演算子「>>」を使うことでもユーザーにキーボードからの入力をさせることが出来ます。1 ユーザーが入力したデータは1の中の変数nに入ります。
その後、1で変数nを出力しています。

カテゴリー
C++

scanf関数ついて知ろう

この章ではscanf関数について説明します。
scanf関数はC言語で使われている関数ですがC++でも使えるので紹介します。
scanf関数はユーザーがキーボードから入力したデータを取得するための関数です。
例えば「あなたの年齢は?」と質問するとプログラムはユーザーが入力するまで待ちます。
そして、この入力された年齢をプログラムに取り込むことが出来ます。
では例をみてみましょう。11 ユーザーが入力したデータを入れるための変数の宣言をします。
年齢を入力するので、型はintにします。1 「年齢は?」を出力します。1 scanf関数はユーザーが年齢を入力してくれるのを待ちますので、一回プログラムが止まります。
そして、例えばユーザーが23と入力したのならば、その23がaに入ります。
scanfもprintfと同じように変換指定子を指定します。
例の場合は整数なので1を指定しています。
ここで注意してほしいことはscanfの中の変数の前に「&」を付けてください。1 結果は以下の通りです。111 結果は以下の通りです。1

カテゴリー
C言語

構造体について知ろう

この章では構造体について説明します。
「構造体」はバラバラの異なる型のデータを持つ変数同士を1つの型として扱うことができます。
それに対して配列は単一のデータ型しかまとめて扱う事はできません。
例えば、学生の情報を扱いたい場合に
「成績はint型」
「身長はdouble型」
「名前はchar型」
など様々なデータ型なので配列では扱うことが出来ません。
このような時に構造体を使います。
では例をみてみましょう。111 構造体の作り方は最初に「構造体の宣言」を以下のように書きます。1 この例では以下の部分が「構造体の宣言」です。1 構造体型を宣言する時はstructを使います。構造体型の名前は自由に付けてください。
そしてstructのブロックの中にメンバ(変数や配列)の宣言をして、終わりに1を付けます。
メンバとは変数や配列の別名だと思ってください。
構造体の宣言は「関数の外」で宣言するとその場所から下のプログラムのすべてで使うことが出来ますが、関数の中で宣言すると関数の中でのみ使うことが出来ます。
構造体型を宣言した後は「構造体型に属する変数」を作ります。
構造体型の変数も普通の変数と同じように変数の宣言と値の代入をしなくてはいけません。
以下の基本構文が構造体型変数の宣言と初期化です。1 この例では以下の箇所が構造体型変数の宣言と初期化です。1 {1,18,”koike”,170.2}は以下の構造体のメンバに上から順に代入されます。1 つまり、以下のようにデータが代入されます。1 構造体型の配列でも以下の構文でメンバに代入することができます。1 構造体型の配列も通常の配列と同じで宣言と同時に初期化することが出来ます。
例では以下のように書いています。1 ではプログラムの説明に入ります。11 この時、気を付けなくてはいけないのは1の中の要素の書き順は構造体の宣言の中のメンバの順番と合わせてください。
例えば1のような書き方はいけません。111 1例えばint id;のデータを得たい時には1という形式で、1と記述します。
これで1が出力されます。
構造体の配列はfor文で出力しています。1 iには0から2がループするごとに代入されます。111 先ほどの例では構造体型の変数と配列の2つを使いましたが、以下のように構造体型の配列だけ使用しても結果は同じになります。111
次に構造体型の型名を短縮する書き方について説明します。111 今までは構造体を宣言するには1 のように長い型名を書かなくてはいけませんでした。
次の構文で書くと構造体型の型名を省略することが出来ます。
〇構造体型の宣言をする時に構造体型名の前にtypedefを付ける。
〇構造体型の変数や配列を宣言する時に1と書く代わりにどのような名前を使いたいかを決めてブロックの終わりに記述します。
この例では1になります。これはstudentではなくても何でもいいです。1 上のように宣言しましたので以下のようにstructを付けないで宣言と初期化をすることが出来ます。1 この書き方はintなどで宣言するのと同じ感覚で書くことができますので、使いやすいです。

次の例では構造体でのscanfの使い方について説明します。11 scanfの使い方が構造体では違うということではありませんが、scanfと構造体の組み合わせで書けることを覚えておいてください。1 この例では以下の箇所が該当します。1 補足ですが、今までは構造体の変数にデータを入れる場合には以下のように書いていました。1 この例の場合には以下のように構造体の宣言をしてから、scanfでデータを入れています。1
次の例では構造体を関数に渡す方法について説明します。11111 実引数が1のように構造体型変数なので、仮引数も1のように構造体変数で受け取ります。
メンバの値を出力するには1という形式で書きます。11 次のyo関数にはseito2という構造体配列を渡しているので、関数側でも引数には構造体型の配列である1を設置します。1 結果は以下の通りです。1
次の例では構造体型のポインタを使用する方法について説明します。1111 1ここでは構造体型の変数のアドレスを実引数にしてhu関数を呼び出しています。
ですので仮引数では以下の通り構造体型のポインタで受けています。1
ここに見慣れない1という記号がありますが、これはアロー演算子と呼ばれています。
アロー演算子は構造体型のポインタから構造体のメンバに1と、アクセスするために使います。
1 ここでは構造体型の配列のアドレスを引数にしてyo関数を呼び出しています。
1 実引数であるseito2配列をyo関数の中の構造体型のポインタ(仮引数)で受けています。
この構造体型の配列の要素にアクセスするには以下のようにポインタを進めながら書きます。この時にはアロー演算子を使います。1 つまり、iの値がループするごとに進むので、ポインタが示す位置も変わります。

次の例では構造体の配列について説明します。
以下の例ではscanfを使って、入力した値を構造体の配列に入れています。111 構造体の配列は以下のようにブロックの末尾に配列名と要素数を配置します。1 この例では以下のscanfで入力した値をメンバに代入します。
scanfの引数にあるメンバはカンマで区切れば複数書くことができます。
変換指定子もメンバの数だけ書いてください。1111 そして、入力した値をprintfで出力します。1 結果は以下の通りです。1

カテゴリー
C言語

計算プログラムを作ろう

この章では足し算の練習プログラムを作成します。
問題を5問解いて、正解数をカウントします。 111 111
次は初めのfor文の中を説明します。1 =>rand関数は乱数を返します(関数については「関数について知ろう」でします。)。
計算をするのに毎回違う数を使いたいのでrand関数を使います。
具体的には0から32767までの数字の中でランダムな数を返します(詳しくは「switch文で占いを判定しよう」で説明します)。
範囲を限定したい場合には例えば1と書きますと1から6までの中でランダムな数を返すようになります。
この例であれば1から50までのランダムな数を返します(詳しくは「switch文で占いを判定しよう」で説明します)。1
rand関数を使うためには文頭で1と書かなくてはいけませんので注意してください。
では次の箇所の説明をします。1 => number1とnumber2の足し算の文を表示します。
つまり、以下の赤枠の箇所です。1 1 =>答えをinput変数に代入します。
answer[i]=input;
=> scanfで入力した値が入っているinputを配列であるanswerに入れます。
for文で5回繰り返しているので、その都度入力した値が配列に入ります。1 result[i]=number1+number2;
=> number1とnumber2の結果(つまり正解値)をresult配列に代入します。
for文で5回繰り返しているので、その都度正解値が配列に入ります。1
次の箇所の説明をします。1 =>ここでは配列answerに入っている答えと配列resultに入っている答えを比べて、正解ならば変数rightanwerに1を足します。
for文で5回繰り返しているので、その都度答え合わせをして、正解ならば変数rightanwerに1を足します。
結果は以下の通りです。1
実はこの計算プログラムは何回実行しても同じ計算式しか表示されません。
毎回違う計算式を表示させたいのならば、以下の赤枠の記述を付け加えます。
詳しくは「switch文で占いを判定しよう」で説明します。11

カテゴリー
C言語

ユーザーに文字列を入力させる方法

この章ではユーザーにキーボードから入力させる2つの方法について説明します。
ユーザーに文字列を入力してもらう方法は2つあります。
初めにgetsを使った方法について説明します。
では例をみてみましょう。1 初めに入力値を入れる配列をchar型の配列で作成します。
それが以下の箇所です。
char x[100];

次にgetsの引数に先ほど作成した配列を入れます。
それが以下の箇所です。1 この構文でユーザーからの入力を配列で受け取ります
エンターキーを押すまで入力することが可能になります。
gets(配列名);は入力時に文字列と文字列の間に空白を入れることができます。
例えば,「dog cats」のようにdog とcatsの間に空白を入れて複数入力することが出来ます。
結果は以下のように出力されます。1
次はscanfを使った文字入力方法について説明します。1 結果は以下の通りです。1111

カテゴリー
C言語

scanf関数について知ろう

この章ではscanf関数について説明します。
scanf関数はユーザーがキーボードから入力したデータを取得するための関数です。
例えば「あなたの年齢は?」と質問するとプログラムはユーザーが年齢を入力するまで待ちます。
そして、この入力された年齢をプログラムに取り込むことが出来ます。
では例をみてみましょう。1 では説明を始めます。1 =>ユーザーが入力したデータを入れるための変数の宣言をします。
年齢を入力するので、型はintにします。1 =>「年齢は?」を出力します。1 =>scanf 関数はユーザーが年齢を入力してくれるのを待ちますので、一回プログラムが止まります。
そして、例えばユーザーが23と入力したのならば、その23がaに入ります。
scanfもprintfと同じように変換指定子を指定しますが、例の場合は整数を入力するので1を指定しています。
注意してほしいことはscanfの中の変数の前に&を付けることを忘れないでください。
最後に以下の箇所で出力します。11 では例をみてみましょう。1 結果は以下の通りです。1