与fstream和指针混淆

Confused with fstream and pointers

本文关键字:指针 fstream      更新时间:2023-10-16

我想写一个函数,它接受fstream,处理它,并在第二个参数中的struct中填充信息。

我的问题是,当我遇到调试错误时,我很困惑如何使用指针和fstream:

访问违规写入位置0xcccccccccc。

以下是主要功能:

int main()
{
    keyframe_struct kfstruct;
    string ifile = "filename";
    ifstream fin( ifile, ios::binary );
    load_from_keyframe_file( fin, kfstruct );
    fin.close();
    cout << kfstruct.num_keyframes << endl;
    return 0;
}

下面是我试图用来解析二进制文件并填充结构kfstruct中的信息的函数:

struct keyframe_struct
{
    int num_views;
    int num_keyframes;
    vector<keyframe> keyframes;
};
int load_from_keyframe_file( ifstream &fin, keyframe_struct &kfstruct )
{
    char keyword[100];
    while ( !fin.eof() )
    {
        fin.getline( keyword, 100, 0 );
        if ( strcmp( keyword, "views" ) == 0 )
        {
            fin.read(( char* ) kfstruct.num_views, sizeof( int ) );
        }
        else if ( strcmp( keyword, "keyframes" ) == 0 )
        {
            fin.read(( char* ) kfstruct.num_keyframes, sizeof( int ) );
        }
    }
}

你能告诉我我做错了什么吗?我确信我在这里犯了一些巨大的错误,因为我只是一个初学者,我仍然不清楚我应该做什么,不应该用指针做什么。

您忘记获取字段的地址:

fin.read(( char* ) &kfstruct.num_views, sizeof( int ) );
                  ^^^

[顺便说一句,请注意,从维护的角度来看,最好执行sizeof(kfstruct.num_views)。因此,如果类型发生变化,您的代码仍然可以工作。]

而不是

( char* ) kfstruct.num_views

使用

( char* ) (&kfstruct.num_views)

在另一个地方也是如此。

否则,您正在向一个地址等于int值的位置写入。您不希望这样。您希望将地址转换为char*。你用"&"取地址操作人员