プロが教えるわが家の防犯対策術!

C++ 初心者です。

以下のような半角スペースと+ 又は - の符号付きの数値データファイル"data"を読み込んで2次元配列に収納するプログラムを教えて頂きたいです。
(アンダーバー"_"で、半角スペースを表します)

___-10.2__20.1_
_30.3___________-50.3___
______3.1____-9.2__

なお、C++の参考書に、「通常の配列はあらかじめサイズを決めて作成しなければならないが、vectorにはメモリが許す範囲でいくつでも要素を追加できる」と書いてあり、この点を活かしたプログラムを作成したいので、最初にデータ数を決めないで、データファイルの最後にくるまで読み込めるようなプログラムにしたいです。

プログラム中で、

for 又は while () {
___________for 又は while() {
______________________cout << "n[" << i << "][" << j << "]= " << n[i][j] << endl;
___________}
}

のように記述して以下のように出力されるようにしたいです。

n[0][0]= -10.2
n[0][1]= 20.1
n[1][0]= 30.3
n[1][1]= -50.3
n[2][0]= 3.1
n[2][1]= -9.2

すみませんが、わかる方がいらっしゃいましたら、宜しくお願いします。

A 回答 (3件)

やはり、安直に置き換えるとダメですね。



「配列風」のほうは、こんな感じに修正(出力結果は同じ)
pair を使ったソースも、inner は、while() のループの中で定義した方がいい気がする。


#include <vector>
#include <fstream>
#include <iostream>

int main()
{
std::vector<std::vector<double> > n;

std::ifstream inf("test.txt");

while(1)
{
std::vector<double> inner;
double a;
double b;

inf >> a >> b;
if (inf.eof()) break;

inner.push_back(a);
inner.push_back(b);
n.push_back(inner);
}

for (int i = 0; i < n.size(); i++)
std::cout << "[" << i << "] = " << n[i][0] << ", " << n[i][1] << "\n";

}
    • good
    • 0
この回答へのお礼

すみません、ありがとうございます。
教えて頂いたコードをもとに自分でも幾つか試してみます。

お礼日時:2012/04/29 14:01

例題を見ると、2次元配列というより(2次元配列であるのはその通りですが)


x, y のペアの集まりのような気がします。
この場合、pair の vector というのもありかと思います。
出力結果は、お望みのものとは異なりますが。

----------------------------------------------------------------
#include <vector>
#include <fstream>
#include <iostream>

int main()
{
std::vector<std::pair<double, double> > n;
std::pair<double, double> inner;

std::ifstream inf("test.txt");

while(1)
{
inf >> inner.first >> inner.second;
if (inf.eof()) break;
n.push_back(inner);
}

for (int i = 0; i < n.size(); i++)
std::cout << "[" << i << "] = " << n[i].first << ", " << n[i].second << "\n";

}

----------------------------------------------------------------
配列風にするなら、

#include <vector>
#include <fstream>
#include <iostream>

int main()
{
std::vector<std::vector<double> > n;
std::vector<double> inner;

std::ifstream inf("test.txt");

while(1)
{
inner.clear();

double d;
inf >> d;
inner.push_back(d);
inf >> d;
inner.push_back(d);
if (inf.eof()) break;
n.push_back(inner);
}

for (int i = 0; i < n.size(); i++)
std::cout << "[" << i << "] = " << n[i][0] << ", " << n[i][1] << "\n";

}
    • good
    • 0

dataの中身の文字列を読んで、文字列を解析して数値データ一つのみを文字列として取り出し


n[0][0]から順番に録りだした値をセットする処理を繰り返せばいい
やるべきことは
・ファイルdata読み込み
・文字列解析・数値文字列取り出し
・配列要素設定
の繰り返しです
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。是非検討してみます。

お礼日時:2012/04/29 12:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!