0

编辑:好的,所以在我下面的帖子的帮助下,我得到了编译。我将将文件读入数组的行更改为:

    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)

原帖如下:

我又回来了。A 有一个结构和几个函数:

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

我需要做的是浏览文件并将结构的每个部分存储在数组的适当部分中。我试图做尽可能少的改变来完成这项工作。我知道你们中的一些人可以 *<@LD(#) 走向荣耀,但我还没有到那里,希望能够阅读我的代码。另外,我需要对数组进行 qsort 以按升序对其进行排序(我还没有尝试过,如果你能在第一部分帮助我,我会自己试一试。)谢谢你的帮助!希望很快我就能在这里回馈一点!

4

3 回答 3

1

我假设 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;
}
于 2013-11-15T03:19:51.620 回答
1

您应该像这样使用带有 & 运算符的括号

&(zip[i]->postalCode)

您正在做的是将 zip[i] 转换为带有语句 &zip[i] 的地址,然后尝试取消引用它。这给了你这个错误。

-多发性硬化症

于 2013-11-15T02:41:15.170 回答
0

使用向量存储数据 - http://www.cplusplus.com/reference/vector/vector/

然后使用排序 - http://www.cplusplus.com/reference/algorithm/sort/

任务完成

于 2013-11-15T02:45:31.317 回答