C ++ LNK2001:带有Struct Array的未解析的外部符号

时间:2015-10-29 14:08:05

标签: c++ multidimensional-array struct types

目前正在将我的某个程序从Matlab迁移到C++,我在阅读file.csv时遇到了困难,并为我的理解寻求帮助。

struct nav {
std::string title;
... // I have 17 members but for simplicity purposes I am only disclosing
   // two of them
float quant;
};
nav port[];
std::string filedir = "C:\\local\\";
std::string fdbdir = filedir + "Factor\\";
std::string extension1 = "fdb.csv";
std::string extension2 = "nav.csv";
std::string factorpath = fdbdir + extension1;
std::string factorpath2 = filedir + extension2;
std::ifstream fdbdata(factorpath);
std::ifstream navdata(factorpath2);

int main() {

// 2nd data file involving data of different types
    {       

    navdata.open(factorpath2);
    if (navdata.fail()) {
        std::cout << "Error:: nav data not found." << std::endl;
        exit(-1);
    }

    for (int index = 0; index < 5; index++)
    {
        std::getline(navdata, port[index].title, ',');
        std::getline(navdata, port[index].quant, ',');
    }

    for (int index = 0; index < 4; index++)
    {
        std::cout << port[index].title << " " << port[index].quant << 
    std::endl;
    }

    }
}

错误:LNK2001: unresolved external symbol "struct nav * port" (?port@@3PAUnav@@A)

Error list开始,我想知道struct type port的声明肯定有问题。

最重要的是:有没有一种不硬编码index的方法,因为数据的维度不固定。我已将for (int index = 0; index < 4; index++)用于测试目的,但index可以是50,200等任何整数。

修改

根据要求,请在最小示例下面找到:

struct Identity {
int ID;
std::string name;
std::string surname;
float grade;    
};

std::string filedir = "C:\\local\\";
std::string extension = "sample.csv";
std::string samplepath = filedir + extension;

int main() {

std::ifstream test(samplepath);
std::vector<Identity> iden;
Identity i;
while (test >> i.ID >> i.name >> i.surname >> i.grade)
{
iden.push_back(i); 
}
std::cout << iden[1].name;
system("pause");
}

导致vector subscript out of range。知道这里看错了什么吗?

以下示例数据如下所示: ps:为了保持一致性,标题应为成绩

enter image description here

最佳,

1 个答案:

答案 0 :(得分:0)

您需要为数组“port”提供维度。关于struct nav * port的错误消息,这是C ++如何将数组衰减成指针的副作用

另外,因为您询问是否有办法不对该维进行硬编码,只需使用std :: vector。你会发现使用std :: vector通常既安全又有效。

另一个问题是“索引超出范围”,我不能100%肯定没有看到sample.csv文件的内容,但如果文件只包含一个条目,那么索引“1”会超出范围。在C ++ C风格的数组和C ++中,std :: vectorS使用从零开始的索引。