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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

C++

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

2406閲覧

C++ CSVファイルを読み込むプログラムのエラー

tsukagon

総合スコア30

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

C++

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/08/10 13:46

こんにちはC++初学者です。以下のことを実現出来るであろうプログラムを書いたのですがエラーの原因が分からないため質問させていただきます。

・やりたいこと
csv形式で保存したファイルを読み込んで構造体型の配列に格納したい

・詳細
①x,y,z(座標)、bx,by,bz(その座標における値)の計6つの値を持つ構造体を定義しました。
②次に、二次元の動的配列クラスvector(2×2)を用意しました。この各配列要素は①の構造体となっています。
二次元配列である理由は、行に複数の異なる座標データを、列に時間データをまとめたいからです。

・発生しているエラー

bash: line 12: 2062 Segmentation fault (core dumped) $file.o

読み込んだCSVファイル

0,0,0,3,4,5,1,1,1,6,7,8 2,2,2,9,10,11,3,3,3,12,13,14

この数字は
x,y,z,bx,by,bz,x,y,z,bx,by,bz
x,y,z,bx,by,bz,x,y,z,bx,by,bz,
に対応している

プログラム

#include<iostream> #include <fstream> #include <string> #include <sstream> #include <vector> #define timestep 2 #define meshnum 2 using namespace std; struct pb{ double x,y,z,bx,by,bz; }; //文字列を格納できるvector型のsplit関数を宣言 vector<string> split(string& input, char delimiter) { istringstream stream(input); string field; vector<string> result; while (getline(stream, field, delimiter)) { result.push_back(field); } return result; } int main() { int i,j=0; //構造体型多次元配列を用意 vector<vector<struct pb>>alldata(2,vector<struct pb>(2)); ifstream ifs("codetest.csv"); string line; while (getline(ifs, line)) { vector<string> strvec = split(line, ',');//1行読み込んでstrvecに格納 for(i=0;i<meshnum;i++){ alldata[j][i].x=stod(strvec.at(6*i)); alldata[j][i].y=stod(strvec.at(6*i+1)); alldata[j][i].z=stod(strvec.at(6*i+2)); alldata[j][i].bx=stod(strvec.at(6*i+3)); alldata[j][i].by=stod(strvec.at(6*i+4)); alldata[j][i].bz=stod(strvec.at(6*i+5)); j++; } } for(j=0;j<timestep;j++){ for(i=0;i<meshnum;i++){ cout<<alldata[j][i].x<<alldata[j][i].y<<alldata[j][i].z<< alldata[j][i].bx<<alldata[j][i].by<<alldata[j][i].bz<<endl; } } return 0; }

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

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

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

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

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

guest

回答1

0

ベストアンサー

C++

1 for(i=0;i<meshnum;i++){ 2 alldata[j][i].x=stod(strvec.at(6*i)); 3 alldata[j][i].y=stod(strvec.at(6*i+1)); 4 alldata[j][i].z=stod(strvec.at(6*i+2)); 5 alldata[j][i].bx=stod(strvec.at(6*i+3)); 6 alldata[j][i].by=stod(strvec.at(6*i+4)); 7 alldata[j][i].bz=stod(strvec.at(6*i+5)); 8 j++; 9 }

2行目を読み込んだ直後、j = 2 となってる。
alldata[j][0] すなわち alldata[2][0] は存在しない。

投稿2021/08/10 14:28

episteme

総合スコア16614

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

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

tsukagon

2021/08/10 15:05

回答ありがとうございます。存在しないものにアクセスしようとしていたのですね。気づきませんでした。 また、j++の位置がおかしかったため修正しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問