Seltsames beim Auslesen einer Textdatei



  • Hallo,

    das nachstehende Programm liefert folgenden Output beim Auslesen der Datei:

    Datensatz Nr. 1 Eine
    Datensatz Nr. 2 Textzeile

    Also scheint er aus irgendwelchen Gründen nur bis zum ersten Blank auszulesen und nicht zeilenweise bis zum \n.

    Der Versuch nach dem Öffnen mit

    while (!EOF)

    zu arbeiten, scheitert auch, er überspringt die Schleife, weil offenbar schon EOF angezeigt wird (Zeiger am Dateiende?).

    Mit C ist es so: Im prinzip alles klaro, nur der Teufel steckt im Detail!

    Gruß Pascal2009

    #include <cstdlib>
    #include <iostream>
    #include <fstream>
    #include <sstream>

    using namespace std;
    void schreiben();
    void lesen();

    char dname[80]="Testdatei2.txt";
    char buffer[80]="Eine Textzeile fuer die Datei\n";

    int zaehler=0;
    int main ( )
    {
    schreiben();
    lesen();
    system("PAUSE");
    return 0;
    }

    void schreiben()
    {
    ofstream datei1;
    datei1.open (dname);
    if (!datei1)
    {
    printf("Fehler beim Oeffnen der Datei %s\n",dname);
    }
    else
    {
    printf("Datei %s wurde gefunden\n",dname);
    datei1 << buffer;
    datei1 << buffer;
    datei1.close();
    }
    }

    void lesen()
    {
    ifstream datei1;
    datei1.open (dname);
    if (!datei1)
    {
    printf("Fehler beim Oeffnen der Datei %s\n",dname);
    }
    else
    {
    printf("Datei %s wurde gefunden\n",dname);
    while (zaehler<2)
    {
    zaehler++;
    datei1 >> buffer;
    printf("Datensatz Nr. %i = %s\n",zaehler,buffer);
    } // while
    datei1.close();
    } // else
    } //void



  • Die EOF Funktion wurde inzwischen integriert mit:

    while (!datei.eof())

    Er bleibt aber dabei, Wort für Wort auszulesen anstattt zeilenweise.



  • So geht es, er macht es zeilenweise, der Code sieht aber noch etwas sschrecklich aus: 😉

    Wie würde man das in C etwas eleganter formulieren können?

    void lesen2()
    {
    int zaehler=0, abbruch=1;
    ifstream datei1;
    std::ifstream in (dname);
    while (abbruch !=0)
    {
    zaehler++;
    datei1 >> buffer ;
    printf("Datensatz Nr. %i = %s\n",zaehler,buffer);
    if (datei1.eof()) // steht auf EOF, aber der letzte datensatz muß nohc raus
    {
    datei1 >> buffer ;
    printf("Datensatz Nr. %i = %s\n",zaehler,buffer);
    abbruch=0;
    }
    } // while
    } //void



  • Du hast schon über 30 Beiträge und weißt noch nicht
    wie du die Codetags nutzen kannst?

    Meiner Ansicht nach keine schöne Idee
    printf in C++ zu nutzen.

    Du fragst nach C, wo printf richtig wäre, und gibst
    C++ Header vor?

    Versuche dich zu entscheiden C oder C++

    MfG f.-th.



  • f.-th. schrieb:

    Versuche dich zu entscheiden C oder C++

    MfG f.-th.

    Weißt du, man muß sich erstmal ein bißchen rumprobieren und kann das nicht vorher entscheiden. Weil man gar nicht die Infos dazu hat.

    Für die Konsolenprogrammierung käme ich mit Ansi C ganz sicher hin, möglicherweise wäre es aber viel besser, gleich mit visualc oder sowas anzufangen, damit man eine Schnittstelle zum Benutzer hat. Das scheint ja bei C irgendwie der Schwachpunkt zu sein.

    Also laß mich noch ein bißchen rumprobieren, solche Entscheidungen, wo man sich mit viel Zeitaufwand einarbeitet, mache ich ganz in Ruhe und ohne Hektik.

    MfG Pascal2009



  • Ich habe mir jetzt einmal visualC# angesehen, und wenn man sieht, mit welcher Leichtigkeit man da eine Windows-Applikation aufbauen kann, ist das auf jeden Fall eine Überlegung wert.

    Die Hilfe ist sehr gut aufgebaut, mit Videos und so. Ich werd mir das die Tage mal näher betrachten.

    Das große Problem mit der Konsolenprogrammierung ist, wo man eine professionelle Windows-Bedienerschnittstelle hernehmen soll.

    Wie es aussieht, ist visualc# dazu durchaus in der Lage.

    MfG Pascal2009



  • pascal2009 schrieb:

    Für die Konsolenprogrammierung käme ich mit Ansi C ganz sicher hin, möglicherweise wäre es aber viel besser, gleich mit visualc oder sowas anzufangen, damit man eine Schnittstelle zum Benutzer hat. Das scheint ja bei C irgendwie der Schwachpunkt zu sein.

    Scheinbar gehst du mit deinem Pascal-Hintergrund irgendwie noch davon aus, dass eine Programmiersprache Funktionen fuer "Schnittstelle[n] zum Benutzer", Fenster etc. gleich mitzubringen hat. Ist bei C und Konsorten idR. aber nicht der Fall. Die bringen idR. erstmal nur das Noetigste mit. Wenn du einfache Schnittstellen und Funktionen wie in Pascal haben willst, musst du dir erstmal extra Libs besorgen, die diese Funktionen implementieren (bei Pascal kam das in Form von TurboVision eben zT. freihaus).
    Ansonsten kann man in C im Grunde genau so schoen "Benutzerschnittstellen" implementieren wie in C++ oder "visualC" und es ist allemal naeher an Pascal als C++.

    Uebrigens ist das in deinem Code so gesehen fast kein C mehr, sondern eher schlechtes C++ und ist damit potentiell hier im falschen Forum.

    pascal2009 schrieb:

    Also laß mich noch ein bißchen rumprobieren, solche Entscheidungen, wo man sich mit viel Zeitaufwand einarbeitet, mache ich ganz in Ruhe und ohne Hektik.

    Ok, aber 2 Vorschlaege/Bitten:
    1. Informiere dich wenigstens erstmal grundlegend ueber die Konzepte und Unterschiede von C und C++.
    2. Nachdem du das getan hast, probiere erstmal ein wenig fuer dich allein herum und entscheide dich dann fuer eins von beidem (evtl. auch fuer einen brauchbaren compiler) und entsprechend auch fuer das korrekte Forum - C oder C++.
    Falls du wild mit einem C++-Compiler wie dem von Microsofts Visual Studio am Probieren sein solltest, kannst du in dieser Mischphase wahrscheinlich nicht viel verkehrt machen, wenn du dich bei wirklich schwierigen Problemen mit Codes an die C++-Leute wendest. 😉



  • pascal2009 schrieb:

    Ich habe mir jetzt einmal visualC# angesehen, und wenn man sieht, mit welcher Leichtigkeit man da eine Windows-Applikation aufbauen kann, ist das auf jeden Fall eine Überlegung wert.

    Fuer kleine Programme/GUI-Gedings sind Java und C# ggF. in der Tat eher geeignet als C oder C++. Die haben allerdings auch eigene Foren, da eigene Sprachen.

    pascal2009 schrieb:

    Das große Problem mit der Konsolenprogrammierung ist, wo man eine professionelle Windows-Bedienerschnittstelle hernehmen soll.

    Meinst du eine Lib, die dich Fenster im Textmodus in der Konsole erstellen laesst, oder was? Dazu brauchst du fuer C# und Java allerdings AFAIK auch extra Libs. ncurses sollte das z.B. koennen. Und so weit ich weiss gibt es beim Borland-C-Compiler nach wie vor TurboVision.

    pascal2009 schrieb:

    Wie es aussieht, ist visualc# dazu durchaus in der Lage.

    Siehe oben. Und wie gesagt, Fragen zu C# bitte in das C#-Forum.



  • pascal2009 schrieb:

    So geht es, er macht es zeilenweise, der Code sieht aber noch etwas sschrecklich aus: 😉

    Wie würde man das in C etwas eleganter formulieren können?

    So würde ich es machen ... (aufruf mit "prog < text.txt")

    int getline(char buffer[], int maxlen) {
        char c;
        int i;
    
        for(i = 0; i < maxlen - 1 && (c = getchar()) != EOF && c != '\n'; i++)
            buffer[i] = c;
    
        if(c == '\n') {
            buffer[i] = c;
            i++;
        }
    
        buffer[i] = '\0';
        return(i);
    }
    
    int main(void) {
        char buffer[BUFSIZ];
        int len;
    
        while((len = getline(buffer, BUFSIZ)) > 0) {
            // mach was mit buffer ....
        }
        return(0);
    }
    


  • @pascal2009: nach deinen 40 Posts kann ich nur eins sagen: statt wild rumzuprobieren, kauf dir ein gutes Buch und liest es durch.


Anmelden zum Antworten