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

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

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

Microsoft Visual Studio 2010はMicrosoftが提供している統合開発環境(IDE)です。

C++

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

Q&A

解決済

2回答

2944閲覧

メモリ内で大容量データの管理

JanTh1989

総合スコア87

Visual Studio 2010

Microsoft Visual Studio 2010はMicrosoftが提供している統合開発環境(IDE)です。

C++

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

0グッド

0クリップ

投稿2020/01/13 06:57

::SetFilePointerEx()、::ReadFile()、::WriteFile()のような、ポインタ位置(オフセット)指定(バイト数)、読み書きサイズ指定(バイト数)などをしてファイル操作をするような動作をメモリ内で行えないかと考えております。
適したライブラリなどはございませんでしょうか。

以下のような動きを現在実装しております。
①基本データのバイナリファイルを読む。
②仮置きファイルを作り、基本データを書き込む。
③変更箇所ファイルのデータを読み込む(複数あるので、複数ループ)
データ内容
1:基本データのポインタ位置
2:変更データのサイズ
3:変更データ
④変更箇所データの1、2を基に、3のデータを仮置きファイルのデータを上書き。
⑤仮置きファイルデータを読み込んで、最終出力ファイルに出力。

最終出力ファイルは、基本データ以外も出力するものがあるため、仮置きファイルを別途作っています。
ただ、ファイル出力をすることで、処理も遅く、性能が悪いです。
そのため、内部で同様のことを行えないかと考えている次第です。

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

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

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

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

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

guest

回答2

0

メモリマップトファイルという仕組みが適しているかも知れません。
「ファイルマッピング」や「CreateFileMapping()」などのキーワードでググってみてください。例えば

  • ファイルをメモリのように「メモリマップドファイルクラス

http://marupeke296.com/DXCLS_MemoryMappedFile.html

  • ファイルマッピング

http://wisdom.sakura.ne.jp/system/winapi/win32/win150.html

などの解説が分かりやすいでしょうか。
なお、後者のサイトに解説があるように、UnmapViewOfFile()は遅延書き込みするので、FlushViewOfFile()が必要だったかと思います。ご注意ください。

投稿2020/01/13 09:31

編集2020/01/13 09:32
segavvy

総合スコア958

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

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

JanTh1989

2020/01/20 02:47

回答ありがとうございました。 ファイルマッピングというものを知りませんでした。 参考にさせて頂きます。
guest

0

ベストアンサー

ライブラリは知りませんが、全データをvectorに読み込んで適宜編集、でなにか支障があるのでしょうか。
(あるいは、いわゆる「バイナリエディタ」のサンプルプログラムがあると参考になるかも知れません。私は見つけていませんが)

あと、直接は関係ありませんが、変更はファイルの後ろから順に適用していかないと、「ポインタ」の位置がずれることがありますね。あと、変更が重なっていたりしないかの検査も要りそうな気がします。事故時の回復を考えると、操作はオンメモリでやるにしても変更を開始するまえのデータはバックアップファイルとして取っておくのがいいような気がします。

投稿2020/01/13 09:30

thkana

総合スコア7639

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

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

JanTh1989

2020/01/20 02:49

回答ありがとうございます。 データを配列という考えが抜けておりました。 こちらも考慮に入れます。 また、ファイルの後ろから、というのは、助かる情報でした。 ファイル書き込みでなぜかポインタ位置0指定をしたのに、何故か2バイト目に書き込むというよく分からない現象がでておりました。 恐らく、その頂いた情報の現象が起因しているのではないかと思われます。 全体的に、検討、見直しを行うことにします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問