C++

バイナリファイルから入力を受け付ける手法を学びます。
バイナリファイルとは、あらゆる種類のファイルを指します。
この手法を学ぶことでどのようなファイルのデータでも読み込めるようになります。

Officeソフトはお持ちでしょうか?
もし持っていないのであれば、Apache OpenOfficeをインストールするのをおすすめします。

今回は.csvファイル内のレコードを読み取る手法を学びます。
しかし、この手法は.csv以外にも様々なファイルに応用可能です。
.csvとは、,で区切られたテキストファイルです。
161


160


account.csvファイルをC:\Users\貴方のPCのユーザー名\source\repos\Project1\Project1へ作成しました。これはVisual Studioのバージョンによって配置場所は変わるのでご注意下さい。
筆者の環境はVisual Studio 2017です。Source.cppと同じ場所に配置すればよいです。
163


ここまで読んでパスがよく分からないという方はこのサイトの上の方を見て下さい。http://jamfolder.work/lessonD.cppと書かれているのが見えるでしょうか? これがパスです。試しにLessonDのDをPにしてエンターを押してみて下さい。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
それではコードの説明をしていきましょう。
まず、ファイルを操作する為にはfstreamをインクルードします。この中にはファイル操作の為のクラスが定義されており、C++でのファイル操作は、予め作られたファイル操作クラスを宣言して行います。

ファイル入力を受け付けるクラスはifstreamです。
std::名前空間に定義されています。
コンストラクタには2つの引数を受け付けます。第一引数にはファイルのパスを指定します。第二引数ではそのファイルをどのように扱うかを指定します。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
ファイルオブジェクトには様々な関数が定義されており、その中で最も扱いやすいのがgetlineです。getlineは一行読み込みます。getlineの第一引数には、読み込んだテキストを格納する格納先の先頭アドレスを指定します。配列名はそのままで配列の先頭アドレスを表します。
第一引数の後ろには、最大何文字まで読み込むかを指定します。この文字数より1少ない数に到達した時か、レコードから改行を検出した場合、getlineは読み込みを終了します。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
また、getlineは第三引数を受け取ることもできます。
getlineは第三引数に指定した文字が読み込まれた時も処理を終了できます。つまり、','を指定することで、.csvのデータを1つずつ受け取ることもできます。

166


ちなみに数値データを受け取りたい場合は、数値を.csvの中に書いて、読み出す際に文字列として受け取ります。それをatoiで変換するとよいでしょう。
このエントリーをはてなブックマークに追加

C++でコーディングしていると、関数が長大になることがあります。
そんな関数をクラスに含めていると、クラスの本質であるグループ化がわかりにくくなります。
その関数がプログラマの視界を占有するからです。


OpenningTheBoxのような長い関数は、別の.cppファイルへ記述することもできます。
その場合、OpenningTheBoxをプロトタイプ宣言と定義へ分け、プロトタイプ宣言のみをクラス内に記述します。

コンストラクタは短いのでそのまま書いた方が分かりやすいと思われる。

ソリューション エクスプローラー→ソースファイルを右クリックし、追加→新しい項目よりOpenningTheBoxを記述するための.cppファイルを作成します。
9



新しい.cppファイルには、BlackBoxクラスを教えてやる必要があります。
BlackBox.hをインクルードしてあげましょう。


関数を記述する際には、その関数がどのクラスに含まれているのかを明示する必要があります。
クラス::関数名 でどのクラスに所属している関数なのかを明示します。


ではmain関数から呼び出して実行してみましょう。

10
このエントリーをはてなブックマークに追加

オブジェクトの配列を宣言する方法は整数型や少数型の配列を宣言する方法と全く同じです。


違う点を1つだけ挙げるとすれば、オブジェクトの配列を初期化するには、クラスにコンストラクタを用意する必要がある点です。
BlackBoxクラスのコンストラクタを改造して、引数を受け取る形にしましょう。


7

ただし、この構文はコンストラクタが引数を1つしか受け取らない場合にのみ使用可能です。また、配列の初期化では初期化子を指定しなければデフォルトでは0で初期化されましたが、オブジェクト配列においてその機能はありません。更に、初期化子を省略することもできません。

コンストラクタにて引数を2つ以上受け取る場合、{};内には初期化子ではなく、コンストラクタを宣言する必要があります。


6

このエントリーをはてなブックマークに追加

改めて紹介する内容ではないかもしれませんが、オブジェクトへのポインタ変数を作成することができます。それは、今までに作成してきた整数型へのポインタ変数などと同じように。

ポインタを介した操作は既にたくさんやってきました。
しかし、オブジェクトへのポインタ変数そのものを宣言する方法は紹介していませんでした。

前回作成したBlackBoxクラスを簡略化し、オブジェクトへのポインタ変数を宣言してみましょう。


5


ご覧のように整数型へのポインタ変数を宣言する時と全く同じです。
このエントリーをはてなブックマークに追加

const修飾子とは、指定した変数が参照専用であることを意味します。
つまり、constを指定した値を変更することはできません。
2


クラス内のメンバ変数を初期化する場合、=でCライクな初期化をするのではなくコンストラクタ関数内で代入して下さい。


なぜクラス内でCライクな初期化ができないかというと、クラスはあくまで抽象的な存在であり、実体を生成するのは宣言するタイミングです。そのタイミングでコンストラクタが呼び出されるので、そこで初めてメモリ領域へ書き込めるようになるわけです。
このエントリーをはてなブックマークに追加

↑このページのトップヘ