ウィリアムのいたずらの、まちあるき、たべあるき

ウィリアムのいたずらが、街歩き、食べ物、音楽等の個人的見解を主に書くブログです(たま~にコンピューター関係も)

VC++でのファイルの一気読み、(20日追加)一気書き

2007-08-15 20:21:18 | Weblog

 これも、別にたいした話ではないのだけど、
 あくまでも、自分へのメモとして。

 VC++での、ファイルの一気読み
/*==============================================*/
/*	メソッド名:readTextdataFile	  */
/*	内容:ファイルを読み込む(テキスト用) */
/*	注意:返り値は、呼び出し側で解放してね */
/*	引数:	fname	読み込みファイル	   */
/*	返り値:null	エラー		   */
/*	その他	読み込み内容		   */
/*==============================================*/
unsigned char	*MyUtil::readTextdataFile(char *fname)
{
	FILE* fp;
	unsigned char* data;
	long datasize;

	//	ファイルポインタの取得
	if ( (fp = fopen(fname, "rb"))	==	NULL )
	{
		return	NULL;
	}

	//ファイルの大きさセット
	fseek(fp, 0, SEEK_END);
	datasize = ftell(fp);

	//	領域確保
	data = (unsigned char*)malloc(datasize+1);
	if ( data	==	NULL )
	{
		return NULL;
	}

	//	読み込みます
	fseek(fp, 0, SEEK_SET);
	fread(data, 1, datasize, fp);
	fclose(fp);

	//	最後に0(NULL)をいれとく
	//	バイナリだと、こまっちゃうけど。
	//	なので、テキスト用
	data[datasize]	=	0;

	return	data;

}


最後に0を入れているので、バイナリ用ではなく、
テキスト用(まあ、途中、ファイルサイズも取得するので、
それを返すようにすれば、バイナリ用にはなるけど)

引数がファイル名で、返り値が読み込み結果なので、
呼び出し先で、エリアはフリーすることになる。

ftellを使っているので、よくないかも。。



(20日追加)
一方、一気書きは、こんなかんじ
	if ( (fp = fopen((const char*)fname,"wb"))	==	NULL )
	{
		return	-1;
	}
	fwrite(buf,bufsize,1,fp);
	fclose(fp);

ただし前提として
・fnameにファイル名が入っていて、
・bufが読み込み領域、
・bufsize分読み込むとする
・bufとfnameの領域は、すでに確保されていて、読み込み後、解放するとする。


  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

VC++で、UTF-8からSJISに変換する。

2007-08-15 16:39:31 | Weblog

そんなの簡単ジャン!
MultiByteToWideCharで、UTF-8からUTF16にして
WideCharToMultiByteで、UTF-16からSJISにすればいいだけじゃん。
終了。。

って言う人が多いかとは思うけど、

暗記力の悪いウィリアムのいたずら、
MultiByteToWideCharの引数ってなんだったっけ?
バッファの大きさもとめるのに、0いれるんだっけ(^^;)
と、なってしまうので、

自分へのメモということで、かいてみました。

こんなかんじ
unsigned char	*MyUtil::utf8ToSjis(char *utf8)
{
	wchar_t* utf16 = NULL;

	if ( utf8	==	NULL )
		return	NULL;

	//==============================//
	//	UTF8=>UTF16変換	    //
	//==============================//
	//	まずは、wlenの長さをとる
    	const int wlen = MultiByteToWideChar(CP_UTF8, 0, utf8, -1, NULL, 0);
    	if (!wlen)
	{
		return NULL;
	}

	//	utf16の領域確保
	utf16 = new wchar_t[wlen + 1];
	if ( utf16	==	NULL )
	{
		return NULL;
	}

	//	utf16変換
	if ( MultiByteToWideChar(CP_UTF8, 0, utf8, -1, utf16, wlen) > 0 )
	{
        utf16[wlen] = L'¥0';
	}
	else
	{
		delete utf16;
		return NULL;
	}


	//==============================//
	//	UTF16=>ShiftJIS変換   //
	//==============================//
	//	まずは、長さを取得
	const int mlen = WideCharToMultiByte(CP_ACP,0,utf16,-1,NULL,0," ",NULL);
	if (!mlen)
	{
		delete utf16;
		return NULL;
	}

	//	領域確保
	unsigned char	*sjis = new unsigned char[mlen + 1];
	if ( sjis	==	NULL )
	{
		delete utf16;
		return NULL;
	}

	//	utf16変換
	if ( WideCharToMultiByte(CP_ACP,0,utf16,-1,(LPSTR)sjis,mlen," ",NULL) > 0 )
	{
	        sjis[mlen] = 0;
	}
	else
	{
		delete	utf16;
		delete	sjis;
		return NULL;
	}

	//	あとしまつ
	delete utf16;

	return sjis;
}

