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

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

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

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

Q&A

解決済

1回答

1336閲覧

C++で出力形式の整形について

amuzac

総合スコア14

C++

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

0グッド

1クリップ

投稿2014/11/26 11:12

C++でvectorなどで保持したテキストデータを表形式のように整形して出力したいのですが、SQLのselect文の結果のように、列幅など自動で最大の幅に整形できないでしょうか?

イメージ:
項目1 項目2 項目3 項目4 項目5
1 0.122 1.25 test test test hogehoge
2 1.1 1.00 test hoge
3 1.0 2.00 A foo

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

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

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

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

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

guest

回答1

0

ベストアンサー

全件なめて最大幅を得てから、出力幅を指定しながら出力するしかないのではないでしょうか?

投稿2014/11/27 00:26

TaMaMhyu

総合スコア1356

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

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

amuzac

2014/11/27 02:31

コメントありがとうございます。 やはり一度最大幅を調べないとだめですかね。 SQLのselect文の結果などは最大幅で調整して綺麗に出力されているので、同じようなことが簡単にできる仕組みがあればと思ったのですが。
TaMaMhyu

2014/11/27 02:32

探せばライブラリはあるかもしれませんが、内部的にはそうしているはずです。
TaMaMhyu

2014/11/27 02:35

SQLの場合は集計の関数で最大を取る方法が用意されているはずなので、比較的簡単にできるのだと思います。
TaMaMhyu

2014/11/27 02:42

最大幅自体はmax_elementなどで取れるかもしれません。
amuzac

2014/11/27 03:04

どうもありがとうございます。 以下のようなイメージですかね。 1.各カラムの最大幅(項目1~項目5)を求める 2.最大幅でフォーマット文を作る  CString strOutput ;  strOutput.Format("%*s %*s %*s %*s %*s\n", 項目1最大幅, 項目1の値, 項目2最大幅, 項目2の値, 項目3最大幅, 項目3の値, 項目4最大幅, 項目4の値, 項目5最大幅, 項目5の値) ; 3.出力 関数化してみます。
TaMaMhyu

2014/11/27 05:02

そうですね。そんなイメージだと思います。 インメモリデータベースに一度入れて、SQLで集計してみるという手法もありかもしれません。無駄が多いかもしれませんが。
amuzac

2014/11/28 00:02

確かに一度DBに入れて、集計にかけてみるのも良いと思います。 アドバイスありがとうございました。
amuzac

2014/11/28 02:08

(解決済みにしてしまったのですが) ちょっと簡単に試してみたんですが、フォーマット文の文字幅指定ってマルチバイトの場合に上手く幅が合わせられませんでした。何かお知恵ございませんでしょうか? 以下、cygwinのg++で試してみました。 #include <stdio.h> #include <map> #include <vector> #include <string> using namespace std; int main(int argc, char* argv[]) { vector<vector<string> > vecOutput; vector<string> vec1; vec1.push_back("項目1"); vec1.push_back("項目2"); vec1.push_back("項目3"); vec1.push_back("項目4"); vec1.push_back("項目5"); /* vec1.push_back("item1"); vec1.push_back("item2"); vec1.push_back("item3"); vec1.push_back("item4"); vec1.push_back("item5"); */ vector<string> vec2; vec2.push_back("1"); vec2.push_back("0.122"); vec2.push_back("1.25"); vec2.push_back("test test test"); vec2.push_back("hoge"); vector<string> vec3; vec3.push_back("2"); vec3.push_back("1.1"); vec3.push_back("1.00"); vec3.push_back("test"); vec3.push_back("hogehoge"); vector<string> vec4; vec4.push_back("3"); vec4.push_back("1.0"); vec4.push_back("2.0"); vec4.push_back("A"); vec4.push_back("foo"); vecOutput.push_back(vec1); vecOutput.push_back(vec2); vecOutput.push_back(vec3); vecOutput.push_back(vec4); int max[5] = {}; for(int i=0; i<vecOutput.size(); i++){ for(int j=0; j<vecOutput[i].size(); j++){ if(max[j] < vecOutput[i][j].length()) { max[j] = vecOutput[i][j].length(); } } } for(int i=0; i<vecOutput.size(); i++){ for(int j=0; j<vecOutput[i].size(); j++){ printf(" %*s ", max[j], vecOutput[i][j].c_str()); } printf("\n"); } return 0; }
TaMaMhyu

2014/11/28 02:40

文字コードは何になっているでしょうか? Unicode系の場合、文字情報として幅があるらしいので、Unicode系のライブラリ(C言語のものになってしまうかもしれませんが)などで取得して計算が必要かもしれません。
amuzac

2014/11/28 02:53

情報不足ですみません。 試したのはutf-8です。 ただし、組み込みたいプログラムはVS2010&SJISなので、その場合はまた対応を考えないとダメですかね。
amuzac

2014/11/28 04:01

度々、すみません。 VS2010&SJISでやってみたら、上手くできました。 uft-8の際の対応方法は別途調査しておく必要がありますが、とりあえずやりたいことができました。 ご丁寧にアドバイスありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問