Ich möchte Daten aus einer CSV-Datei extrahieren, aber ich muss zuerst die Anzahl der Zeilen und Spalten der Tabelle erhalten.Alternative für gelöschte Kopie Konstruktor von Ifstream
Was ich bisher habe, ist die folgende:
std::ifstream myfile(filename); // filename is a string and passed in by the constructor
if (myfile.is_open())
{
// First step: Get number of rows and columns of the matrix to initialize it.
// We have to close and re-open the file each time we want to work with it.
int rows = getRows(myfile);
std::ifstream myfile1(filename);
int columns = getColumns(myfile1);
if (rows == columns) // Matrix has to be quadratic.
{
std::ifstream myfile2(filename);
abwicklungsdreieck.set_Matrix(QuantLib::Matrix(rows, columns, 0)); // abwicklungsdreieck is initialised before
//...
}
else
{
std::cout << "\nNumber of rows has to equal number of columns.";
}
}
// [...]
int getRows(std::ifstream &myfile)
{
std::string line;
int rows = 0;
while (std::getline(myfile, line)) // While-loop simply counts rows.
{
rows++;
}
myfile.close();
return rows - 1;
}
int getColumns(std::ifstream &myfile)
{
std::string line;
char delimiter = ';';
size_t pos = 0;
int columns = 0;
while (std::getline(myfile, line) && columns == 0) // Consider first line in the .csv file.
{
line = line + ";";
while ((pos = line.find(delimiter)) != std::string::npos) // Counts columns.
{
line.erase(0, pos + 1);
columns++;
}
}
myfile.close();
return columns - 1;
}
Dieser Code funktioniert. Allerdings muss ich die Datei dreimal öffnen, was mir nicht gefällt. Gibt es eine Möglichkeit, dies zu umgehen?
Ich dachte über die Arbeit mit TEMP-Dateien in getRows() und getColumns(), aber das Kopieren von Streams ist nicht möglich, da es keinen Sinn ergibt, wie ich kürzlich gelernt habe.
Also, gibt es einen anderen Weg, das zu tun? Oder kann ich beispielsweise die Methoden getline() und line.erase() umgehen?
Warum denken Sie, dass Sie die Datei dreimal öffnen müssen? – user463035818
vielleicht ist das die Quelle Ihres Missverständnisses: Sie können keinen Stream kopieren, aber Sie können Referenzen nach Belieben weitergeben. Öffne es einmal, führe es herum, mach ein paar Sachen, schließe es einmal. – user463035818
Ja, aber wie gebe ich es weiter? getLine (& myfile) funktioniert nicht .. –