1

Visual C++ 2010 を使用して MFC アプリケーションを開発しています

1 つのファイルのデータを読み込んでいますが、seekg が機能していないようです

これが私のコードです

//Transaction is a class i have defined before

void displayMessage(CString message)
{
    MessageBox(NULL,message,L"error",MB_OK | MB_ICONERROR);
}

///////////////////////////////
    ifstream input;

    input.open("test.dat" , ios::binary );
    if( input.fail() )
    {
        CString mess;
        mess = strerror( errno );
        mess.Insert(0,L"Error\n");
        displayMessage(mess);
    }

    Transaction myTr(0,myDate,L"",0,0,L""); // creating an object of transaction
    unsigned long position = 0;
    while(input.read( (char *) &myTr , sizeof(Transaction)))
    {
        if(myTr.getType() == 400 )
            position = (unsigned long)input.tellg() - sizeof(Transaction);
    }


    CString m;
    m.Format(L"Pos : %d",position);
    displayMessage(m);

    input.clear();//I also tried removing this line
    input.seekg(position,ios::beg );

    m.Format(L"get pos: %d",input.tellg());
    displayMessage(m);
    input.close();

最初の displayMessage は This を示しています:Pos : 6716しかし 2 番目のものは示しています:get pos: 0

なぜシークが機能しないのですか?

ありがとう

4

1 に答える 1

1

問題はCString.Format()、可変引数関数であり、可変引数引数として渡すことができる型ではない a をbasic_istream::tellg()返すpos_typeため、未定義の動作が発生することです。

取得した位置を に渡したい場合は、キャストするか、一時的な中間変数tellg()CString::Format()入れる必要があります。

    unsigned long new_pos = input.tellg();
    m.Format(L"get pos: %d", new_pos);
于 2013-01-26T19:03:51.227 に答える