前提・実現したいこと
前提として、以下画像のようにcsvデータから特定の列の名前を参照してその列の1つ下以降の数値をUE4のBlueprintFunctionLibraryから生成されたVisual Studioのcppファイル内のvector<string>に格納しその中で値を使用できるようにしたいです。
例)”値R”を参照し、vector<string> a = {0.4,0.4,0.47,0.404}というように値を格納
そのためにまずVisualStudioにて下記URLと同じように列番号と行番号を参照して、セルの値を表示ができる確認を行いたいです。
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11116705496?__ysp=Qysr44GnY3N244GL44KJ6aCF55uu5qSc57Si
発生している問題・エラーメッセージ
デバッグすると、以下「該当のソースコード」の「 throw "指定された列が見つかりませんでした"; //指定された列が見つからないときは例外を投げる」でエラーが発生しました。(「該当のソースコード」の★部分)
ハンドルされない例外が 0x00007FFFA161478C で発生しました (csvSearch_test.exe 内): Microsoft C++ の例外: char (メモリの場所 0x00000067B1CFF618)。
該当のソースコード
cpp
1#include <iostream> 2#include <fstream> 3#include <map> 4#include <sstream> 5#include <string> 6#include <vector> 7 8using std::cout; using std::endl; 9using std::ifstream; using std::string; 10using std::getline; using std::istringstream; 11 12/** 13*csvファイルの先頭行から指定された列名の列番号を取得 14*@param fin 15*@param col_name 列名 16*/ 17int get_col(ifstream& fin, string col_name) { 18 string line; //csvの行の文字列 19 getline(fin, line); //先頭行を読み込む 20 string token; //分割したセルの値を格納する変数 21 int col = 0; //処理中の列の列番号 22 istringstream stream(line); //行の文字列をカンマで分割 23 24 while (getline(stream, token, ',')) { 25 if (token == col_name) { 26 return col; //現在の列番号を返す 27 } 28 ++col; 29 } 30 throw "指定された列が見つかりませんでした"; //指定された列が見つからないときは例外を投げる ★ 31} 32 33/** 34*csvファイルから指定された行の文字列を取得する 35*@param fin 36*@param col_row 行番号 37*@return csvファイルの指定された行の文字列 38*/ 39string get_row(ifstream& fin, int row) { 40 int cur_row = 1; //読み込んだ行数。先頭行は読み込み済みだから「1」を初期値に指定 41 string line; //ファイルの行を格納する変数 42 43 while (getline(fin, line)) { //ファイルを1行ずつ読み込む 44 if (cur_row == row) { //指定された行が見つかった 45 return line; //行の文字列を返す 46 } 47 ++cur_row; 48 } 49 throw "指定された行が見つかりませんでした"; //指定された行が見つからないときは例外を投げる 50} 51 52/** 53*csvファイルの行の文字列から指定された列のセルの値を取得する 54*@param line csvファイルの行の文字列 55*@param col 列番号 56*@return csvセルの値 57*/ 58string get_cell(string line, int col) { 59 string token; //分割したセルの値を格納する変数 60 int cur_col = 0; //処理中の列の列番号 61 istringstream stream(line); //行の文字列をカンマで分割 62 63 while (getline(stream, token, ',')) { 64 if (cur_col == col) { //指定されたセルが見つかった 65 return token; //セルの値を返す 66 } 67 ++cur_col; //次のセルへ 68 } 69 throw "指定されたセルが見つかりませんでした"; //指定されたセルが見つからないときは例外を投げる 70} 71 72/** 73*csvファイルから指定したセルの値を取得する 74*@param filename csvファイルのファイル名 75*@param row 行番号 76*@aram col_name 列名 77*/ 78string get_data(string filename, int row, string col_name) { 79 ifstream fin(filename); //ファイルを開く 80 int col = get_col(fin, col_name); //列名に該当する列の列番号を取得 81 string line = get_row(fin, row); //csvファイルの指定された行の文字列を取得 82 return get_cell(line, col); //行の文字列からセルの値を取得 83} 84 85int main() 86{ 87 //try { 88 cout << get_data("C:/csvSeach_test.csv", 1, "日付") << endl; 89 //} 90 //catch (std::out_of_range& exception) { 91 // throw; 92 //} 93 94}
試したこと
調べると例外処理がうまくいっていないということがわかり、throwのあとに例外クラスを入れなければならないというところまではわかりました。
なので、int main内にtry catchを入れ、関数内にthrowの後に「std::out_of_range」や「std::range_error」、「std::runtime_error」を入れてみましたが、それでもエラーになってしまいました。
エラーコードの「c++の例外:」のあとに「std::out_of_range」や「std::range_error」、「std::runtime_error」出てしまい、うまくエラー回避ができない状態です。
補足情報(FW/ツールのバージョンなど)
UE4 ver.4.27.2
VisualStudio 2022
C++も独学で組んでいる初心者のため、お手数ではありますが、丁寧なご説明までいただけましたら大変ありがたいです。
ご不明点等ございましたらご質問頂ければ幸いです。
お手数ですが、よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/02/23 13:00 編集
2022/02/23 22:06
2022/02/24 06:08
2022/02/24 06:36