2009年12月25日

[mysql 15122] Re: バイナリデータの取り込みについて

chisa@夜勤明けです。

少し細かいのとMYSQLから少し外れてしまうですが・・・

> CString sPath1("G:\\file1.***"); // 読込元のファイル
> CString sPath2("G:\\file2.***"); // 保存先のファイル
> char pD[100000]; // ファイルの読み書き用
↑ハードコーディングすると後で死ぬ思いするかも。


>
> // ファイルの取得(読込モード)
> fopen_s(&pStream, sPath1, "rb");
> int n = fread(pD, sizeof(char), sizeof(pD), pStream); fclose(pStream);
↑読み込みファイルサイズがpDを超えた部分は切り捨てられるよ。
 Cチックに書くと
 char *pD = NULL;
 FILE *fp = NULL;
fopen節
if(!fp)〜でエラー処理
fseek(fp, 0L, SEEK_END);
int Length = (int)ftell(fp);
pD = (*char)malloc(sizeof(char) * Length);
 if(pD == NULL)〜でエラー処理
fseek(fp, 0L, SEEK_SET);
fread(fp, Length, sizeof(char), fp);
fclose(fp);
処理
free(pD);
pD = NULL;
といった具合に動的にメモリ確保した方がよいかも(端折りかつうろ覚えだからちゃ
んと調べてね)

> // char への変換
> pD == "";
↑警告出ませんでしたか?
仮にpDに""を代入したい場合、C/C++でコレは通用しません。Cだとmemsetとかが一般
的かな。

> strcpy(pD, sSqlData);
↑皆様の仰るとおり\0の手前までしかコピーしてくれません。
バイナリの場合はCだとmemcpyを用いるのが一般的かな。

Insert文を作成している部分が抜けていますが、
作成前にバイナリファイルをエスケープする必要があります。
↑にも書いてありますが、文字列は\0で終端を判定しています。
検索すればすぐ出てくるので調べてみて下さい。

Selectの処理も抜けているようですが、
insertと似たように配列をそのまま文字列としてコピーすると\0迄しか取ってくれま
せん。
コレの対処法もマニュアルに記載されているので検索してみて下さい。

C/C++は頭が良すぎる言語なので書いたこと以外実行してくれません。
エラー処理もしてくれません。突然落ちます。最悪OSが壊れて起動しないと言うこと
もあるそうです。
基本は0エラー0警告でコンパイルが終了することです。
送って頂いたソースが原文のままでしたら後で泣きを見ること間違い無しなので
今一度基礎をしっかり作り上げる事をお勧めするです。

無理にバイナリとして格納する必要性があるか考察の余地はあると思います。
C/C++だとテキストエンコーディング処理挟んでも体感速度は変わらないと感じま
す。

以上


--
Chisa
Mail:admin@xxxxx
Web http://chisa.dtdns.net

投稿者 xml-rpc : 2009年12月25日 01:59
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/91688
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。