假设我有一个结构和一个包含这些结构的二进制表示的文件,我将创建一个使用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的值指向不再存在的东西。
关于如何解决这个问题的任何想法?
答案 0 :(得分:3)
为什么不使用局部变量?
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
。
答案 1 :(得分:2)
使用局部变量的简单方法是:
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;
}
答案 2 :(得分:-1)
delete[]
没问题。如果你得到一个错误,那不是因为x和y的值指向不再存在的东西,因为它们的值只是整数并且没有指向任何东西。