goo blog サービス終了のお知らせ 

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

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

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に変換... | トップ | オブジェクト指向で開発の最... »
最新の画像もっと見る

Weblog」カテゴリの最新記事