セーブ時とロード時のデータが一致しない(fstream)

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Ma

セーブ時とロード時のデータが一致しない(fstream)

#1

投稿記事 by Ma » 15年前

環境
Visual C++ Express Edition 2008
DX ライブラリ ver. 3.00 e
Windows Vista 64bit


マウスのクリックに合わせて、時間を記録し保存。
起動時にそれをロードして同じタイミングに画面に時間を表示するプログラム。
になる予定だったのですが、ロードすると途中からデータをリードしてくれません。
たとえば、60個ぐらいクリックすると途中で、全部0になってしまいました。

前半のロード部分付近がいけないと思っているのですが、原因究明のお手伝いお願いします
#include "DxLib.h"

#include <deque>
#include <fstream>

using namespace std;

 
typedef struct{
    int x;
    int y;          //座標
    int WheelRotVol;//ホイールの回転量
    unsigned int Button[8];  //ボタンの押した状態
}Mouse_t;
Mouse_t Mouse;
 
int GetHitMouseStateAll_2(Mouse_t *Nezumi){
    if(GetMousePoint( &Nezumi->x, &Nezumi->y ) == -1){ //マウスの位置取得
        return -1;
    }
    int MouseInput=GetMouseInput();    //マウスの押した状態取得
    for(int i=0; i<8; i++){            //マウスのキーは最大8個まで確認出来る
        if( (MouseInput & 1<<i ) != 0 ) Nezumi->Button++;   //押されていたらカウントアップ
        else                            Nezumi->Button = 0; //押されてなかったら0
    }
    Nezumi->WheelRotVol = GetMouseWheelRotVol() ;    //ホイール回転量取得
    return 0;
}
 
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){
    ChangeWindowMode(TRUE);//ウィンドウモード
    if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
    SetMouseDispFlag( TRUE ) ;//マウス表示オン
    int White = GetColor(255,255,255);

	int soundHandle = LoadSoundMem("0.ogg");
	PlaySoundMem(soundHandle,DX_PLAYTYPE_BACK);
	deque<int> push_list;
	ifstream ifs("data.dat");
	deque<int> bullets;

	if(!ifs.fail()){
		int size;
		ifs.read((char*)&size,sizeof(int));
		for(int i = 0; i < size; i++){
			int dat = 0;
			ifs.read((char*)&dat,sizeof(int));//ここで、ロードするdatが途中からおかしくなる。
			bullets.push_back(dat);
			printfDx("read %d  \n",dat);
		}
	}
	int track = 0;
	
    while(ProcessMessage()==0 && ClearDrawScreen()==0 && CheckHitKey(KEY_INPUT_ESCAPE)==0){
          //↑メッセージ処理          ↑画面をクリア        ↑ESCが押されていない
        GetHitMouseStateAll_2(&Mouse);  //マウスの入力状態取得
 
		int pos = GetSoundCurrentTime( soundHandle ) ;
        DrawFormatString(0,0,White,"座標[%d,%d],回転量:%d, 位置 %d",Mouse.x,Mouse.y,Mouse.WheelRotVol,pos);
 
        for(int i=0; i<8; i++){
            DrawFormatString(0, 20+20*i, White, "ボタン%d:%u", i, Mouse.Button);
        }
		
		if(Mouse.Button[0] == 1){
			printfDx("%d\n",pos);
			push_list.push_back(pos);
		}

		if(track < bullets.size() && bullets[track] < pos){
			printfDx("%d  %d\n",pos,bullets[track]);
			track++;
		}


        ScreenFlip();
    }





	ofstream ofs( "data.dat" );

	
	int size = push_list.size();
	ofs.write((const char *)&size,sizeof(int));
	for(int i = 0; i < size; i++){
		int data = push_list;
		ofs.write((const char *)&data,sizeof(int));
		printfDx("record %d ",data);
	}
	ScreenFlip();
	WaitKey();


    DxLib_End();
    return 0;
}

Mist

Re:セーブ時とロード時のデータが一致しない(fstream)

#2

投稿記事 by Mist » 15年前

出力時も入力時もファイルをテキストオープンしてるからじゃないでしょうか。
そのため、出力データに改行コード(0x0D (CR))に一致するデータがあるとラインフィールド(0x0A(LF))が追加されておかしなデータになっているように思います。
"ios_base::binary"をつけてバイナリオープンしてみてください。

Ma

Re:セーブ時とロード時のデータが一致しない(fstream)

#3

投稿記事 by Ma » 15年前

>Mist さん
直りました、ありがとうございます。
そういえば、テキスト入出力していましたね。。。

って、前にも同じミスをしていましたorz
いいかげん、覚えるようにします。

閉鎖

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