本項ではデータを保持することはせず、先ずは1行ずつ全てのデータを読み込むことを目指しましょう。
CgsTriangle クラスの役割は開いたファイルから三角形データを読み込んで値を保持する事です。
1. ファイルストリームを引数に渡してテキストファイルを読み込むメソッドを宣言します。
【CgsTriangle.h】
class CgsTriangle
{
public:
CgsTriangle() {}
const CgsVector& GetNormal() const { return m_cvNormal; }
const CgsPoint& GetPoint(const unsigned int n) const { return m_cpPoints[n]; }
bool ReadText(std::wifstream& ifs);
private:
CgsVector m_cvNormal;
CgsPoint m_cpPoints[3];
};
2. ファイルストリームを引数に渡してテキストファイルを読み込むメソッドを定義します。
先ずはファイルを1行ずつファイルを読み込んでみましょう。
【CgsTriangle.cpp】
#include "pch.h"
#include "CgsTriangle.h"
bool CgsTriangle::ReadText(std::wifstream& ifs)
{
// ファイルを1行ずつ読み込む
std::wstring str;
while (std::getline(ifs, str)) {
}
return false;
}
[ファイル(F)]-[開く(O)...] メニューを選択し、ファイル選択ダイアログで STL ファイルを選択された後の処理を追加します。【補足:vector】
【CgsTriangle.cpp】
bool CgsTriangles::ReadText(const std::wstring& path)
{
/* 長くなるので一部省略、ここより上は変更なし */
// 任意文字列を含む先頭行の読み飛ばし
std::wstring str;
std::getline(ifs, str);
if (str.find(_T("solid")) != 0) {
return false;
}
// 三角形データ読み込み
CgsTriangle tri;
while (tri.ReadText(ifs)) {
push_back(tri);
}
// ファイルを閉じる
ifs.close();
return !empty();
}
正しくファイルを開いて1行ずつファイルが読込めているか確認してみましょう。
bool CgsTriangle::ReadText(std::wifstream& ifs) メソッドの std::getline(ifs, str); 行の後にブレイクポイントを設定してメニューの [デバッグ(D)]-[デバッグの開始(S)] を実行して「house.stl」を読み込んでみましょう。下図の様に2行目の文字列が読み込まれ、F5キーを押下する毎に次の行が読み込まれていくでしょう。