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

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

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

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

1回答

880閲覧

C++でスペース区切りのtxtファイル入力を構造体のvector配列に格納したい

kanimimi

総合スコア0

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2021/11/15 09:50

前提・実現したいこと

C++で別のツールで取得したスペース区切りの.txtファイルを読み取り構造体の配列に格納するクラスと関数の作成をしようとしています.
(そのテキストファイルをsample.txtとします)sample.txtは最初に一行分数字(フレーム数)がありその下にスペース区切りの数字となっています
2068
25 1 -123.927 882.716 -124.805 702.536 -147.31 536.905 88.4983 429.706 283.999 380.195 348.499 353.99 -155.85 181.82 -177.958 148.935 -189.238 -389.626 -212.93 -696.917 -181.122 -763.779(一行分です)
これが2068行分あります.

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

エラーメッセージ

該当のソースコード

C++

1ソースコード

(sample.h)
class sample
{
private:
double time; // 時間[ms]
int clicked; // クリック入力
double head_x; // 頭
double head_y;
・・・
public:
double get_time() { return time; } //テスト
double get_hx() { return head_x; }
void in(std::string filename, sample a[]);
}

(sample.cpp)
void sample::in(std::string filename, sample a[]) {

int i; int frametime; if (auto f_in = std::ifstream(inK)) { f_in >> frametime; for (i = 0; i < frametime; i++) { f_in >> Joints[i].time >> Joints[i].clicked >> Joints[i].head_x >> Joints[i].head_y ・・・

        }

(main.cpp)
#include <string>
#include "sample.h"

#define FRAME_NUM 2068

static std::string filename = "name";
static sample A[FRAME_NUM];

int main(){

A[0].in(filename, A);

std::cout << A[0].get_time() << std::endl;
std::cout << A[1].get_time() << std::endl;
std::cout << A[2].get_time() << std::endl;

std::cout << A[0].get_hx() << std::endl;

return 0;
}

試したこと

このコードで実行した場合
25
61
93
-123.927
と出力されます(成功)
試しにA[1].in(filename, A)やA[500].in(filename, A)と変えて実行してもうまくいきます. (⓵ これはなぜですか?)

⓶ FRAME_NUMを#defineしなくてもファイルから読み取ったframetimeでstd::vector <sample> Aをresize()して用いたいです.
その場合の各関数の仮引数の定義と引数の型が分かりません. 教えてください.

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

wagashi_157

2022/01/02 14:16

Markdownでコードは ```C++ class sample { ... ``` というように書くともっときれいにコードを表示できると思います。質問入力画面にMarkdown記法が載っているのでそれを参考にしてみると良いと思います。
guest

回答1

0

C++

1#include <iostream> 2#include <fstream> 3#include <sstream> 4#include <iterator> 5#include <string> 6#include <vector> 7 8class sample { 9private: 10 double time; // 時間[ms] 11 int clicked; // クリック入力 12 std::vector<std::pair<double,double>> values; 13public: 14 // lineを基にsampleを作る 15 static sample from_string(const std::string& line) { 16 std::istringstream stream(line); 17 sample data; 18 stream >> data.time >> data.clicked; 19 std::pair<double,double> value; 20 while ( stream >> value.first >> value.second ) { 21 data.values.push_back(value); 22 } 23 return data; 24 } 25 void print_to(std::ostream& out) const { 26 out << "time: " << time << "\n" 27 << "clicked: " << clicked << "\n"; 28 for ( const auto& item : values ) { 29 out << "(" << item.first << "," << item.second << ") "; 30 } 31 out << "\n\n"; 32 } 33}; 34 35int main() { 36 std::vector<sample> samples; 37 38 { 39 std::ifstream fstream("sample.txt"); 40 if ( !fstream.is_open() ) return -1; 41 42 std::string line; 43 std::getline(fstream, line); 44 int frames = std::stoi(line); 45 for ( int i = 0; i < frames; ++i ) { 46 std::getline(fstream, line); 47 samples.emplace_back(sample::from_string(line)); 48 } 49 } 50 51 // できたかな? 52 for ( const auto& item : samples ) { 53 item.print_to(std::cout); 54 } 55}

投稿2021/11/15 15:24

episteme

総合スコア16614

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問