fstream



  • Hallo ich spiele mich gerade mithilfe einiger Hinweise von meinem Freund "Google" und unter anderem diesen Seite: http://stackoverflow.com/questions/11546177/how-to-read-lines-of-text-from-file-and-put-them-into-an-array und http://www.tutorialspoint.com/cplusplus/cpp_files_streams.htm mit fstream herum. Mein Ziel ist es, bei jedem Programmstart die Daten aus einer externen .txt Datei einzulesen! Denn im Falle einer Userdaten Änderung soll das Programm beim Neustart natürlich die im Zuge des vorherigen Programmdurchlaufs geänderten, ins File eingelesenen Daten akzeptieren!

    Bitte um Hilfe wie ich das realisieren kann. Denn ich arbeite paralell an einem Projekt, wo das durchaus Sinn machen kann!

    Konsolenoutput: Welcome to Train Project 1.0! Please provide your Unix user data!
    0x7ffe6cdf2160

    Code der ausgeführten Datei siehe Anhang

    Danke vorab und LG

    Martin

    #include <iostream>
    #include <fstream>
    #include <string>
    #include <cstring>
    #include <string.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <pthread.h>
    
    using namespace std;
    
    // User = 13 
    // Password = 14
    
    string user()
    
    {
    
    cout << "Welcome to Train Project 1.0! Please provide your Unix user data!" << endl;
    
    const size_t SIZE = 13;
    
    string user[SIZE];
    
    size_t i = 0;
    
    ifstream infile("Programming//User.txt");
    
    while(!infile.eof() && i < SIZE)
    
     {
    
     getline(infile, user[i]);
    
     ++i;
     }
    
    cout << user << endl;
    getchar();
    
    }
    
    int main()
    
    {
    
    user();
    return 0;
    }
    


  • Sieht wohl so aus als ob der Compiler bei

    cout << user << endl;
    

    die Adresse deines Arrays ausgibt. Du solltest dort eine Schleife über alle Elemente nutzen und dann jedes Element für sich ausgeben.



  • Erst mal brauchst Du die includes <cstring>, <string.h>, <stdlib.h> und <pthread.h>. Es ist sehr schlechter Stil, einfach erst mal alle includes, die man kennt einzufüge.

    Die Zeile

    string user[SIZE];
    

    Deklariert ein Array von 13 Strings. In der Schleife liest Du dann bis zu 13 Zeilen ein. Die Zeile

    cout << user << endl;
    

    gibt dann die Adresse des Arrays aus.

    Jetzt kannst Du überlegen, ob das das ist, was Du erreichen wolltest.

    Ach ja - statt

    while(!infile.eof() &&...)
    

    solltest Du eher

    whiel(!infile() && ...
    

    verwenden. Du willst die Schleife auch abbrechen, wenn ein anderer Fehler als eof aufgetreten ist.



  • Hallo, vielen Dank für die wertvollen Hinweise! Ich habe jetzt mal angefangen Schritt für Schritt mit euren Hinweisen zu arbeiten. Eine Frage hätte ich aber schon mal wieder: Wie schaff ich es, jedes einzelne der 13 Zeichen aus der Datei einzulesen?

    Mit

    getchar(infile, user[i]);
    

    geht's nicht, ich vermute mal, weil er ja aufgrund der Anzahl der Argumente glaubt, dass ich mehr als ein Zeichen einlesen möchte. Aber sage ich ihm mit o.a. Funktion nicht, dass er ein Zeichen aus der Datei in den Array [user[i] speichern soll? Und: Ist der Ansatz:

    const size_t SIZE = 13;
    
    char user[SIZE];
    
    size_t i = 0;
    

    Schon mal richtig oder liege ich ganz falsch?

    Und was ich auch nicht verstehe ist:

    Bei

    while(!infile() && i < SIZE)
    ...
    

    wird mir ein Fehler geliefert: Train Project-Ubuntu.cc: In function ‘std::__cxx11::string user()’:
    Train Project-Ubuntu.cc:29:15: error: no match for call to ‘(std::ifstream {aka std::basic_ifstream<char>}) ()’
    while(!infile() && i < SIZE)

    Oder hängt das mit den übrigen Fehlern zusammen. Falls es nötig ist: Ich arbeite mit Linux und verwende g++ (GNU Compiler).

    Danke nochmal vorab und LG



  • infile ist halt keine Funktion


  • Mod

    Korrekt wäre hier so etwas wie

    while(getline(infile, user[i]) && ++i != SIZE);
    

    Prüfe immer nach der Leseaktion auf Erfolg! Das ist auch beim Tipp vom tntnet falsch. Sonst verarbeitest du Unsinnsdaten, wenn die Aktion fehlschlägt.



  • getchar() übernimmt keine parameter und gibt das nächste aus dem eingabepuffer ausgelesene zeichen zurück, sprich der aufruf lautet char xy = getchar(); oder nur getchar();
    mal davon abgesehen, dass das c ist.....

    warum möchtest du jedes einzelne zeichen aus der datei einlesen? viel besser wäre es, möglichst viele zeichen auf einmal aus der datei einzulesen (noch besser die ganze datei auf einmal, kommt dann aber auf die größe der datei an) und dann die eingelesenen daten zu verarbeiten. du bekommst dann idr ein array mit x elementen, die durch 0 oder \n oder was auch immer getrennt sind, das mittels irgendwelcher methoden, die ich momentan nicht weiß, anhand dieser zeichen in ein array aus strings umgewandelt werden kann, sprich die methode liest alle zeichen ein, bis sie auf 0 (oder was auch immer) trifft und schreibt sie dann ins array.



  • venezianer27 schrieb:

    Bei

    while(!infile() && i < SIZE)
    ...
    

    Ja richtig, da ist die Klammer zu viel:

    while (!infile && i < SIZE)
    

    Ansonsten ist der Hinweis von SeppJ natürlich korrekt. Die falsche Abbruchbedingung hatte ich übersehen.



  • Ich würde das blöde string CArray durch einen vector<string> ersetzen.
    Die Funktion würde ich mir auch nochmals gut überlegen. Die Benennung finde ich nicht gut, klingt eher wie ein struct / class . Außerdem ist der Rückgabetyp string , aber du gibtst nichts zurück. Sollte wohl void sein. Desweiteren macht die Funktion im Moment einige Dinge, das könnte man bestimmt weiter unterteilen. Zuletzt fragt die Funktion den Benutzer nach irgendwelcher user data, aber verlangt dann garkeinen input. Irgendwie verwirrend.

    Hoffe das hilft dir weiter.

    LG



  • Hallo Danke für eure zahlreichen Antworten und Tipps. Habe mich mittlerweile bereits mehrfach erfolgreich damit beschäfttigt, einige Codes geschrieben, die sich mit fstream im speziellen beschäftigen und geklappt hat es prima. Mittlerweile bin ich bei der Möglichkeit zu suchen angelangt. Nur bei einer Sache bin ich noch etwas am rätseln: Ich möchte gerne eine txt Datei nach einem Begriff durchsuchen, diesen allerdings danach nicht ausgeben, sondern die ganze Zeile, an der Cursor zum Zeitpunkt des Ausgabebefehls steht, ausgeben! Der Suchbegriff soll also lediglich als Anhaltspunkt dienen. Es geht konkret darum, dass ich eine Datei habe mit einigen Zeilen. Der User bestimmt durch seine Eingabe, was der Computer suchen soll. D.h. um ein Beispiel zu nennen. Das Progi fragt nach der Uhrzeit, der User gibt sie ein, der PC wiederum sucht dann nach dieser im Dokument und gibt schlussendlich das aus, was in jener Zeile steht, wo die Uhrzeit gefunden wurde. Im txt Dokument sieht das ganze zb so aus:
    600 Wien Lufthansa 15023 London. Im Google finde ich unter fstream leider weit und breit keinen Hinweis darauf wie das gehen könnte. Es gibt ja einige operatoren unter anderem wie man den Cursor an einer bestimmten Stelle positioniert, etc. Aber alles, was ich bisher gelesen habe, setzt voraus, dass ich weiß in welcher Zeile das ganze steht, aber das kann ich ja gar nicht wissen, weil es ja wie erwähnt von der Usereingabe abhängt. Und mindestens 24 if-Regeln für zumindest jede Stunde, was nur ein Teilschritt für meine Zwecke wäre, kann ja auch nicht die Lösung sein, oder? Ich poste nun einmal einen Codeteil, damit ihr ein Bild zu meinem Roman habt:

    cout << "The basic planning is complete! Now, please provide the airline (short form) the pilot should fly for as well as the current local time! According to this I will choose your flight!" << endl;
    
    getline(cin, airline); cin >> loctime;
    
    // Ausgabe Abflugzeit abhängig von Ortszeit, Start, Fluglinie und Ziel:
    
    infile.open("lib/Flights.txt");
    
    string departureAL; // Airline
    
    int departureLT; // Local time (at the end calc + 105)
    
    string departureSP; // Starting Point
    string departureDP; // Destination Point
    
    bool stopsearch = false;
    
    while(!infile.eof() && !stopsearch) // solange Ende der Datei nicht erreicht und kein Wert für bool stopsearch eingegeben wird, ausführen!
    {
    
    getline(infile, departureLT); // Zeile = zb. 600 Wien Lufthansa 15023 London
    
    if(departureLT == loctime) // Wenn departureLT im Rahmen des Leseprozesses durch loctime definiert werden konnte; Problemstellung hier, wenn nichts hinzugefügt wird danach noch: Er sucht und gibt das aus, was ich gerade eingegeben habe. Ziel ist aber, den Flug als ganzes auszugeben!
    {
    
    stopsearch = true;
    
    if(stopsearch)
    {
    
    // Ausgabe der Zeile ab der Stelle, wo Suchbegriff gefunden wurde:
    
    } // if 2 
    } // if 1
    } // while Schleife
    

  • Mod

    Zeilenweise lesen; wenn Zeile Wert enthält, Zeile ausgeben.

    Du machst immer noch Fehler, die dir schon vor 9 Monaten genannt wurden.

    Es ist auch grundsätzlich falsch, Problemstellungen dieser Art googeln zu wollen. Meinst du, irgendjemand würde solch bahnbrechende Erkenntnisse, wie meinen Vorschlag hier, aufschreiben? Das ist simpelste Kombination der bekannten Grundelemente, auf die du in 10 Sekunden selber gekommen wärst, wenn du es versucht hättest.


Anmelden zum Antworten