質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%

Q&A

解決済

1回答

1394閲覧

csvファイルを読み込み、UE4へfloat型もしくは文字列で数値を送る方法

roatt

総合スコア45

0グッド

0クリップ

投稿2022/02/17 12:36

編集2022/02/18 05:16

前提・実現したいこと

csvファイルを読み込み、UE4へfloat型もしくは文字列で数値を送りたいです。
なお、BlueprintFuctionLibraryで関数としてノードになってほしいです。
自分の考えとしては、
①vector<string>をFStringで送付できるようにする
②vector<string>→vector<float>へ変換し、return float(strvec[Count]);でUE4へ送る
なのですが、ネットで調べてみても実現方法がわかりません。

発生している問題・エラーメッセージ

エラー (アクティブ) E0020 "std::string" から "const char *" への適切な変換関数が存在しません エラー (アクティブ) E0165 関数呼び出しの引数が少なすぎます

↑return float(std::strtof(strvec.at(Count21)));の部分でエラーが出ています

該当のソースコード

h

1// Fill out your copyright notice in the Description page of Project Settings. 2 3#pragma once 4 5#include "CoreMinimal.h" 6#include "Kismet/BlueprintFunctionLibrary.h" 7#include "MyBlueprintFunctionLibrary.generated.h" 8 9/** 10 * 11 */ 12UCLASS() 13class UMyBlueprintFunctionLibrary : public UBlueprintFunctionLibrary 14{ 15 GENERATED_BODY() 16 17 UFUNCTION(BlueprintCallable, Category = "MyBPLibrary") 18 static float Csv(const int& Count); 19}

ccp

1// Fill out your copyright notice in the Description page of Project Settings. 2 3 4#include "MyBlueprintFunctionLibrary.h" 5 6#include <fstream> 7#include <iostream> 8#include <vector> 9#include <sstream> 10 11using std::cout; using std::cerr; 12using std::endl; using std::string; 13using std::ifstream; using std::vector; 14using std::ostringstream; using std::istringstream; 15 16vector<string> split(string& input, char delimiter) { 17 istringstream stream(input); 18 string field; 19 vector<string> result; 20 while (std::getline(stream, field, delimiter)) { 21 result.push_back(field); 22 } 23 return result; 24} 25 26float UMyBlueprintFunctionLibrary::Csv(const int& Count) { 27 string filename("csvが入っているデータのpath"); //ファイルのパス指定 28   vector<string> strvec; 29 30 ifstream input_file(filename); //指定したファイルを開く 31 if (!input_file.is_open()) { //ファイルが開かなかったとき 32 cerr << "Cannot open the file - '" << filename << "'" << endl; //コメント表示 33 return EXIT_FAILURE; //プログラムが異常終了したことを表す 34 } 35 36 string line; 37 while (std::getline(input_file, line)) { //csvファイルの最後の行までループを回す 38 strvec = split(line, ','); //カンマ区切りで配列に格納 39 } 40 41 return float(std::strtof(strvec.at(Count))); 42}

試したこと

①stringと書かれたすべてコードをFStringに変えてみる ←うまく反応していたコードが続々とエラーになりました
②strtofでstringからfloatへ変えてみる
どれも失敗しました。

補足情報(FW/ツールのバージョンなど)

UE4:4.27.2
Visual Studio:2022

①vector<string>をFStringで送付できるようにする
②vector<string>→vector<float>へ変換し、return float(strvec[Count]);でUE4へ送る
以外でもこういう方法なら出来るなど小さいことでもよいので、あればアドバイス頂きたいです。

csv読み込みの参考ページは以下URLです。
https://cvtech.cc/readcsv/

C++、UE4、プログラミング初心者のため、お手数ではありますが、丁寧なご説明までいただけたら大変ありがたいです。
ご不明な点等ございましたらご質問頂ければ幸いです。
お手数ではありますが、よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

テストはしてないですが return std::strtof(strvec.at(Count).c_str(), nullptr); ではうまく動かないでしょうか?
とりあえずビルドは通るようになるはずです
ちなみにこのコードはランタイム上で動作してほしいコードなのでしょうか?
(エディタ上ではなくてパッケージ後のバイナリで動作するコードを想定しているか)

投稿2022/02/18 20:42

MMashiro

