目前正在将我的某个程序从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:为了保持一致性,点标题应为成绩。
最佳,
答案 0 :(得分:0)
您需要为数组“port”提供维度。关于struct nav * port的错误消息,这是C ++如何将数组衰减成指针的副作用
另外,因为您询问是否有办法不对该维进行硬编码,只需使用std :: vector。你会发现使用std :: vector通常既安全又有效。
另一个问题是“索引超出范围”,我不能100%肯定没有看到sample.csv文件的内容,但如果文件只包含一个条目,那么索引“1”会超出范围。在C ++ C风格的数组和C ++中,std :: vectorS使用从零开始的索引。