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

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

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

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

C++

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

Q&A

解決済

3回答

2278閲覧

C++でC#のMemoryStreamと同様の機能をもつクラスはありますか?

g_uo

総合スコア212

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

C++

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

0グッド

1クリップ

投稿2018/04/16 00:43

質問

C++でC#のMemoryStreamクラスと同様の機能やクラスはありますか?
C++にて可変長バッファを扱うよい方法があればご教示いただきたく、よろしくお願いします。

前提・実現したいこと

C++でバイナリデータの加工を行うメソッドを実装しています。
引数で加工元のデータを渡して、アウトパラメータで加工後のバイナリを受け取ります。
しかしながら、加工後のデータサイズが処理してみるまで分からないため、アウトパラメータ用のバッファを予め確保できません。(加工後のデータは元データより必ず大きくなります)
そこで C# の MemoryStream のようなものがないかどうか調べていたのですが、結局何を使えばいいかわかりませんでした。

C#での処理イメージ

以下のようなコードをC++で実現したいと考えています。

csharp

1 private void EditBinary(FileStream fs, MemoryStream ms) 2 { 3 using (var br = new BinaryReader(fs)) 4 { 5 var binary = br.Read(); 6 // バイナリデータを加工して MemoryStream に書き込む 7 var editted = new byte[1024]; 8 var offset = 0; 9 var cnt = 0; 10 while (true) 11 { 12 ms.Write(editted, offset, 0); 13 break; 14 } 15 } 16 }

C++の関数定義(現状)

FILE*を渡せば、可変長のデータを書き込むことができるだろうと考え、現状以下のような形でコーディングしています。
しかし、加工後のデータをファイルに出力する必要はないため、できればメモリ内で完結させたいです。

C++

1//! @brief バイナリデータを加工します 2/*! 3* @param[in] in 加工元データを格納したファイル 4* @param[out] out 加工後のデータを格納するファイル 5* @return 加工後のデータサイズ 6*/ 7static size_t 8Edit_Binary(FILE* in, FILE* out);

開発環境、その他補足情報

  • OS:Windows 10 Pro 64bit
  • IDE:Visual Studio 2017
  • 言語:VC++

C++の経験は浅く理解が乏しい部分がありますが、どうぞよろしくお願いします。
不足情報ございましたらご指摘願います。

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

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

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

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

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

guest

回答3

0

ベストアンサー

std::ostringstream でよくね?
出力先がstringなストリームです。
かたっぱしから << し、最後に str() するとぜーんぶつながった string が得られます。

投稿2018/04/16 00:48

episteme

総合スコア16614

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

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

g_uo

2018/04/16 00:59

加工後のデータもバイナリなんですが、stringのストリームに吐き出しても、バイナリに復元できるんでしょうか? すみません、ご教示願います。
yohhoy

2018/04/16 01:24

C++標準ライブラリのstringやstringstreamは、バイナリデータも正しく扱えます。 (より正確には、途中に'\0'を含む文字列データであっても扱えるため、結果的にいわゆるバイナリデータであっても問題が生じません)
g_uo

2018/04/16 01:35

コメントありがとうございます。
guest

0

「C++ 動的配列」でぐぐってみましょう

投稿2018/04/16 00:51

y_waiwai

総合スコア87747

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

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

g_uo

2018/04/16 01:02 編集

ありがとうございます。 std::vectorを使用したとして、vectorのキャパを超えないようにするためにはどうすればよいのでしょうか?
y_waiwai

2018/04/16 01:13

vectorのキャパを超えそうになったらもう一つ使うなりすれば。 って、C#でMemoryStreamのキャパ心配するようなもんで、実質無駄なんでは。
g_uo

2018/04/16 01:21

確かにそうですね。 vectorのキャパを勝手に気にしすぎていたようです。 すみません、私の誤解です。
y_waiwai

2018/04/16 01:28 編集

いろいろやってみてください。
g_uo

2018/04/16 01:34

丁寧にありがとうございました。
guest

0

加工後のデータもバイナリなんですが、stringのストリームに吐き出しても、バイナリに復元できるんでしょうか?

無問題...かどうかテスト:

C++

1#include <iostream> 2#include <string> 3#include <sstream> 4using namespace std; 5 6int main() { 7 ostringstream stream; 8 // 0x00~0xff をstreamに叩き込む 9 for ( int i = 0; i < 256; ++i ) { 10 stream << char(i); 11 } 12 string result = stream.str(); 13 cout << result.size() << endl; 14 for ( int i = 0; i < 256; ++i ) { 15 if ( result[i] != char(i) ) { cout << "oops!\n"; return -1; } 16 } 17 cout << "ok!" << endl; 18} 19 20/* 実行結果 21256 22ok! 23*/

投稿2018/04/16 01:10

episteme

総合スコア16614

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

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

g_uo

2018/04/16 01:24

具体的で助かります。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問