(上記< > ¥ は本当は半角です)

MyUtilクラスに、はいるってことにしてます。
引数がutf-8文字列、返り値がNULLだと問題あり、
それ以外の場合はSJIS変換文字列です。
変換文字列が帰ってきた場合、メモリの解放(free)は、呼び出し側でやってくださいね。




  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

サーブレット部分をパターン化、自動生成すると、生産性は上がると思う(4)

2007-08-15 13:51:06 | 開発ネタ

前に書いた話の続き。
 今回は、

(3)画面への出力は
    ・JSPなら、セッションに値を渡す
    ・XMLなら、ハッシュマップに入れている値からとってくる

について




■いままでのところの復習と今回のところ

前々回、前回までのところで、

サーブレットに入ってくる
1.セッションと引数を全部、ハッシュマップに入れる

2.そのハッシュマップをもとに処理を行い、
    処理系なら、処理結果
    検索系なら、検索結果のベクタ(ハッシュマップのレコードが要素)
  をうけとる

3.以降の処理で必要な値は、ハッシュマップから取り出し
  セッションにセット

というところまできました。

今回は、2で受け取った結果や3で入れたセッションを元に、結果を返したり、
次画面に遷移したりします。




■出力のパターン

 出力のパターンとして

 ・画面を表示する(普通のサーブレット)
    サーブレットでgetWriterを使って書き出す
    JSPを呼び出す

 ・XMLを書き出す(WebAPIの場合)
    サーブレットでgetWriterを使って書き出す
    JSPを呼び出す

 とありえます。
 どちらのケースでも、結局、JSPを呼び出すか、直接書くかです。




■JSPのケース

 JSPの場合は、書き出し内容をセッションに入れて(上記の3で入れているが、検索系で、処理結果となる検索結果も必要な場合はそれもセッションに入れて)、JSPのフォワードします。

 受け手のJSPは、セッションからその値を取り出し、セットします。

 この際、XMLの場合は、JSPの先頭に、ページディレクティブ指定として
<%@ page language="java" contentType="text/xml; charset=UTF-8" %>
(< > は本当は半角)が必要です。
なお、FireFoxで、キャラクターセットの指定がしたい場合は、HTMLでも、こんなふうにかきますけど・・

 ということは、
 2の処理を行うところで、セッションに入れる場合は、ハッシュマップにsessionsetというキーで、セッションに入れるべき値をセットするようにして(この場合、検索系でも検索結果のVectorは、そこに入れるようにして、返り値は、intにする)

 3の処理は、sessionsetを取り出して、すべての値をセットするようにして

 ここ(4番目の処理)は、JSPをフォワードするようにすれば、
 (セッションの値を使って、独自処理をするのは、JSP側)

 このサーブレット部分は、名前程度の違いしかないので、自動生成することが可能になってきます。




■サーブレットに書き出すケース

 2で受け取った結果やVector、HashMapには言っている値から出力を作り出します。
 XMLの場合は固定化しているので、処理系用と検索系用のものを用意しておけば汎用に作れます。

 画面の場合には、ここで画面操作が入ってくるので、汎用的にはつくりにくいかも




 で、これをあわせると、具体的にどうなるのかという話に関しては、DBアクセス自動生成のためのトランザクション処理方法とともに「オブジェクト指向で開発の最初から最後までの手順例」
 で、展開していきます。

  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする