Aus txt.Datei in vector lesen



  • Hey Forumler,

    mal wieder ne C++ Angelegenheit.....

    Ich möchte ein Programm schreiben, dass beim Programmstart 2 vectoren mit den Daten von zwei txt. Dateien befüllt und es zulässt ,dass der Benutzer in diese vectoren schreiben kann. Diese neuen Daten, sollen dann mit den txt. dateien syncronisiert werden, also in den txt.dateien ergänzt werden...

    Die vectoren sind von benutzerdefinierten Typen.

    Eine der Klassen sieht so aus:

    class Book
    {
    public:
    string title;
    string autor;
    int ISBN;
    };
    

    In einer Zeile der txt. Datei Books sollen also dann folgende Daten auftauchen:

    Andorra Max_Frisch 9783518367773 ;

    Als erstes der Titel dann whitespace dann der Autor dann whitespace dann die ISBN.
    Und am Ende i-ein Zeichen ,dass signalisiert ,dass hier die Daten dieses Buches enden.

    Ich dachte beim einles Mechanismus an so etwas:

    vector<Book>Books;
    
    void Syncro ()
    {
    Book New;
    Books.txt("alles bis zum nächsten whitespacezeichen) = New.title;
    Books.txt("alles bis zum nächsten whitespacezeichen) =New.autor;
    Books.txt("alles bis zum ;") =New.ISBN;
    Books.push_back(New);
    return;
    }
    

    Der Pseudocode würde ja das tun was er soll, nur wie ich den Zugriff auf ide Datei Books.txt herstelle und es schaffe aus ihr zu lesen ist mir vom code her ein Rätsel. Vorallem: Wo muss ich die Datei speichern bzw. muss ich einen Dateipfad angeben?
    Das wäre Teil 1.
    Ich wäre für jede Hilfe dankbar!

    mfg Golfi



  • Ich gebe dir mal ein paar Tipps. Eine Datei kannst du mit std::ifstream öffnen. Eine Zeile kannst du dann mit std::getline auslesen.

    Das Trennen an den Whitespaces kannst du entweder manuell machen oder du benutzt einen Trick und lässt das einen std::stringstream machen. Das könnte dann so aussehen:

    std::string title, autor, isbn;
    std::stringstream s(zeile);
    
    s >> title >> autor >> isbn;
    

    Am besten probierst du zunächst mal, die Datei zeilenweise auszulesen und auszugeben. Danach machst du dich an die Trennung an den Leerzeichen und dann füllst du damit eine Klasse, die du in einem std::vector verstaust.


  • Mod

    Golfi1812 schrieb:

    Der Pseudocode würde ja das tun was er soll, nur wie ich den Zugriff auf ide Datei Books.txt herstelle und es schaffe aus ihr zu lesen ist mir vom code her ein Rätsel.

    Guck mal, was ifstreams und ofstreams sind. Wenn du davon ein Objekt erstellt hast, ist die Benutzung danach 100% analog zu dem istream-Objekt cin bzw. dem ostream-Objekt cout.

    Vorallem: Wo muss ich die Datei speichern bzw. muss ich einen Dateipfad angeben?

    Das kommt ganz drauf an, was du möchtest. Normalerweise legt die Umgebung in der du das Programm ausführst ein aktuelles Arbeitsverzeichnis fest (welches normalerweise nichts mit dem Verzeichnis zu tun hat, wo dein Programm liegt). Dann kannst du in deinem Programm entweder relative Pfade benutzen, die dann realtiv zum aktuellen Arbeitsverzeichnis sind (also zum Beispiel im aktuellen Arbeitsverzeichnis, wenn du gar nichts angibst) oder du kannst absolute Pfade angeben. Ersteres ist ganz praktisch, wenn es viele solche Listen geben kann und der Anwender angeben kann, welche er meint (zum Beispiel wie eine Textdatei in einem Editor), letzteres eher wenn es eine zentrale Liste gibt.

    edit: @ghjghj: Oder einfach dreimal operator>>? Wozu so umständlich über getline und stringstreams? Ich vermute auch mal, dass dies eine Übungsaufgabe ist und die Trennung mittels Whitespace absichtlich gemacht wurde, damit man über das Einlesen nicht viel nachdenken muss und sich auf den Kern der Aufgabe beschränken kann.



  • Was ist daran umständlich? Ich finds eigentlich ganz okay.



  • Ich habe es mal wie folgt ausprobiert:

    #include <iostream>
    #include "../../../std_lib_facilities.h"
    
    string name = "Books";
    ifstream istr(name.c_str());
    
    ofstream ostr(name.c_str());
    
    int main()
    {
    	vector<int>Zahlen;
        int zahl;
    	while(istr>>zahl){Zahlen.push_back(zahl);}
    	for(int i = 0;i<Zahlen.size();++i)
    	{
    		ostr << Zahlen[i] << endl;
    	}
    	keep_window_open();
    	return 0;
    }
    

    Wenn ich das Programm ausführe springt er dirket zum keep_window_open()....

    Was mache ich falsch? Wie signalisere ich dem Programm wo die Datei Books ist, denn er scheint sie ja nicht zu finden...


  • Mod

    Das ist dann wieder eine Sache des Arbeitsverzeichnisses. Das ist nicht mehr das Thema C++-Programmierung, sondern Grundlagen wie du mit deinem Computer umgehst. Welches Betriebssystem ist es denn und wie führst du dein Programm aus? Aus einer IDE (welche?) aus einer Konsole (welche?) aus einer grafischen Oberfläche (welche?) oder anders (wie?)?
    Ansonsten sieht dein Programm richtig und gut( 👍 ) aus, außer dass ich die Variablen nicht global gemacht hätte.



  • Ich führe es in der Win32 Konsole mit Visual Studio 2010 aus.
    Doch wie gebe ich dann den Inhalt der Datei in der Konsole aus (code)?
    Denn wenn ich das Programm ausführe komme ich direkt zum keep_window_open()...

    PS: mit den globalen variablen is klar, nur jetzt schnell im Bsp


  • Mod

    Golfi1812 schrieb:

    Ich führe es in der Win32 Konsole mit Visual Studio 2010 aus.

    dann wechsel vorher mal mit cd in das Verzeichnis wo die "Books" liegt und stell sicher, dass die Datei auch wirklich da ist ( dir ), nur Zahlen enthält(meine DOS-Kenntnisse sind etwas eingerostet. War es type ? Oder more ?) und auch wirklich so heißt (und nicht z.B. Books.txt)

    Doch wie gebe ich dann den Inhalt der Datei in der Konsole aus (code)?

    Naja, ganz normal, du musst nicht in eine andere Datei schreiben. Normalerweise sollte der Strom cout auf die Konsole schreiben, wenn du die Konsolenausgabe nicht umgelenkt hast.



  • Ich habe das manuell über dden explorer mal nachgeschaut. Die datei heißt "Books" ist eine txt.Datei und beinhaltet nur Zahlen.Jedoch habe ich diese Datei angelegt und möchte ja,dass das Programm mir die in Books entahltenen Zahlen ausgibt....

    Code?


  • Mod

    Golfi1812 schrieb:

    Die datei heißt "Books" ist eine txt.Datei

    Das ist ein Widerspruch.

    Code?

    Versuchs mal testweise mit dem absoluten Pfad der Datei, das muss auf jeden Fall funktionieren. Denk da dran, dass du, falls du den Pfad wie in Windows üblich mit '\' als Trennzeichen schreiben möchtest, du in deinem Programm '\' schreiben musst. '/' sollte aber, wenn ich mich nicht irre, mittlerweile auch funktionieren, da brauchst du nichts spezielles zu beachten. Was ich nicht weiß ist, was passiert, wenn Leerzeichen oder andere Sonderzeichen im Pfad sind, da muss mal ein Windowsnutzer sagen, ob man da noch etwas beachten muss.



  • Kopier die Datei z.B. auf die Festplatte C:\ und gib als Pfad C:\\Books.txt an


Anmelden zum Antworten