ページ 11

fwriteがエラーを返す原因について

Posted: 2013年2月10日(日) 03:40
by MoNoQLoREATOR
fwriteがエラーを返す原因には何が考えられますか?

以下のソースコードは、
[vectorのサイズ(4byte)][0番目の要素][1番目の要素]……
という形式のバイナリファイルが作成されることを期待するコードなのですが、実行してみるとvectorのサイズだけが正常に書き込まれ、それ以外は全く書き込まれませんでした。

コード:

#define _CRT_SECURE_NO_DEPRECATE
/*
#include "DxLib.h"
#define FW_DX_DEF_
//*/
#define FW_MAIN_
#define FW_STD_DEF_
//*
#define FW_STD_PROGRAMABLE_DEF_
#define FW_DX_PROGRAMABLE_DEF_
//*/
#include "safe_fireworks/fireworks.h"

int main()
{
	fw::vector<char> chars;
	chars.add(0).add(1).add(2).add(3).add(4);

	fw::bfile("test.dat", true).open().clear().write(chars);

	printf("finish\n");
}
fw名前空間に属する識別子はsafe_fireworks(自作のヘッダファイル群※今回関係ないものは削除済)に定義されています。
fw::vector用の書き込みの処理を行っている部分は

コード:

		template<typename T>
		const bfile & write(const fw::vector<T> & req) const
		{
			*this << req.size();
			for(uint i=0;i<req.size();++i) *this << req[i];
			return *this;
		}
この部分なのですが、forループの初回で最終的にfwriteが呼び出され、0が返されます。
書き込み個数に1を指定したのに0が返ってきたということはエラーが発生したということです。
また、 *this << req の処理が終了した直後、何故かfw::bfile::close()が呼び出され、ファイルハンドルが閉じられてしまいます。
よってそれ以降書き込みが行われません。

fwriteがエラーを返す原因には何が考えられますか?
私では、「ファイルポインタが無効」くらいしか思いつきません。

しかし、vectorのサイズは正しく書き込まれているわけですから、ファイルポインタが無効であるということは無いはずです。
また、私のPCでは今のところ100%の確率でfwriteがエラーを返していますが、他の環境では違うのかもしれません。
よろしければこのプログラムを実行してみて、同じディレクトリに生成されるtest.datの内容をバイナリエディタで確認して頂けないでしょうか?
05 00 00 00 00 01 02 03 04
もしくは
00 00 00 05 00 01 02 03 04
となっていれば期待通りの結果です。

よろしくお願いいたします。

Re: fwriteがエラーを返す原因について

Posted: 2013年2月10日(日) 08:35
by みけCAT
内容は
05 00 00 00
でした。
Windows Vista Home Premium SP2 32ビット
Intel(R) Core(TM) Duo CPU T8100 @ 2.10GHz
メモリ 4.00GB

Re: fwriteがエラーを返す原因について

Posted: 2013年2月10日(日) 08:55
by みけCAT

コード:

		bfile write(const void * req, uint size)
		{
			const bfile & ci = *this;
			ci.write(req, size);
			return *this;
		}

コード:

		template<typename T>
		const bfile operator<< (const T & req) const
		{
			write(req);
			return *this;
		}
ここで参照を返していないのは大丈夫ですか?

Re: fwriteがエラーを返す原因について

Posted: 2013年2月10日(日) 19:48
by MoNoQLoREATOR
>>みけCATさん
動作確認までして頂きありがとうございます。
参照を返していない部分は完全に見落としていました。
参照を返すようにすると期待通りの動作を確認することができました。
解決しました。
ありがとうございました。

Re: fwriteがエラーを返す原因について

Posted: 2013年2月10日(日) 21:44
by みけCAT
解決でしたら、解決チェックをお願いします。

Re: fwriteがエラーを返す原因について

Posted: 2013年2月11日(月) 08:41
by MoNoQLoREATOR
すみません、忘れていました。