変数をあるだけ読み込む
変数をあるだけ読み込む
といったように、アルファベット1文字の後に数字がいくつか並んだ配列データをアルファベット毎に場合分けして配列の配列に格納したいです。
いくつあるか分からない変数をどのようにして読みとれば全部読みとる事が出来るのでしょうか?
Re: 変数をあるだけ読み込む
すぐ思いつく方法としては、strの内容をchar型の配列(もちろん動的確保でもいい)にコピーしてからstrtokですね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: 変数をあるだけ読み込む
こういう手もあります。
「boost::tokenizerの使い方」
http://homepage2.nifty.com/c-labo/boost_tokenizer.html
【追記】
空白で区切ってあるだけなら、こういう手も使えますね。
「std::string Tips « Stop Making Sense」
http://99blues.dyndns.org/blog/2010/11/ ... ips/#tips6
「boost::tokenizerの使い方」
http://homepage2.nifty.com/c-labo/boost_tokenizer.html
【追記】
空白で区切ってあるだけなら、こういう手も使えますね。
「std::string Tips « Stop Making Sense」
http://99blues.dyndns.org/blog/2010/11/ ... ips/#tips6
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 変数をあるだけ読み込む
while (getline(ifs, str)) {
istringstream iss(str);
char c = 0;
iss >> c;
vector<vector<int> > *m;
if (c == 'v') m = &v_list;
else if (c == 'f') m = &f_list;
else continue;
m->push_back(vector<int>());
typedef istream_iterator<int> t;
copy(t(iss), t(), back_inserter(m->end()[-1]));
}
そちらのほうがよろしいでしょうか?
Re: 変数をあるだけ読み込む
softyaさんのNo.5の「追記」で紹介された方法を応用するのが楽で分かりやすいと思います。
#include <fstream>
#include <sstream>
#include <string>
#include <vector>
#include <map>
#include <iostream>
using namespace std;
int main()
{
map<char, vector<int>> data;
ifstream ifs("data");
string str;
while (getline(ifs, str))
{
istringstream iss(str);
char c;
int x;
iss >> c;
auto& v = data[c];
while (iss >> x)
{
v.push_back(x);
}
}
for (auto elem : data)
{
cout << elem.first << " :";
for (auto num : elem.second)
{
cout << ' ' << num;
}
cout << endl;
}
}