トップページ > 記事閲覧
暗号化したテキストファイルを直接読み込みたい
名前:Tir 日時: 2016/05/26 23:54

お世話になります。 今まで暗号化したテキストファイルの文章を読み込む時に 読み込んだファイルをデコードして一時的にテキストファイルに出力し、 出力したファイルから文章を読み込んで最後に出力したファイルを消すという方法で やっていたのですが、一瞬とはいえ負荷がかかる上とてもスマートではないので バイナリからデコードしたデータをそのままファイルを読み込むような形で 直接文章を読み込むような事をするにはどうしたらいいでしょうか?
メンテ

Page: 1 |

Re: 暗号化したテキストファイルを直接読み込みたい ( No.1 )
名前:Nameless 日時:2016/05/28 19:35

文字列から数値に変換するためにファイルに書き出しているのでしょうか? もしそうならsscanf関数やatoi関数を使ってみてください。 もし僕が見当はずれなことを言っているようでしたら、 なぜ直接入力を受け取る変数にコピーするのではなくいったんファイルに書き出しているのかを教えて下さい。
メンテ
Re: 暗号化したテキストファイルを直接読み込みたい ( No.2 )
名前:Tir 日時:2016/05/29 15:50

文字列から数値に変換するのではなく暗号化されたファイルを元のファイルに戻すために書き出しています。 暗号化された画像や音声のファイルは読み込んで元のデータに戻した時にメモリから直接 DXライブラリのCreateGraphFromMemやLoadSoundMemByMemImage等の関数でそのまま使用できますが 暗号化されたテキストファイルは元に戻した時にメモリに格納されている状態からどのようにして 文字列を読み込めばいいのか分からず。仕方なくテキストファイルとして出力してから読み込んでいるのです。
メンテ
Re: 暗号化したテキストファイルを直接読み込みたい ( No.3 )
名前:管理人 日時:2016/05/30 00:49

PCは一時的にテキストファイルとして出力したものを使用してもキャッシュが効くのでそんなに 速度が低下したりすることはないと思いますが、確かにスマートかと言えばそうではないですね… 画像をファイルから読み込んだりメモリから読み込んだりする仕組みを FileRead 系にも適用して メモリ上に展開されたファイルのイメージに対して FileRead 系の関数を使用するための関数 FileRead_open_mem を追加しましたので、よろしければこちらをダウンロードしてください m(_ _)m https://dxlib.xsrv.jp/temp/DxLibVCTest.exe // VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.exe // BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_DevCppTest.exe // Dev-C++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.exe // MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい) 追加した関数は以下の通りです // メモリ上に展開されたファイルを開く int FileRead_open_mem( void *FileImage, size_t FileImageSize ) ; 戻ってきたファイルハンドルで FileRead_scanf などを普通のファイルを開いた場合と同じように使うことができます ( 不要になったら FileRead_close で閉じる必要があるのも同じです )
メンテ
Re: 暗号化したテキストファイルを直接読み込みたい ( No.4 )
名前:Tir 日時:2016/05/30 16:34

対応有難うございます。 しかし今までテキストファイルの読み込みはwifstreamのgetline関数とwstringクラスを使用していたのですが 今回wstringが直接使えないためサンプルを参考にしてWCHAR型に変えてみたところ 0x018af170 でハンドルされていない例外が発生しました: 0xC0000005: 場所 0x00000001 に書き込み中にアクセス違反が発生しました。 とエラーが表示され以下の場所で止まるようになりました mov [edi],al ;U - write second byte to destination 文字列の内容はWCHAR read[256]で十分足りると思うのですが… これはメモリ関係のエラーなんでしょうがこのような場合どのように対処すればいいのでしょうか? 以下のプログラムはテキストファイルの//の行と/**/で囲われた以外の行の文章を Spellというコンテナクラスに格納するというものです。なにか問題があるでしょうか? bool StartsWith(wstring s, wstring pattern) { return s.compare(0, pattern.length(), pattern)==0; } bool Coment=false; vector<wstring> Spell; FileHandle=FileRead_open_mem( Buffer, BufferSize ) ; if(FileHandle!=0){ wstring str; WCHAR read[256]; while(FileRead_eof( FileHandle )==0) { int stsize=FileRead_gets( read,256,FileHandle ) ; str=read; if(StartsWith(str,L"//")) continue; if(StartsWith(str,L"/*")) Coment=true; else if(StartsWith(str,L"*/")){ Coment=false; continue; } if(Coment) continue; Spell.push_back(str); } }else{printfDx(L"読み込み失敗");} FileRead_close( FileHandle ) ;
メンテ
Re: 暗号化したテキストファイルを直接読み込みたい ( No.5 )
名前:管理人 日時:2016/05/31 01:25

