合計 昨日 今日

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

[このトピックは解決済みです]

フォーラムルール
フォーラムルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Name: MoNoQLoREATOR
[URL]
ハッカー(103,860 ポイント)
Date: 2013年2月10日(日) 03:40
No: 1
(OFFLINE)

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

fwriteがエラーを返す原因には何が考えられますか?

以下のソースコードは、
[vectorのサイズ(4byte)][0番目の要素][1番目の要素]……
という形式のバイナリファイルが作成されることを期待するコードなのですが、実行してみるとvectorのサイズだけが正常に書き込まれ、それ以外は全く書き込まれませんでした。
コード[C++]: 全て選択
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#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用の書き込みの処理を行っている部分は
コード[C++]: 全て選択
1
2
3
4
5
6
7
        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[i] の処理が終了した直後、何故か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 [ 2013年2月10日(日) 03:48 ], 累計 1 回

Name: みけCAT
[URL]
伝説なるハッカー(675,355 ポイント)
Date: 2013年2月10日(日) 08:35
No: 2
(OFFLINE)

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

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

Name: みけCAT
[URL]
伝説なるハッカー(675,355 ポイント)
Date: 2013年2月10日(日) 08:55
No: 3
(OFFLINE)

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

コード[C++]: 全て選択
1
2
3
4
5
6
        bfile write(const void * req, uint size)
        {
            const bfile & ci = *this;
            ci.write(req, size);
            return *this;
        }

コード[C++]: 全て選択
1
2
3
4
5
6
        template<typename T>
        const bfile operator<< (const T & req) const
        {
            write(req);
            return *this;
        }

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

Name: MoNoQLoREATOR
[URL]
ハッカー(103,860 ポイント)
Date: 2013年2月10日(日) 19:48
No: 4
(OFFLINE)

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

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

Name: みけCAT
[URL]
伝説なるハッカー(675,355 ポイント)
Date: 2013年2月10日(日) 21:44
No: 5
(OFFLINE)

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

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

Name: MoNoQLoREATOR
[URL]
ハッカー(103,860 ポイント)
Date: 2013年2月11日(月) 08:41
No: 6
(OFFLINE)

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

[解決!]

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


Return to C言語何でも質問掲示板

オンラインデータ

このフォーラムを閲覧中のユーザー: なし & ゲスト[23人]

loading