Leerzeichen mit fscanf einlesen



  • Hi, ich habe eine Datei, in der folgendes steht (und zwar genau folgendes!):
    Text 1\nText 2\nText3\n
    Jetzt habe ich diese Datei geöffnet (fopen) und möchte jetzt jede Zeile der Datei in einem Char-Array speichern (Test! Kein tieferer Sinn!). Das mache ich folgendermaßen:

    char text[10];
    
    (...)
    
    fscanf(pDatei, "%s", text);
    

    Jetzt ließt ja fscanf nur bis zum Leerzeichen, d.h. ich bekomme erst "Text", dann "1", dann wieder "Text", dann "2" usw. Ich möchte aber die ganze Zeile auf einmal bekommen, ohne dass ich vorher weiß, wie viele Leerzeichen eine Zeile beinhaltet.



  • Hi!

    Verwende getline und Streams!

    grüße



  • Also den Stream bekomme ich ja mit fopen zurück, aber getline hab ich grad nicht gefunden. Wie verwende ich das denn? Arbeite mit Borland.



  • Was er mit streams meinte ist eher das hier
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39469.html
    und so einen Stream bekommst du nicht von fopen zurück.



  • Gehe ich recht in der Annahme, dass es sich dann auf meine Art nicht so einfach lösen lässt?



  • Hallo

    das läßt sich sicher lösen, nur fragts du das i m falschen Forum.
    Also las dich entweder ins Ansi-C Forum verschieben oder stell dein Programm auf C++ um.

    bis bald
    akari



  • Hallo,

    geht das nicht auch irgendwie mit:

    fscanf(pDatei, "%[^\n]s", text);
    

    Kanns gerade leider net ausprobieren, weil ich kein Compiler hier habe, aber beim einlesen mit scanf(...); ging es mit [^\n] irgendwie. Aber ne andere Funktion waere vermutlich besser/eleganter 🕶

    MfG, Heimdall83



  • Erstens: Ja, das sollte funktionieren (alle Funktionen der scanf()-Familie verwenden die selben Formatkennungen).

    Zweitens: fopen() und fscanf() sind C-Funktionen und unter C++ nicht mehr üblich. "Wir" verwenden lieber IO-Streams.



  • Also, mit fscanf(pDatei, %[^\n]s", text) lese ich leider nur die erste Zeile ein (das ganze läuft in einer while-Schleife.
    Also habe ich mich mal an die Streams gemacht:

    (...)
    #include <iostream>
    #include <fstream>
    #include <iterator>
    #include <string>
    
    ifstream FileIn("texte.txt");
    if(FileIn)
    {
      for(string ReadString; getline(FileIn, ReadString););
    }
    

    Jetzt bekomme ich aber die Meldung, dass ifstream, string und getline unbekannt sind.



  • Hallo

    dann lies doch die Beispiele nochmal genau durch

    #include <iostream>
    #include <fstream>
    #include <iterator>
    #include <string>
    using namespace std;
    ...
    

    bis bald
    akari



  • heimchen schrieb:

    Also, mit fscanf(pDatei, %[^\n]s", text) lese ich leider nur die erste Zeile ein (das ganze läuft in einer while-Schleife).

    Ja, scanf() lässt das erste Zeichen im Eingabepuffer stehen, daß nicht "passt", in deinem Fall das Newline - damit erhältst du im nächsten Durchlauf eine leere Eingabezeile (das Newline steht immer noch da und markiert das Ende der Eingabe). Um weiterarbeiten zu können, müßtest du das Newline per fgetc() entsorgen.

    (ein weiterer Vorteil von getline() - der liest das abschließende Zeilenende automatisch mit und entsorgt es)

    Jetzt bekomme ich aber die Meldung, dass ifstream, string und getline unbekannt sind.

    versuch's mal, indem du überall ein "std::" davorsetzt.

    (alternativ reicht auch ein "using namespace std;" nach den #include's)



  • Oh, hab ich doch glatt überlesen. Danke 🙂


Log in to reply