トップページ > 過去ログ > 記事閲覧
FileRead の CopyFile
名前:サンヨ 日時: 2008/05/19 16:57

いつもお世話になっております。 DXアーカイブにはホント助けられてばっかりです。 要望と質問になってしまうかもしれませんがよろしくお願いします。 アーカイブの中のバイナリファイルを名前を変えて他のディレクトリにコピーしたいのですが、 メモリ上にコピーして、違うディレクトリに出力しようとしても、うまくいきません。 エラー処理などは省いていますが、ソースは以下になります。 void *FILE_DATA; fopen_s( &f1 , oFILE_name, "wb" ); SetUseDXArchiveFlag( TRUE ); SetDXArchiveKeyString( KEY ); fFILE = FileRead_open( FILE_name ); FileSize = FileRead_size( FILE_name ); FILE_DATA = malloc( FileSize ); FileRead_read( FILE_DATA , FileSize , fFILE ); File_Num = FileSize / sizeof(void*); FileRead_close( fFILE ); fwrite( FILE_DATA , sizeof(void*) , FileNum , f1 ); どなたか教えていただけないでしょうか。m(_ _)m Win32でいうところの「CopyFile」関数をDXアーカイブで使用できる(「FileRead」関数に実装 )ようにできたら一番なのですが・・・。

Page: 1 |

Re: FileRead の CopyFile ( No.1 )
名前:GPGA 日時:2008/05/19 18:43

>fwrite( FILE_DATA , sizeof(void*) , FileNum , f1 ); fwrite(FILE_DATA, sizeof(char), FileSize, f1); でできませんか?
Re: FileRead の CopyFile ( No.2 )
名前:サンヨ 日時:2008/05/20 09:17

GPGAさん 返答ありがとうございます。 教えていただいた方法なのですが、すでに試したのですが、中身のデータが食い違ってしまうのです・・・。 昨晩、念のためもう一度試してみましたがだめでした。 一行ずつ読み出して、fwriteなどいろいろ試行錯誤してみましたが、なかなかうまくいきません。 引き続き回答募集します。 よろしくお願いします。m(_ _)m ちなみに環境は、 Microsoft Visual C++ 2005 + SDK + DXライブラリ になっています。
Re: FileRead の CopyFile ( No.3 )
名前:Will 日時:2008/05/20 09:58

提示されたソースを見る限り間違いは内容に思います。(実行はしていないけど) 具体的にどう違うのかコピー元のデータとコピー後のデータを提示できませんか? > 一行ずつ読み出して、 バイナリデータに行というのは存在しませんけどね。
Re: FileRead の CopyFile ( No.4 )
名前:サンヨ 日時:2008/05/20 10:47

Willさん 回答ありがとうございます。 たしかにバイナリデータに行はありませんでしたw 調べて一行ということがわかったので、ポインタ格納、出力してみましたけどだめでした・・・(TT) データは、 (正)00 3E 00 3F 00 40 FF FF FF FF FF FF FF FF 00 00 (出)02 07 00 00 00 00 80 82 00 03 81 6A 00 BF 00 02 (正)00 07 00 01 00 01 C5 2B 00 00 00 0E 00 01 D9 C0 (出)00 07 00 01 00 01 B8 05 00 00 00 00 00 01 CD 93 (正)00 00 00 00 00 00 00 00 80 FE 81 00 81 02 81 04 (出)00 BF 00 02 00 00 01 2A 00 0D 00 03 00 02 80 82 のような感じになっています。 ちなみに sizeof( char ) の場合です。 sizeof( void* ) ですと内容が0、つまり0バイトファイルになってしまいます。 引き続きよろしくお願いします。
Re: FileRead の CopyFile ( No.5 )
名前:サンヨ 日時:2008/05/20 10:55

修正です。 File_Num = FileSize / sizeof(void*); 消したままでした。 入れて実行した場合、 (正)00 3E 00 3F 00 40 FF FF FF FF FF FF FF FF 00 00 (出)02 07 00 00 00 00 80 82 00 03 81 6A 00 BF 00 02 (正)00 07 00 01 00 01 C5 2B 00 00 00 0E 00 01 D9 C0 (出)00 07 00 01 00 01 B8 05 00 00 00 00 00 01 CD 93 (正)00 00 00 00 00 00 00 00 80 FE 81 00 81 02 81 04 (出)00 BF 00 02 00 00 01 2A 00 0D 00 03 00 02 80 82 となります。 アーカイバではなく、普通のフォルダでCopyFile関数を使用した場合、きちんと出力なります。 当たり前だと思いますが・・・。 説明ベタですいません。 よろしくお願いします。m(_ _)m
Re: FileRead の CopyFile ( No.6 )
名前: 日時:2008/05/20 11:20

>>sizeof(void*) これは間違いです。。。 sizeof演算子には、不完全型 (型の特定できない式の指定)または、 それらを括弧で括った物を含む式、 もしくはビットフィールドをあらわす式を指定 することはできません。動作として未定義なので 何が起こっても不思議ではありません。 当然void型のサイズは定義されていませんし、 ポインタ型でもその型を特定できないポインタは 指定してはいけません(配列を引数で渡した物などもだめです) とりあえず、いろいろ突っ込みを。。。 上記の通りなので書き出しにこれは使えませんね。 C言語で最小単位を扱う場合、多くはchar型を使用します。 void *FILE_DATA; ↓ char *FILE_DATA; fopen_s( &f1 , oFILE_name, "wb" ); SetUseDXArchiveFlag( TRUE ); SetDXArchiveKeyString( KEY ); fFILE = FileRead_open( FILE_name ); FileSize = FileRead_size( FILE_name ); FILE_DATA = malloc( FileSize ); ↓ //念のためサイズをあわせておく FILE_DATA =(char*)malloc( FileSize*sizeof(char) ); //ここから変です。 //FILE_DATAにはFileSize分読み込んだデータが入っています。 //ここでもサイズは合わせたほうが良いかも。。 FileRead_read( FILE_DATA , FileSize , fFILE ); //下のコードは上記で説明したとおり未定義の //動作で、そもそも読み込んだサイズは //分かっているのだからわざわざ求める必要はありませんね File_Num = FileSize / sizeof(void*); FileRead_close( fFILE ); //File_Numにいくつが入っているか分からない fwrite( FILE_DATA , sizeof(void*) , FileNum , f1 ); ↓ //charをサイズ分書き出す fwrite( FILE_DATA , sizeof(char) , FileSize , f1 );
Re: FileRead の CopyFile ( No.7 )
名前:サンヨ 日時:2008/05/20 14:13

通さん 回答ありがとうございます。 いろいろと勉強になりました。 修正点をなおし、再度見直しをしました。 おかげで、無事うまくいきました。 しかし、FILE_DATAを配列にするとうまくいかないので、エラー判定を勘違いしてるのかもしれません。 見た感じ、デバックで解決できそうなので、独力で何とかしたいと思います。 みなさま本当にありがとうございましたm(_ _)m

Page: 1 |