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
|
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
|
Re: 暗号化したテキストファイルを直接読み込みたい ( No.10 ) |
- 名前:Tir(解決) 日時:2016/06/02 13:53
対応やバグ修正等重ね重ね有難うございます。
大変お手数おかけしましたが無事テキストファイルが読み込めるようになりました。
|