Путать с fstream и указателями - PullRequest
1 голос
/ 18 июня 2011

Я хотел бы написать функцию, которая принимает fstream, обрабатывает ее и заполняет информацию в struct, который я предоставляю во втором аргументе.

Моя проблема в том, что я не совсем понимаю, какиспользуйте указатели и потоки при получении ошибок отладки:

Расположение записи о нарушении доступа 0xcccccccc.

Вот основная функция:

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 ) );
        }

    }

}

Можете ли вы сказать мне, что я делаю неправильно ?Я уверен, что я делаю здесь огромные ошибки, так как я только начинающий, и я до сих пор не понимаю, что мне делать, а что не делать с указателями.

Ответы [ 2 ]

3 голосов
/ 18 июня 2011

Вы забыли взять адрес своих полей:

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

[ Кроме того, обратите внимание, что с точки зрения обслуживания лучше сделать sizeof(kfstruct.num_views). Поэтому, если тип изменится, ваш код все равно будет работать. ]

1 голос
/ 18 июня 2011

вместо

( char* ) kfstruct.num_views

использование

( char* ) (&kfstruct.num_views)

аналогично в другом месте.

в противном случае вы пишете в адрес, адрес которого равен VALUE вашего int. Вы этого не хотите. Вы хотите, чтобы адрес был преобразован в char*. Вы берете адрес у оператора '&'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...