=============================== Anwendungsbeispiel: CSV-Dateien [TOC] =============================== CSV-Dateien (_comma separated values_) besteht eine Datei aus Datensätzen, die jeweils durch einen Zeilentrenner abgeschlossen sind. Jeder Datensatz besteht aus einer festen Zahl von Werten mit festgelegten Datentypen, die jeweils durch Kommata voneinander getrennt sind. Zwar gibt es noch zusätzliche Regelungen mit einer Header-Zeile und der Möglichkeit, Anführungszeichen zu verwenden. Dies lassen wir aber weg. So könnte eine CSV-Datei aussehen. In jeder Zeile ist der Name einer Stadt, die Zahl der Einwohner, die Höhe über Normalnull und die Fläche: :import: session09/step03/cities.csv Aufgabe ======= Entwickeln Sie mit Hilfe von `update_with_index` eine Template-Funktion `scan_csv_line` mit dem Return-Typ `bool`, die eine beliebig lange Liste von _lvalue reference_-Parametern erhält, die die einzelnen Komponenten eines Datensatzes aufnehmen sollen. Mit Hilfe des Index und der Gesamtzahl der Parameter wissen Sie, ob das jeweilige einzulesende Feld mit einem Komma oder mit einem Zeilentrenner abgeschlossen wird. Hinweise: * `std::getline` kann nicht nur Zeilen lesen, sondern auch bis zu einem vorgegebenen Trenner (als dritten Parameter nach dem Stream und der `std::string`-Variablen). * Ein `std::string`-Objekt können Sie mit Hilfe eines `std::istringstream`-Objekts auslesen. * Ob das Einlesen erfolgreich war, lässt sich mit einer _expliziten_ Konvertierung eines Streams zu `bool` bewerkstelligen oder unter Anwendung des `!`-Operators. Das führt häufig zu folgender Variante: ---- CODE (type=cpp) ------------------------------------------------------- bool read_sth(std::istream& in, /* ... */) { // read sth from in return !!in; // return true, if in is in a good shape } ---------------------------------------------------------------------------- Ein einfaches `return in` wäre nicht zulässig. `!in` wäre korrekt, liefert aber das Gegenteil vom gewünschten Resultat. Deswegen benötigen wir `!!in`. Vorlage ======= :import: session09/step03/update-with-index.hpp [fold] :navigate: up -> doc:index back -> doc:session09/page04 next -> doc:session09/page06