fstream Einlesen von Strings mit Leerzeichen
-
Hallo,
ich habe folgendes Problem:
Ich schreibe im Moment an einem Programm, dass ein Bücherverzeichnis darstellen soll.
Ich habe eine Klasse Buch, die die Parameter Name, Autor und ID hat.
Nun möchte ich aus einer Textdatei das bereits vorhandene Verzeichnis einlesen, dies sieht z.B. so aus in der Text Datei:Harry Potter J.K. Rowling 25233
OtherBook OtherOne 12315
...ich lese die Daten mithilfe von fstream ein. Das sieht bei mir so aus:
void Verzeichnis::readData() { std::ifstream in("Verzeichnis.txt"); std::string name; std::string autor; int id; int i = 0; while (in >> name >> autor >> id) { Buch neuesBuch(name, autor, id); _verzeichnis.push_back(neuesBuch); } }
Nun habe ich folgendes Problem:
Wenn ich einen Buchnamen habe, der aus mehreren Wörtern besteht(also mit whitespaces), wird das Buch natürlich nicht mehr richtig eingelesen, da der Operator >> dafür sorgt, dass nach jedem whitespace eine neue Variable eingelesen wird.
Wie kann ich dem Programm beibringen, dass er den Namen von Autor und ID unterscheiden kann, mit beliebig vielen Wörtern im Buchnamen?
-
Das einfachste wäre wohl ein Trennzeichen zwischen den Feldern das in keinem Datum vorkommt und dann
std::getline()
mit dem Trennzeichen als delimiter nehmen.
-
Hast du ein Beispiel, wie ichs machen kann. Ich versteh das nicht so ganz mit getline.
Hab das jetzt so, aber das geht nichtvoid Verzeichnis::readData() { std::ifstream in("Verzeichnis.txt"); std::string name; std::string autor; int id; while (!in.eof()) { std::getline(in, name, ','); std::getline(in, autor, ','); std::cin >> id; Buch neuesBuch(name, autor, id); _verzeichnis.push_back(neuesBuch); } /* while (in >> name >> autor >> id) { Buch neuesBuch(name, autor, id); _verzeichnis.push_back(neuesBuch); } */ }
-
@mute7 Warum liest du id von der Konsole (bzw. stdin)?
-
#include <cstdlib> #include <limits> #include <vector> #include <string> #include <fstream> #include <iostream> class book_t { static constexpr auto delim = ';'; std::string title; std::string autor; unsigned year; public: void pretty_print(std::ostream &os = std::cout) const { os << "Title: " << title << "\nAutor: " << autor << "\nYear: " << year << '\n'; } friend std::istream& operator>>(std::istream &is, book_t &book) { book_t tmp; if (!(std::getline(is, tmp.title, delim) && std::getline(is, tmp.autor, delim) && (is >> tmp.year))) return is; book = tmp; return is.ignore(std::numeric_limits<std::streamsize>::max(), '\n'); } friend std::ostream& operator<<(std::ostream &os, book_t const &book) { return os << book.title << delim << book.autor << delim << book.year << '\n'; } }; int main() { auto books_filename{ "books.txt" }; std::ifstream books_file{ books_filename }; if (!books_file.is_open()) { std::cerr << "Couldn't open \"" << books_filename << "\" for reading :(\n\n"; return EXIT_FAILURE; } std::vector<book_t> books{ std::istream_iterator<book_t>{ books_file }, std::istream_iterator<book_t>{} }; for (auto const &book : books) book.pretty_print(); }
books.txt
Der Fremde;Albert Camus;1942 Auf der Suche nach der verlorenen Zeit;Marcel Proust;1913–1927 Der Prozess;Franz Kafka;1925 Der kleine Prinz;Antoine de Saint-Exupéry;1943 So lebt der Mensch;André Malraux;1933 Reise ans Ende der Nacht;Louis-Ferdinand Céline;1932 Früchte des Zorns;John Steinbeck;1939 Dem die Stunde schlägt;Ernest Hemingway;1940 Der große Meaulnes;Alain-Fournier;1913 Der Schaum der Tage;Boris Vian;1947 Das andere Geschlecht;Simone de Beauvoir;1949 Warten auf Godot;Samuel Beckett;1952 Das Sein und das Nichts;Jean-Paul Sartre;1943 Der Name der Rose;Umberto Eco;1980 Der Archipel Gulag;Alexander Solschenizyn;1973 Paroles;Jacques Prévert;1946 Alkohol;Guillaume Apollinaire;1913 Der Blaue Lotos;Hergé;1936 Tagebuch der Anne Frank;Anne Frank;1947 Traurige Tropen;Claude Lévi-Strauss;1955 Schöne neue Welt;Aldous Huxley;1932 1984;George Orwell;1949 Asterix der Gallier;René Goscinny und Albert Uderzo;1959 Die kahle Sängerin;Eugène Ionesco;1952 Drei Abhandlungen zur Sexualtheorie;Sigmund Freud;1905 Die schwarze Flamme;Marguerite Yourcenar;1968 Lolita;Vladimir Nabokov;1955 Ulysses;James Joyce;1922 Die Tatarenwüste;Dino Buzzati;1940 Die Falschmünzer;André Gide;1925 Der Husar auf dem Dach;Jean Giono;1951 Die Schöne des Herrn;Albert Cohen;1968 Hundert Jahre Einsamkeit;Gabriel García Márquez;1967 Schall und Wahn;William Faulkner;1929 Die Tat der Thérèse Desqueyroux;François Mauriac;1927 Zazie in der Metro;Raymond Queneau;1959 Verwirrung der Gefühle;Stefan Zweig;1927 Vom Winde verweht;Margaret Mitchell;1936 Lady Chatterleys Liebhaber;D. H. Lawrence;1928 Der Zauberberg;Thomas Mann;1924 Bonjour tristesse;Françoise Sagan;1954 Das Schweigen des Meeres;Vercors;1942 Das Leben Gebrauchsanweisung;Georges Perec;1978 Der Hund von Baskerville;Arthur Conan Doyle;1901–1902 Die Sonne Satans;Georges Bernanos;1926 Der große Gatsby;F. Scott Fitzgerald;1925 Der Scherz;Milan Kundera;1967 Die Verachtung;Alberto Moravia;1954 Alibi;Agatha Christie;1926 Nadja;André Breton;1928 Aurélien;Louis Aragon;1944 Der seidene Schuh;Paul Claudel;1929 Sechs Personen suchen einen Autor;Luigi Pirandello;1921 Der aufhaltsame Aufstieg des Arturo Ui;Bertolt Brecht;1959 Freitag oder Im Schoss des Pazifik;Michel Tournier;1967 Der Krieg der Welten;H. G. Wells;1898 Ist das ein Mensch?;Primo Levi;1947 Der Herr der Ringe;J. R. R. Tolkien;1954–1955 Les Vrilles de la vigne;Sidonie-Gabrielle Colette;1908 Hauptstadt der Schmerzen;Paul Éluard;1926 Martin Eden;Jack London;1909 Südseeballade;Hugo Pratt;1967 Am Nullpunkt der Literatur;Roland Barthes;1953 Die verlorene Ehre der Katharina Blum;Heinrich Böll;1974 Das Ufer der Syrten;Julien Gracq;1951 Die Ordnung der Dinge;Michel Foucault;1966 Unterwegs;Jack Kerouac;1957 Die wunderbare Reise des kleinen Nils Holgersson;Selma Lagerlöf;1906–1907 Ein Zimmer für sich allein;Virginia Woolf;1929 Die Mars-Chroniken;Ray Bradbury;1950 Die Verzückung der Lol V. Stein;Marguerite Duras;1964 Das Protokoll;Jean-Marie Gustave Le Clézio;1963 Tropismen;Nathalie Sarraute;1939 Tagebücher 1887-1910;Jules Renard;1925 Lord Jim;Joseph Conrad;1900 Schriften;Jacques Lacan;1966 Das Theater und sein Double;Antonin Artaud;1938 Manhattan Transfer;John Dos Passos;1925 Fiktionen;Jorge Luis Borges;1944 Moloch. Das Leben des Moravagine;Blaise Cendrars;1926 Der General der toten Armee;Ismail Kadare;1963 Sophies Entscheidung;William Styron;1979 Zigeunerromanzen;Federico García Lorca;1928 Maigret und Pietr der Lette;Georges Simenon;1931 Notre-Dame-des-Fleurs;Jean Genet;1944 Der Mann ohne Eigenschaften;Robert Musil;1930–1932 Fureur et mystère;René Char;1948 Der Fänger im Roggen;J. D. Salinger;1951 Keine Orchideen für Mrs. Blandish;James Hadley Chase;1939 Die Abenteuer von Blake und Mortimer;Edgar P. Jacobs;1950 Die Aufzeichnungen des Malte Laurids Brigge;Rainer Maria Rilke;1910 Paris-Rom oder Die Modifikation;Michel Butor;1957 Elemente und Ursprünge totaler Herrschaft;Hannah Arendt;1951 Der Meister und Margarita;Michail Bulgakow;1967 Trilogie: Sexus, Plexus und Nexus;Henry Miller;1949–1960 Der große Schlaf;Raymond Chandler;1939 Seemarken;Saint-John Perse;1957 Gaston;André Franquin;1957 Unter dem Vulkan;Malcolm Lowry;1947 Mitternachtskinder;Salman Rushdie;1981
-
Das da:
@mute7 sagte in fstream Einlesen von Strings mit Leerzeichen:
while (!in.eof()) { std::getline(in, name, ',');
ist immer falsch.
Du machst:
- Auf Fehler prüfen
- lesen
- (eventuell Mist) verarbeiten
Richtig rum:
- lesen
- auf fehler prüfen (und ggf. abbrechen)
- verarbeiten
-
@Swordfish
Ich schau mir das mal in Ruhe an, danke.
-
@DirkB
macht keinen Sinn, hab nur bisschen rumexperimentiert und da getline ja strings als parameter nimmt, hab ich das cin benutzt.
-
Soll ich mal das Buch
.,; - Sonderzeichen im Wandel der Zeit
herausbringen?@mute7: das Trennzeichen darf nicht im Titel vorkommen. Wenn doch - Pech gehabt. Oder du überlegst dir, wie du damit umgehen willst - oder nimmst gleich eine csv-Library.
-
@wob sagte in fstream Einlesen von Strings mit Leerzeichen:
Soll ich mal das Buch .,; - Sonderzeichen im Wandel der Zeit herausbringen?
Dann nimm
'\t'
^^