编辑:好的,因此在我下面的帖子中提供了一些帮助,我将其编译。我将将文件读入数组的行更改为此:
input->read((char*)( &(zip[i].postalCode) ), sizeof(int ));
input->read((char*)( &junk ), sizeof(int ));
input->read((char*)( &(zip[i].longitude) ), sizeof(double ));
input->read((char*)( &(zip[i].latitude) ), sizeof(double ));
cout << "Currently at position" << input->tellg() << endl;
现在,我将其运行到循环的第一次迭代中,但随后遇到了分段错误。
Currently at position24
Segmentation fault (core dumped)
以下原始帖子:
我又回来了。有一个结构和几个函数:
struct zipType{
int postalCode;
double longitude;
double latitude;
};
void zipToCout(zipType zip){
cout << "Postal Code = " << zip.postalCode << "\tLongitude = " << zip.longitude << "\t\tLatitude = " << zip.latitude << endl;
}
void binRead(zipType *zip[], fstream *input){
int junk;
int count;
int end;
input->seekg(0,ios::end);
end=input->tellg();
count=input->tellg()/24;
input->seekg(0);
while(input->tellg()!=end){
for(int i=0;i<count;i++){
input->read((char*)( &zip[i]->postalCode ), sizeof(int ));
input->read((char*)( &junk ), sizeof(int ));
input->read((char*)( &zip[i]->longitude ), sizeof(double ));
input->read((char*)( &zip[i]->latitude ), sizeof(double ));
cout << "Currently at position" << input->tellg() << endl;
//zipToCout(*zip);
}
}
}
现在在主目录中,我创建了一个
zipType[n]
,其中n是.bin文件中zipType的数量。然后我叫binRead(&testZipType[n],&testFile);
。您可以想象这给了我一些错误。我收到一些与此类似的错误: zipType.cpp:22:32: error: base operand of ‘->’ has non-pointer type ‘zipType’
input->read((char*)( &zip[i]->postalCode ), sizeof(int ));
我需要做的是遍历文件,并将结构的每个部分存储在数组的相应部分。我正在尝试进行尽可能小的更改以使此工作有效。我知道你们中的某些人可以*
最佳答案
我假设zip是一个动态数组。那正确吗?
因此,当您声明数组时,您正在执行以下操作:
zipType* z = new zipType [10];
您的功能binRead应该这样声明:
void binRead(zipType *zip, fstream *input){
调用binRead时,您不需要指针的地址
binRead(&z,input);
相反,您想传递指针z:
binRead(z,input);
在binRead内部,请确保像这样引用zip:
zip[i].postalCode
因为您已经传递了一个指针,所以您对binRead所做的所有更改都将对zip指向的内存进行。
这是一个演示我在说什么的小程序:
#include <iostream>
struct zipType{
int postalCode;
double longitude;
double latitude;
};
void blah(zipType *zip){
for (int i=0;i<10;i++){
std::cout << zip[i].postalCode << std::endl;
}
zip[0].postalCode = 60626;
}
int main(int argc, const char * argv[])
{
zipType* z = new zipType [10];
for(int i=0;i<10;i++){
z[i].longitude = i * 10;
z[i].latitude = i * 5;
z[i].postalCode = i * 6;
}
blah(z);
std::cout << z[0].postalCode;
delete [] z;
}