Textausgabe formatieren?



  • Hallo zusammen, ich habe grade erst mit c++ angefangen und stehe schon vor einem (für mich) unlösbaren Problem:
    Ich möchte einfach den Inhalt einer Textdatei auslesen und diesen auf dem Bildschirm ausgeben lassen.
    Soweit funktioniert alles ok, aber die Ausgabe besteht nur aus wirren Zeichen.
    Muss ich da noch etwas formatieren?
    Schon mal vielen Dank!
    int main()
    {
    ifstream in ("c:\testdok");
    char s [250];
    while (in.good())
    {
    in.read(s, 250);
    }
    cout << s;
    int i = _getch();
    return 0;

    }


  • Mod

    Ehrlich gesagt: Du machst so ziemlich alles falsch was man falsch machen kann. Das ganze Gehampel mit char[] kannste in C++ komplett vergessen, wo immer du das her hast: Guck da nie wieder hin. Das read ist als Einlesemethode auch völlig falsch, wenn du das hinterher so wie hier mit dem Operator << ausgeben möchtest. Und der Programmablauf ist auch falsch, die Schleife wird erst durchlaufen, dann wenn die letzte Leseaktion fehlschlug wird sie abgebrochen und danach etwas ausgegeben, nämlich das was nach der fehlgeschlagenen Leseaktion in s steht. Und dies auch noch falsch, weil wie gesagt das Zusammenspiel von char[], read und operator << so nicht funktioniert.

    Ich werde mal ein Beispiel schreiben wie es besser geht (aber erstmal gehe ich was essen, wahrscheinlich macht es bis ich wiederkomme auch schon jemand anderes 😃 ), aber dir ist wohl eher zu einem Grundlagenbuch C++ zu raten.



  • sag das nicht, er nutzt wenigstens int nain() (also nicht nain, aber der buchstabe ist kaputt).

    Aber SeppJ hat recht. Nur in den Punkten nicht, wo er sagt, das wird wer anders tun, jdf. nicht die hier schreibende Person betreffend.

    Gott, der Laptop ist dringend zu einer Instanz der Klasse Dell-Shop zu bringen.



  • Oh, das ist hart...
    Danke für die Antwort, da bin ich ja mal gespannt.
    Ich habe den Quelltext aus einem Buch für meine Zwecke überarbeitet, aber ich will mich bessern, versprochen.



  • SeppJ schrieb:

    .. (aber erstmal gehe ich was essen, wahrscheinlich macht es bis ich wiederkomme auch schon jemand anderes 😃 ), aber dir ist wohl eher zu einem Grundlagenbuch C++ zu raten.

    .. so isses:

    #include <iostream>
    #include <fstream>
    
    int main()
    {
        using namespace std;
        ifstream in("c:\\testdok"); // 2x\\..
        cout << in.rdbuf(); // Inhalt der Datei nach cout schreiben
        return 0;
    }
    


  • <offtopic>

    Eisflamme schrieb:

    sag das nicht, er nutzt wenigstens int nain() (also nicht nain, aber der buchstabe ist kaputt).

    leg dir doch das m in die zwischenablage 😉
    "rn" sieht auch fast wie ein m aus 😃



  • Hab das durchaus überlegt, aber war dann doch zu viel Aufwand bzw. einfach schwachsinnig, ich... habe die Intention zu sagen, wer würde schon so etwas Seltsa... Verrücktes tun?

    rn ist eigentlich ganz gut.

    Das ist ja der Oberharnrner, int rnain()... na ja...

    Trotz allen Dinge danke und gute Nacht 🙂

    PS: Coden ist so wirklich nervig. Lustiger ist es noch, wenn auf der Tastatur das | nicht gefunden wird und daher die Ausdrücke durch ! und & ersetzt werden sollten.



  • OK, vielen Dank.
    Aber mit dem neuen code klappt es auch nicht, da bekomme ich jetzt gar nichts mehr auf den Bildschirm. 🙄



  • rudi_ratlos schrieb:

    OK, vielen Dank.
    Aber mit dem neuen code klappt es auch nicht, da bekomme ich jetzt gar nichts mehr auf den Bildschirm. 🙄

    .. dann hat er die Datei nicht öffnen können. Erweitere den Code zu

    #include <iostream>
    #include <fstream>
    
    int main()
    {
        using namespace std;
        ifstream in("c:\\testdok"); // 2x\\..
        if( !in.is_open() )
        {
            cerr << "Fehler: Datei nicht gefunden" << endl;
            return -1;
        }
        cout << in.rdbuf(); // Inhalt der Datei nach cout schreiben
        return 0;
    }
    

  • Mod

    Werners Variante ist sicherlich die kürzeste, aber sicherlich nicht die verständlichste, da man etwas Insiderwissen über die Streams braucht um das zu verstehen. Daher noch zwei weitere Varianten. Die erste ist etwas auf die ein Anfänger zwar vermutlich nie selber käme, bei der aber sehr klar ist was da passiert, weil es sich fast wie englische Prosa liest und daher kaum eines Kommentars bedarf:

    #include <iostream>
    #include <algorithm>
    #include <iterator>
    #include <fstream>
    using namespace std;
    
    int main()
    {
        ifstream in("c:\\testdok");
        copy (istream_iterator<char>(in),         // Vom Anfang von "in"...
              istream_iterator<char>(),           // ...bis zum Ende der Sequenz
              ostream_iterator<char>(cout));      // Ziel der Kopie
    }
    

    Und nun noch etwas, dass deiner Ursprungsidee recht nahe kommt, aber mit den Fehlern verbessert. Würde man zwar nicht unbedingt so machen, aber dann siehst du mal deine Fehler:

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main()
    {
      ifstream in("c:\\testdok");
      string zeile;    // Statt char[250], der Name sagt auch mehr aus als vorher
      while (getline(in, zeile))     // Statt read nehmen wir mal getline. Außerdem legen wir das Lesen und die Abfrage ob es erfolgreich war zusammen
        {
          cout << zeile << endl;  // Wenn erfolgreich gelesen, geben wir die Zeile aus
        }
    }
    

    Wenn du gar nichts siehst, könnte es auch hier dran liegen:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-151578.html
    Punkt 2.



  • Eisflamme schrieb:

    sag das nicht, er nutzt wenigstens int nain() (also nicht nain, aber der buchstabe ist kaputt).

    Gibts für Windows keinen Macro Recorder? Du könntest eine der F-Tasten programmieren und per ALT-ASCII das M/m erzeugen. Brauchst natürlich zwei Macros, jeweils eins für den Klein- und Großbuchstaben.
    Falls es diesen Macro Recorder nicht gibt: ALT-77 ist M und ALT-109 ist m.



  • SeppJ schrieb:

    Wenn du gar nichts siehst, könnte es auch hier dran liegen:
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-151578.html
    Punkt 2.

    Mein erster Gedanke war:
    Die Datei heißt "testdok.txt", das OS ist aber so konfiguriert, daß es bekannte Dateinamenerweiterungen nicht anzeigt ...



  • Belli schrieb:

    das OS ist aber so konfiguriert, daß es bekannte Dateinamenerweiterungen nicht anzeigt ...

    imho einer der größten MS-fails überhaupt -.-



  • Mhm, kann man auch als User-fail betrachten ...



  • Vielen Dank!
    Jetzt klappt's endlich. Und ich versteh es sogar halbwegs 😋


Anmelden zum Antworten