> しかし今までテキストファイルの読み込みはwifstreamのgetline関数とwstringクラスを使用していたのですが 今まで FileRead_open などは使用されていなかったのですね Unicode版のDXライブラリでは読み込むテキストファイルも Unicode形式である必要がありますが、 その点は問題ないでしょうか? あと、どちらの行でエラーが発生してしまっているかはわかりますでしょうか? ( プログラムがブレイクした状態で VisualStudio で ALTキー を押しながら 7キー を押すと  呼び出し履歴が表示されますので、止まった箇所に辿り着くまでにどのような関数が呼ばれて  いるかを確認することができます ) あと…すみません、 FileRead_open や FileRead_open_mem の戻り値は −1:エラー −1以外:ファイルハンドル となります( リファレンスが古い仕様のままとなっていました orz ) なので if(FileHandle!=0){ こちらの部分は if(FileHandle!=-1){ とするのが正しい処理となります よろしければお試しください m(_ _;m
メンテ
Re: 暗号化したテキストファイルを直接読み込みたい ( No.6 )
名前:Tir 日時:2016/05/31 11:33

試してみたところ履歴は以下の一件だけでした memmove(unsigned char * dst, unsigned char * src, unsigned long count) 行 352 Asm 僕の方でも色々試したところ FileRead_gets( read,256,FileHandle )の所の256の数値を小さくしてみたところエラーで止まることは無くなりました(正常とは言えませんが) 小さくし過ぎるとまた別のエラーが発生したり次の行まで読み込んだりしたりしてしてしまいますが… エラーが発生するタイミングを調べてみたところread[256]に文字がサイズいっぱいに格納されますが 読み込むテキストファイルの残りの文字数がサイズ以下になるとエラーが発生するみたいです。 256の数値を50など小さくした場合も足りなくなるのにエラー落ちはしないので確信はありませんが… (エラー落ちはしないですけど最後の行に謎の文字が追加されます)
メンテ
Re: 暗号化したテキストファイルを直接読み込みたい ( No.7 )
名前:管理人 日時:2016/06/01 01:53

私の手元でも Tirさんの No.4 のコードを使用させていただいて以下のようなプログラムでテストしてみました #include "DxLib.h" #include <vector> using namespace std; bool StartsWith(wstring s, wstring pattern) { return s.compare(0, pattern.length(), pattern)==0; } int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int FileHandle ; int MemFileHandle ; ChangeWindowMode( TRUE ) ; if( DxLib_Init() == -1 ) { return -1; } // ファイルを丸ごとメモリに読み込み FileHandle = FileRead_fullyLoad( L"Test.txt" ) ; if( FileHandle != -1 ) { bool Coment=false; vector<wstring> Spell; // 丸ごと読み込んだメモリ領域を使用して、FileRead_open_mem でファイルを開く MemFileHandle = FileRead_open_mem( FileRead_fullyLoad_getImage( FileHandle ), FileRead_fullyLoad_getSize( FileHandle ) ); if(MemFileHandle!=-1){ wstring str; WCHAR read[256]; while(FileRead_eof( MemFileHandle )==0) { int stsize=FileRead_gets( read,256,MemFileHandle ) ; str=read; if(StartsWith(str,L"//")) continue; if(StartsWith(str,L"/*")) Coment=true; else if(StartsWith(str,L"*/")){ Coment=false; continue; } if(Coment) continue; Spell.push_back(str); } FileRead_close( MemFileHandle ) ; }else{printfDx(L"読み込み失敗");} FileRead_close( FileHandle ) ; } DxLib_End() ; return 0 ; } < Test.txt の内容 ( Unicode( UTF-16 ) で保存しました ) > あいうえお /*かきくけこ */さしすせそ たちつてと なにぬねの が、特にエラーは発生せず、正常に動作しました よろしければ Tirさんの環境でも上記のプログラムが正常に動作するか試してみて頂けないでしょうか? m(_ _)m
メンテ
Re: 暗号化したテキストファイルを直接読み込みたい ( No.8 )
名前:Tir 日時:2016/06/01 09:12

上記のプログラムを試したところ正常に動作しましたが 普段僕が使っているテキストファイルに差し替えて試したところエラーが発生しましたので エラーが発生するテキストファイルをメールにてお送りします
メンテ
Re: 暗号化したテキストファイルを直接読み込みたい ( No.9 )
名前:管理人 日時:2016/06/02 01:47

メールありがとうございます 添付していただいたテキストファイルで私の環境でもエラーが発生しました 調べたところ、メモリ上のファイルデータを扱うプログラムにバグがありました ( メモリの不正なアクセスではデバッガが不正なアクセスと判断できないことがあるので 私が用意したテキストファイルではたまたまエラーと表示されなかったようです ) バグを修正したバージョンをアップしましたので、よろしければお試しください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibVCTest.exe // VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.exe // BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_DevCppTest.exe // Dev-C++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.exe // MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい)
メンテ
Re: 暗号化したテキストファイルを直接読み込みたい ( No.10 )
名前:Tir(解決) 日時:2016/06/02 13:53

対応やバグ修正等重ね重ね有難うございます。 大変お手数おかけしましたが無事テキストファイルが読み込めるようになりました。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存