Problem mit fscanf, wenn Leerzeichen in der Zeile

Von: , Frage gestellt am Mo, 4. Dez 2000

Hallo zusammen
Ich möchte eine Textdatei (mit einem bestimmten Aufbau) einlesen und in eine interne Tabelle (Array) stellen. Der Aufbau einer Zeile in der Textdatei sieht so aus: {x};{y}
{x} stellt eine Menge von Zeichen dar, d.h. entweder einzelne Worte oder oder ein ganzer Satz. {y} stellt ebenfalls eine Menge von Zeichen dar, die sich hinter dem Semikolon (;) befinden. Beispieldatei (analog EXCEL-CSV-Format):

Flugzeug;Fahrzeug für die Luft
Auto;Fahrzeug auf der Strasse
Nudeln;Nahrungsmittel

Diese Zeilen sollen in eine Tabelle (Array) übergeben werden. Nur leider habe ich das Problem, dass mit fscanf(infile, "%s", s ) jedes Leerzeichen als Zeilenende interpretiert wird (steht so auch in der Doku).

z.B. aus

Flugzeug;Fahrzeug für die Luft

wird

Flugzeug Fahrzeug
für
die
Luft

Wer weiss eine Lösung?

7 Antworten zu dieser Frage

  1. Antwort von nach einer Stunde hilfreich
    Re: Problem mit fscanf, wenn Leerzeichen in der Ze

    Hi, Diese Zeilen sollen in eine Tabelle (Array) übergeben werden.
    Nur leider habe ich das Problem, dass mit fscanf(infile, "%s",
    s ) jedes Leerzeichen als Zeilenende interpretiert wird (steht
    so auch in der Doku).

    Wer weiss eine Lösung?
    Kannst Du kein C++ benutzen? Fscanf hat mich auch schon verschiedentlich zur Verzweiflung gebracht, verhaelt sich manchmal verdammt komisch. Also solltest Du C++ verwenden koennen: in der STL gibt es einige Klassen, die Dir helfen werden (string, ifstream ...). Ich meine ifstream hat eine member funktion namens getline ...

    Gruss

    Thorsten

    • Antwort von nach einem Tag hilfreich
      Re^2: Problem mit fscanf, wenn Leerzeichen in der

      Hi Thorsten

      Deine Idee klingt interessant. Ich hab's zwar mit Lydias Lösung auch hingekriegt, würde aber gerne den Versuch mit C++ wagen.
      Hast du ein Beispeil?

      Danke

      SOI

      • Antwort von nach einem Tag hilfreich
        Re^3: Problem mit fscanf, wenn Leerzeichen in der

        Hi,

        Ok, ein Beispiel aus meinem Code. Die folgende Funktion gehoert zu einer Klasse, die Parameterfiles liest und auswertet. SmartString ist eine Klasse, die die standard C++ Klasse string um einige Funktionen erweitert. Fuer Deine Zwecke kannst Du SmartString durch string ersetzen. lines ist ein Member von Parfilereader und vom Typ vector<string> (das C++ Aequivalent zu string x[...]). stats ist eine Klasse, die ueber die Ausgewerteten Files und aufgetretene Fehler Buchfuehrt.

        #include <string>
        #include <iostream>

        void ParFileReader::read_file(const SmartString& file_name) {
        int oldsize = lines.size();
        ifstream in(file_name.c_str());
        SmartString line;
        while(getline(in, line))
        lines.push_back(line);
        if(!(lines.size() - oldsize)) stats.fE(file_name);
        stats.fi();
        }

        Gruss

        Thorsten

  2. Antwort von nach einer Stunde hilfreich
    Re: Problem mit fscanf, wenn Leerzeichen in der Ze

    Hallo,

    folgendes wird Dir weiter helfen:

    while (fscanf(input, "[^\n]\n", temp) != EOF)
    do_something(temp);

    Lydia

    P.S.: Achte evtl. auf unterschiedliche Formate bei Unix u. Dos

    • Antwort von nach 3 Stunden hilfreich
      Re^2: Problem mit fscanf, wenn Leerzeichen in der

      Hi,

      als Nachtrag noch eine Möglichkeit:

      while (fgets(szBuffer, iBufferSize, inputFile))
      do_something(szBuffer);

      Der Vorteil dieser Methode wäre die Unabhängigkeit vom
      Format, da die Lib für jede Platform entsprechenden Format
      unterstützen würde.

      Lydia

    • Antwort von nach 5 Stunden hilfreich
      Re^2: Problem mit fscanf, wenn Leerzeichen in der

      Hallo Lydia

      Vielen Dank für den Hinweis.
      fscanf(input, "[^\n]\n", temp) führte zu einer endlos-schleife.
      ein % vor dem [^\n], dh fscanf(input, "%[^\n]\n", temp) funktionierte dann einwandfrei.

      ciao

      soi

      • Antwort von nach 21 Stunden hilfreich
        Re^3: Problem mit fscanf, wenn Leerzeichen in der

        Sorry,
        hab´ mich wohl vertippt ;o)

        Lydia [Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Keine passende Antwort gefunden? Jetzt eigene Frage stellen!