C ++ read () из ifstream: без указателей? - PullRequest
2 голосов
/ 17 ноября 2011

Предположим, у меня есть структура и файл с двоичными представлениями этих структур, и я создам функцию / метод для доступа к этим двоичным данным, используя ifstream::read().

Вот пример структуры:

struct MyStruct {
    int x; //Value interested in
    int y; //Value interested in
    int anotherInteger; //Not interested
    double aDouble; //Not interested
}

Как мне сделать функцию (я буду называть ее здесь readData): не использовать указатели при чтении или, если необходимо использовать указатели, куда бы я поместил правильное удаление?

Пока что соответствующая часть моих readData выглядит так:

void readData(int position, int &returnX, int &returnY) {
    ifstream inFile("binaryFile.dat",ios::binary);

    MyStruct *st = new MyStruct[1];

    inFile.seekg(sizeof(MyStruct)*pos);
    inFile.read((char*) st, sizeof(MyStruct));

    returnX = st[0].x;
    returnY = st[0].y;

    //delete [] st goes here?
}

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

Есть идеи, как решить эту проблему?

Ответы [ 3 ]

3 голосов
/ 17 ноября 2011

Почему бы вам не использовать локальную переменную?

void readData(int position, int &returnX, int &returnY) {
    ifstream inFile("binaryFile.dat",ios::binary);
    inFile.seekg(sizeof(MyStruct)*position);

    MyStruct st;    
    inFile.read((char*) &st, sizeof(MyStruct));

    returnX = st.x;
    returnY = st.y;
}

int main() {
    int mainx, mainy;
    readData(0, mainx, mainy);
    return 0;
}

Кроме того, ссылки не могут быть повторно размещены. Поэтому присваивание присваивает значение origional int, переданное вызывающей функцией. returnX и returnY не указывают на локальные переменные. В приведенном выше коде назначение изменяется mainx и mainy.

2 голосов
/ 17 ноября 2011

Проще всего использовать локальную переменную:

void readData(int position, int &returnX, int &returnY) {
    ifstream inFile("binaryFile.dat",ios::binary);

    MyStruct st;

    inFile.seekg(sizeof(MyStruct)*position);
    inFile.read((char*)&st, sizeof(MyStruct));

    returnX = st.x;
    returnY = st.y;
}
0 голосов
/ 17 ноября 2011

delete[] в порядке.Если вы получаете ошибку, это не потому, что значения x и y указывают на то, что больше не существует, поскольку их значения являются целыми числами и ни на что не указывают.

...