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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
MoNoQLoREATOR
記事: 284
登録日時: 13年前
住所: 東京

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

#1

投稿記事 by MoNoQLoREATOR » 11年前

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
となっていれば期待通りの結果です。

よろしくお願いいたします。
最後に編集したユーザー MoNoQLoREATOR on 2013年2月10日(日) 03:48 [ 編集 1 回目 ]

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

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

#2

投稿記事 by みけCAT » 11年前

内容は
05 00 00 00
でした。
Windows Vista Home Premium SP2 32ビット
Intel(R) Core(TM) Duo CPU T8100 @ 2.10GHz
メモリ 4.00GB
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

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

#3

投稿記事 by みけCAT » 11年前

コード:

		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;
		}
ここで参照を返していないのは大丈夫ですか?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
MoNoQLoREATOR
記事: 284
登録日時: 13年前
住所: 東京

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

#4

投稿記事 by MoNoQLoREATOR » 11年前

>>みけCATさん
動作確認までして頂きありがとうございます。
参照を返していない部分は完全に見落としていました。
参照を返すようにすると期待通りの動作を確認することができました。
解決しました。
ありがとうございました。

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

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

#5

投稿記事 by みけCAT » 11年前

解決でしたら、解決チェックをお願いします。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
MoNoQLoREATOR
記事: 284
登録日時: 13年前
住所: 東京

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

#6

投稿記事 by MoNoQLoREATOR » 11年前

すみません、忘れていました。

閉鎖

“C言語何でも質問掲示板” へ戻る