Ich habe versucht, folgende Datentabelle zu lesen und ein Objekt für die HUBs (Zeilen) und ein anderes Objekt für Kontinent (Spalten) zu erstellen. Da ich kein C++ erfahrener Benutzer bin, hatte ich einige Schwierigkeiten. Die Daten sind im Folgenden. Die Nummer nach HUB und der Bindestrich zeigt die Reihenfolge vom Hub an. Die anderen Zahlen unter jedem Kontinent sind die entsprechenden Kosten und Tarife zwischen einem HUB und einem Kontinent. Ich möchte in der Lage sein, zum Beispiel cout folgenden und das Ergebnis zu erhalten, die 73. cout << hub(1)->cont(USA)->transport() << endl;
Lesen von Spalten aus einer kommagetrennten Datendatei C++
,USA,EUROPE,ASIA
HUB1-12000,,,
Transportation Cost,73,129,141
Tariffs,5,5,1
ShippingType,a,b,c
OtherFees,0.6,0.3,0.8
HUB2-11000,,,
Transportation Cost,57,101,57
Tariffs,7,7,5
ShippingType,b,b,d
OtherFees,0.7,0.3,0.6
Wirklich zu schätzen Ihre Hilfe wäre. Hier ist, was ich versucht habe, so weit:
void Hub()
{
string file = "/hubs.csv";
// 1-First read the first line and save the continent name
string str, field;
getline(fin, str);
vector<string> contList;
stringstream linestr(str);
while ( linestr.good())
{
getline(linestr, field, ',');
string contname;
contList.push_back(contname);
}
// 2-Then read the rest
getline(fin, str);
while (!fin.eof()) // Read the whole file
{
stringstream linestr(str);
string contname, order;
if (qstr[0] == 'HUB1' || qstr[0] == 'HUB2')
{
// Read the name of the hub
getline(linestr, hubname, ','); // Read the hub name
getline(linestr, order, ','); // Read the order quantityity
int quantity;
istringstream orderstream(order);
orderstream >> quantity;
// Find the hub and add the order to the hub
Hub* hub = glob->FindHubName(hubname); // this returns a pointer
if (glob->FindHubName(hubname) == nullptr)
{
hubNotFound.push_back(hubname);
getline(fin, qstr);
continue;
}
hub->TotalOrder(quantity);
}
else if (qstr[0] != 'HUB1' || qstr[0] != 'HUB2')
{
// Read costs and tariffs
cout << hub(1)->cont(ASIA)->transport()
}
getline(fin, qstr);
}
fin.close();
}
Sie können jede Zeile über 'getline' aus den' ' Header lesen. Dann können Sie jeden Zeilenstring in einen 'istringstream' platzieren und jedes Datum auch über' getline' lesen, indem Sie ein Komma als Zeilenbegrenzer angeben. Aber das ist wirklich viel zu offen: Es gibt Billionen von Möglichkeiten, dies zu tun, also zu eng zu wählen, als zu breit. –