初めまして。
C++とDxLibを使用し(vs2015使用)、セーブデータを作成しようとプログラムを組んでいるのですが、
vector<vector<string>>をファイルに出力する方法がわからず困っています。
調べたところ、以下のようにすれば入れ子ではないvectorを出力できることは分かったのですが
vectorの二次元配列の場合はどのようにすればよろしいでしょうか。
不足点等ありましたら申し訳ありませんが、よろしくお願いいたします。
入れ子になったvectorのファイル出力について
Re: 入れ子になったvectorのファイル出力について
「string」が標準ライブラリのstd::stringである場合、このコードでは文字列は出力されないことがあります。texis さんが書きました:調べたところ、以下のようにすれば入れ子ではないvectorを出力できることは分かったのですが
- ここでの「string」とは何ですか?ついでに「vector」とは何ですか?
- 出力を行う目的は何ですか? (「セーブデータを作成」とのことだが、例えばファイルサイズファイルがあるかどうかのみを情報として利用することも考えられる)
よく見たら、要素数×「string」のサイズではなく、サイズ同士を掛けた値の固定サイズのデータを出力しているのですね。
二重ループなどで希望のファイルフォーマットのファイルを出力するプログラムを書いてコンパイルし、必要に応じてテストやデバッグなどをすればいいでしょう。texis さんが書きました:vectorの二次元配列の場合はどのようにすればよろしいでしょうか。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 入れ子になったvectorのファイル出力について
読み込みのことを考えるとバイナリファイルではなく、
テキストファイルにしたほうが良いのではありませんか?
参考になりますか?
テキストファイルにしたほうが良いのではありませんか?
#include <iostream> // cout
#include <fstream> // ofstream, ifstream
#include <sstream> // istringstream
#include <vector> //
#include <string> // getline
using namespace std;
void set(vector<vector<string> >& vvs, string *s, int n)
{
vector<string> vs;
for (int i = 0; i < n; i++)
vs.push_back(s[i]);
vvs.push_back(vs);
}
void print(vector<vector<string> >& vvs)
{
for (int i = 0; i < vvs.size(); i++) {
for (int j = 0; j < vvs[i].size(); j++) {
if (j != 0) cout << ", ";
cout << vvs[i][j];
}
cout << '\n';
}
}
int output(const char *name, vector<vector<string> >& vvs)
{
ofstream ofs(name);
if (!ofs) return 1;
for (int i = 0; i < vvs.size(); i++) {
for (int j = 0; j < vvs[i].size(); j++) {
if (j != 0) ofs << '\t';
ofs << vvs[i][j];
}
ofs << '\n';
}
return 0;
}
int input(const char *name, vector<vector<string> >& vvs)
{
ifstream ifs(name);
if (!ifs) return 1;
string line, field;
while (getline(ifs, line)) {
istringstream iss(line);
vector<string> vs;
while (getline(iss, field, '\t'))
vs.push_back(field);
vvs.push_back(vs);
}
return 0;
}
int main()
{
string a[3][4] = {
{ "abc", "def", "ghi", "jkl" },
{ "mno", "pqr" },
{ "123", "456", "789" },
};
vector<vector<string> > vvs;
set(vvs, a[0], 4);
set(vvs, a[1], 2);
set(vvs, a[2], 3);
cout << "\n--- vss ---\n";
print(vvs);
if (output("test.dat", vvs)) return 1;
vector<vector<string> > vvs2;
if (input("test.dat", vvs2)) return 1;
cout << "\n--- vss2 ---\n";
print(vvs2);
return 0;
}
- purin52002
- 記事: 235
- 登録日時: 7年前
- 連絡を取る:
Re: 入れ子になったvectorのファイル出力について
#include<vector>
#include<string>
#include<algorithm>
#include<fstream>
#include<iterator>
#include<string>
using namespace std;
int main()
{
string vector<vector<string>> data_list;
string file_name;
string delim{","};
ofstream ofs(file_name);
if (!ofs)
{
return -1;
}
auto func = [&](const vector<string> &input)
{
copy(begin(input), end(input), ostream_iterator<string>(ofs, delim ).c_str()));
ofs << endl;
};
for_each(begin(data_list), end(data_list), func);
}
c++初心者を自負しています。
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^
質問者さんには今後私にプログラミングを教えてくれるようにやさしく丁寧に教えるつもりです。ぎぶあんどていく^p^
回答者さんには精一杯感謝します。ぎぶおんりー^p^
Re: 入れ子になったvectorのファイル出力について
皆様ありがとうございます。
かずまさんのコードを参考に組んでみたところ無事に動きましたことをご報告させていただきます。
>みけCATさん
情報が抜けてしまい申し訳ありませんでした。どちらもstd::のつもりでおりました。
保存されている文字列を出力し、ファイルを読み込んだ際復元することが目的でした。
>かずまさん
まさに求めていたコードでした、ありがとうございます。
拝読し、勉強させていただきます。
ファイルの種類ですが、後々暗号化しようと思っていたのでバイナリにしていましたが、
現段階ではテキストファイルにしておいた方が確認もしやすく良さそうですね。
>purin52002さん
このような書き方もあるのですね、勉強になります。
ありがとうございました。
かずまさんのコードを参考に組んでみたところ無事に動きましたことをご報告させていただきます。
>みけCATさん
情報が抜けてしまい申し訳ありませんでした。どちらもstd::のつもりでおりました。
保存されている文字列を出力し、ファイルを読み込んだ際復元することが目的でした。
>かずまさん
まさに求めていたコードでした、ありがとうございます。
拝読し、勉強させていただきます。
ファイルの種類ですが、後々暗号化しようと思っていたのでバイナリにしていましたが、
現段階ではテキストファイルにしておいた方が確認もしやすく良さそうですね。
>purin52002さん
このような書き方もあるのですね、勉強になります。
ありがとうございました。