Problem mit fscanf, wenn Leerzeichen in der Zeile

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 (:wink: 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?

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

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

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

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

Sorry,
hab´ mich wohl vertippt ;o)

Lydia

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

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

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 (das C++ Aequivalent zu string x[…]). stats ist eine Klasse, die ueber die Ausgewerteten Files und aufgetretene Fehler Buchfuehrt.

#include
#include

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