Textfile auslesen



  • Guten Tag zusammen,
    ich heiße Patrick, bin von Beruf Betriebselektriker und versuche schon seit ca. einem halben Jahr C (für AV Microcontroller spielereien) und C++ (um Verständnis/Kenntnis für OOP zu erlangen).
    Habe das letzte halbe Jahr diverse Bücher gelesen und will nun praktische Erfahrung sammeln.
    Leider scheitert es scheinbar schon an den grundlegenden Dingen. Jetzt habe ich mich entschlossen hier im Forum um Hilfe zu Fragen. Ich hoffe ich nerve nicht allzu viel mit meinen Anfängerproblemen.

    Im Moment geht es um folgendes:

    Ich möchte eine Textdatei anzeigen lassen. Das Beispielprogramm funktioniert:

    // reading a text file
    #include <iostream>
    #include <fstream>
    #include <string>
    using namespace std;
    
    int main () {
      string line;
      ifstream myfile ("home/testtext");
      if (myfile.is_open())
      {
        while ( getline (myfile,line) )
        {
          cout << line << '\n';
        }
        myfile.close();
      }
    
      else cout << "Unable to open file"; 
    
      return 0;
    }
    

    Wenn ich aber versuche eine Funktion daraus zu erstellen dann ist in der Konsole nur eine leere Ausgabe:

    #include <iostream>
    #include <fstream>
    #include <string>
    
    using namespace std;
    string dataout(string data){
    string line;
    ifstream myfile (data);
    myfile.open(data);
    if (myfile.is_open())
    {
    getline (myfile,line);
    }
    return line;
    //cout<< line<<'\n';
    myfile.close();
    
    }
    
    
    
    int main (){
    string text=dataout("/home/patrick/qttest/untitled1/testtext");
    
    cout<<text<<\n;
    
    
    
    
        return 0;
    }
    

    string text soll den Rückgabewert erhalten und string data soll der übergebene Parameter sein.
    Irgendwas verstehe ich da falsch und komm nicht drauf. Hat das was mit der Gültigkeit von Variablen zu tun, oder muss ich irgendwo mit Pointer arbeiten?

    Kann mir jemand einen Hinweis geben oder das erklären was ich falsch mache?

    MfG
    Patrick



  • Mehr als die erste Zeile liefert die Funktion nicht. Was steht in der Zeile? Konnte die Datei überhaupt geöffnet werden? Eine Fehlermeldung wäre hilfreich.



  • Keine Fehlermeldung,nur Warnung: warning: control reaches end of non-void function [-Wreturn-type].

    Das sagt mir das kein Returnwert in der Funktion ist.
    Aber warum versteh ich nicht.
    "return line;" sollte doch dafür sorgen?
    in dem textfile steht nur sowas wie "das ist ein Testfile hallo"



  • myfile.open(data);
    "If the stream is already associated with a file, calling this function fails. If the function fails to open a file, the failbit state flag is set."



  • @out
    Vielen Dank.
    Hab myfile.open auskommentiert.
    Jetzt schreibt er mir die Erste von zwei Zeilen.

    Und verstehe ich das richtig? Ich brauche das myfile.open nicht weil:

    "File streams are associated with files either on construction, or by calling member open."

    Ich sehe schon, ich kann zwar recht gut Englisch, aber die zusammenhänge sind doch sehr schwer für mich zu verstehen.
    Habt mir sehr geholfen.



  • Ja du brauchst kein open und kein close, weil in C++ die Ressourcen an die Lebensdauer des Objekts geknüpft sind (RAII).



  • { 
        std::ifstream f( "./filename.dat" );
        if ( f.is_open() )
        {
            // do something
        }
    }
    // Ab hier ist die Datei wieder geschlossen weil das ifstream-Objekt "f" zerstört wurde.
    


  • @marsmännchen sagte in Textfile auslesen:

    Und verstehe ich das richtig? Ich brauche das myfile.open nicht weil:
    "File streams are associated with files either on construction, or by calling member open."

    Genau. Also das bedeutet:

    // ENTWEDER (1)
    std::ifstream myfile("datei"); // myfile öffnet "datei" bereits hier
    
    // ODER (2)
    std::ifstream myfile; // jetzt ist myfile noch keiner Datei zugeordnet
    myfile.open("datei"); // erst jetzt wird geöffnet
    

    (1) ist das idiomatischere C++. Also gleich eine Datei zuordnen. Nicht erst ein leeres Dummy-Objekt erstellen, bei dem man eigentlich nichts sinnvolles machen kann außer eine Datei zu öffnen.

    Deine Funktion hat generell das Problem, dass sie nur eine Zeile zurückgibt. Was soll denn deine Funktion "dataout" zurückgeben? Die ganze Datei oder eine Zeile oder noch was anderes? Was möchtest du erreichen? Vom Namen "dataout" lässt sich das nicht schließen. Also noch ein Tipp: benenne deine Funktion so, dass klar ist, was sie tut. "dataout" könnte alles mögliche tun.



  • Danke für die Erklärung.
    Soll eigentlich die ganze Datei ausgeben, aber soweit bin ich noch nicht.
    Ist nur zum üben für mich.
    Will dann später mit Qt eine GUI erstellen wo ich eine Suchfunktion für die Datei mache.
    Ist halt nur rein zwecks Übung, weil alle anderen Übungsaufgaben beschäftigen sich hauptsächlich mit irgendwelchen Zahlen zur Berechnung.
    Sowas brauch ich eigentlich nicht wirklich.
    Daher hab ich mir eigene "Übungen" überlegt, sowas wie die Suchfunktion eben.

    MfG



  • @marsmännchen sagte in Textfile auslesen:

    Ich möchte eine Textdatei anzeigen lassen.

    #include <fstream>
    #include <iostream>
    
    int main()
    {
        std::cout << std::fstream{ "home/testtext" }.rdbuf() << '\n';
    }
    

    und nu?

    @marsmännchen sagte in Textfile auslesen:

    Will dann später mit Qt eine GUI erstellen wo ich eine Suchfunktion für die Datei mache.

    Du bitte lassen Finger von Qt wenn nix können Grundlagen. Danke.



  • Deshalb ich auch anfangen zu lernen Grundlagen.Du verstehen?



  • @marsmännchen

    Du darfst gewisse Wörter wie "Grundlagen" und "Qt" oder "Spiel" nicht in einer Antwort zusammen schreiben. Das sind Schlüsselwörter, wo manche User direkt das Hirn ausschalten und in den Angriffsmodus gehen.



  • @Jockelx ja das gibt's immer wieder mal. Wobei ich mir doch denke, auf Angriff schalte ich wenn ich mich bedroht fühle. Wo liegt da die Bedrohung? Aber gottseidank gibt es immer noch normale Leute im forum die gerne mal einem Anfänger helfen.



  • @marsmännchen sagte in Textfile auslesen:

    Deshalb ich auch anfangen zu lernen Grundlagen.Du verstehen?

    😃 👍



  • @marsmännchen sagte in Textfile auslesen:

    @Jockelx Aber gottseidank gibt es immer noch normale Leute im forum die gerne mal einem Anfänger helfen.

    Naja wer ist schon normal. @Swordfish ist aber auf jeden Fall ein eher hilfreicher Zeitgenosse. Hat halt manchmal seine Momente, so wie wir alle.



  • @hustbaer Wenn @marsmännchen sich hinsetzen und lernen ordentlich ich nichts gesagt haben will.

    . o O ( erschlagt meinen Deutschlehrer eben wenn ihr ihn seht )
    . o O ( wenn ich was Positives an der originalen Fragen finden sollte ... es ist wenigstens kein !myfile.eof() drinnen 👍🏻 )



  • @Swordfish Tut mir leid das Thema in die länge zu ziehen, aber da drängt sich mir natürlich die Frage auf was an
    !myfile.eof() so schlecht ist? Man sieht es in sehr vielen Beispielen in Verwendung.



  • @marsmännchen sagte in Textfile auslesen:

    @Swordfish Tut mir leid das Thema in die länge zu ziehen, aber da drängt sich mir natürlich die Frage auf was an
    !myfile.eof() so schlecht ist? Man sieht es in sehr vielen Beispielen in Verwendung.

    Es wird fast immer falsch benutzt. Wo siehst du es "in sehr vielen Beispielen in Verwendung"? Alle Beispiele der Art while (!myfile.eof()) { ... } sind schlecht. Das Eofbit wird erst gesetzt, nachdem versucht wurde, über das Dateiende hinaus zu lesen.



  • @wob wo in welchen Beispielen? z.b:
    https://mathbits.com/MathBits/CompSci/Files/End.htm
    http://www.cplusplus.com/reference/ios/ios/eof/
    https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.3.0/com.ibm.zos.v2r3.bpxbd00/feof.htm
    http://www.willemer.de/informatik/cpp/fileop.htm

    Daher ist es natürlich für mich interessant zu hören das man das nicht tun sollte.

    Aber egal, ich will mit solchen Details eure Geduld nicht zu sehr strapazieren. Sowas kann ich auch sicher irgendwo spezifisch lesen wie man EOF genau verwendet.
    Danke jedenfalls für die Hilfe!



  • Kann man mit !eof als Laufbedingung nicht auch wunderschön endlos loopen?


Anmelden zum Antworten