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 nicht

    void 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' ^^


Anmelden zum Antworten