総合スコア2380

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

roatt

2022/02/21 05:12

ご返信ありがとうございます。 ご紹介いただいた変換方法をVisualStudioに入れ、UE4にてプレイしてみたところ、なぜかcsvの2行目から表示されてしまいます。 また、自分で調べた以下の構文を使うと、今度は1行目のみしか読み取れない問題が発生しております… ↓return float(std::strtof(strvec.at(Count)));の代わり *** vector<float> ChangeData(strvec.size()); std::transform((strvec.begin(), (strvec.end(), ChangeData.begin(), ToFloat()); return float(CangeData[Count]); *** ↓ToFloat()の中身 *** struct ToFloat{ float operator()(string strvec){ return ::atof(strvec.c_str()); } }; *** >ちなみにこのコードはランタイム上で動作してほしいコードなのでしょうか? >(エディタ上ではなくてパッケージ後のバイナリで動作するコードを想定しているか) こちらに関しては、ランタイム上で動作してほしいコードです。
roatt

2022/02/21 05:19

追記です。 MMashiro様のコードでもう一度プレイして確認したところ、string型からfloat型に変換して出力されるのは最終行のみでした。(先ほどはcsvデータが2行までだったので、試しに3行目も作成しプレイしたところ、3行目に入力された数値がUE4へ表示されました)
roatt

2022/02/21 11:28

C++内のみでの確認ですが、Vector<string>には1行目から最終行までの数値が格納されていることがわかりました。 そのため、変換部分で1行目から最終行の1行前まで抜けてしまっている可能性が高いです…
MMashiro

2022/02/21 12:19

strvecに対して直で代入しているためループするたびにstrvecの中身が置き換えられてしまい最後の取得結果しか残ってない状態になっています。 やり方は複数ありますが、strvecに対して代入するのではなくinsertなどでコンテナ同士を結合してみてください while (std::getline(input_file, line)) { //csvファイルの最後の行までループを回す auto splittedVector = split(line, ','); strvec.insert(strvec.end(), splittedVector.begin(), splittedVector.end()); //カンマ区切りで配列に格納 }
roatt

2022/02/22 05:41

ご紹介してくださったコードをいれたところ、1行目から配列に格納することができました! ありがとうございます。 申し訳ありません、追加の質問なのですが、現在「return float(std::strtof(strvec.at(Count)));」で直接値をfloat型にして返すのではなく、一旦vector<float>に変換後、vector.back()にて末尾の要素を参照して返すということを考えています。(csvが自動更新されることになり、最新の値を返したいためです) 昨日のコメントにて試したと申しました下記のtransformを使用し変換をおこなったところ、 ↓return float(std::strtof(strvec.at(Count)));の代わり *** vector<float> ChangeData(strvec.size()); std::transform((strvec.begin(), (strvec.end(), ChangeData.begin(), ToFloat()); return float(CangeData[Count]); *** ↓ToFloat()の中身 *** struct ToFloat{ float operator()(string strvec){ return ::atof(strvec.c_str()); } }; *** csvの中身は↓のようになっているのに、 0.5, 1.0, 1.5, 2.0, 2.5 1.2 3.2 UE4に数値を渡すと 0.5, 1.0, 1.5, 2.0, 2.5 1.2, 0 , 0 , 0 3.2, 0 , 0 , 0 と謎の「0」が読み取られてしまいます。 MMashiro様のreturn文では0.5, 1.0, 1.5, 2.0, 2.5, 1.2, 3.2と出ていたのになぜなのでしょうか?(そもそもfloat型の変換コードが違うためなのでしょうが…) 同じように、strtofを使用しvector<float>へ格納することはできるのでしょうか…? 追加の質問となってしまい申し訳ありませんが、ご教示いただけないでしょうか? よろしくお願いいたします。 長文失礼いたしました。
MMashiro

2022/02/22 06:37

こちらのコード手元だとビルドが通らず確認できませんでした、 コードが正しいかチェックしてみてください。 あとCSVが自動更新されるため…という理由から実際実現したい挙動が想像できなかったため よろしければ新しい質問として建てていただいたほうが回答が得られやすく、情報量も増やせると思います。
roatt

2022/02/23 00:11

ありがとうございます。 では、新しい質問で同様の質問を立てさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問