1

我正在使用 Visual C++ 2010 开发 MFC 应用程序

我正在读取一个文件的数据,但似乎 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 显示这个:Pos : 6716但第二个显示:get pos: 0

为什么 seekg 不工作?

谢谢

4

1 回答 1

1

问题是它CString.Format()是一个可变参数函数并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 回答