入れ子になったvectorのファイル出力について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
texis

入れ子になったvectorのファイル出力について

#1

投稿記事 by texis » 2年前

初めまして。
C++とDxLibを使用し(vs2015使用)、セーブデータを作成しようとプログラムを組んでいるのですが、
vector<vector<string>>をファイルに出力する方法がわからず困っています。

調べたところ、以下のようにすれば入れ子ではないvectorを出力できることは分かったのですが
vectorの二次元配列の場合はどのようにすればよろしいでしょうか。

コード:

 vector<string> test;
test.push_back("テスト1");
test.push_back("テスト2");
test.push_back("テスト3");

string save = "Save/Data/test.dat";
fstream file(save, ios::binary | ios::out);
file.write((char*)&test[0],  sizeof(test.size()) * sizeof(string));
file.close();
 
不足点等ありましたら申し訳ありませんが、よろしくお願いいたします。

アバター
みけCAT
記事: 6246
登録日時: 9年前
住所: 千葉県
連絡を取る:

Re: 入れ子になったvectorのファイル出力について

#2

投稿記事 by みけCAT » 2年前

texis さんが書きました:調べたところ、以下のようにすれば入れ子ではないvectorを出力できることは分かったのですが
「string」が標準ライブラリのstd::stringである場合、このコードでは文字列は出力されないことがあります。
  • ここでの「string」とは何ですか?ついでに「vector」とは何ですか?
  • 出力を行う目的は何ですか? (「セーブデータを作成」とのことだが、例えばファイルサイズファイルがあるかどうかのみを情報として利用することも考えられる)
【追記】
よく見たら、要素数×「string」のサイズではなく、サイズ同士を掛けた値の固定サイズのデータを出力しているのですね。
texis さんが書きました:vectorの二次元配列の場合はどのようにすればよろしいでしょうか。
二重ループなどで希望のファイルフォーマットのファイルを出力するプログラムを書いてコンパイルし、必要に応じてテストやデバッグなどをすればいいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

かずま

Re: 入れ子になったvectorのファイル出力について

#3

投稿記事 by かずま » 2年前

読み込みのことを考えるとバイナリファイルではなく、
テキストファイルにしたほうが良いのではありませんか?

コード:

#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
登録日時: 2年前
連絡を取る:

Re: 入れ子になったvectorのファイル出力について

#4

投稿記事 by purin52002 » 2年前

コード:

#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^

texis

Re: 入れ子になったvectorのファイル出力について

#5

投稿記事 by texis » 2年前

皆様ありがとうございます。
かずまさんのコードを参考に組んでみたところ無事に動きましたことをご報告させていただきます。

>みけCATさん
情報が抜けてしまい申し訳ありませんでした。どちらもstd::のつもりでおりました。
保存されている文字列を出力し、ファイルを読み込んだ際復元することが目的でした。

>かずまさん
まさに求めていたコードでした、ありがとうございます。
拝読し、勉強させていただきます。
ファイルの種類ですが、後々暗号化しようと思っていたのでバイナリにしていましたが、
現段階ではテキストファイルにしておいた方が確認もしやすく良さそうですね。

>purin52002さん
このような書き方もあるのですね、勉強になります。
ありがとうございました。

返信

“C言語何でも質問掲示板” へ戻る