stringdaten anhand von trennzeichen extrahieren
-
hallo, (sorry, aber besseres topic ist mir nicht eingefallen)
wir schreiben im informatik unterricht ein progrämmchen und meine aufgabe ist es die daten aus einer datei zu extrahieren und auszugeben ..
beispieldatei:
martin:müller:14:3:7
kasper:fred:16:2:5
uwe:schulze:12:6:2ich muss also die zeilen lesen und jede anhand des trennzeichens ":" aufspalten .. gibt es einen mir unbekannten befehl der dies bereits machen kann?
realisieren würde ich das momentan ungefähr so:
char carray[5]; int x=0,y=0; for(i=0;i<zeilenlaenge;i++) // zeile zeichen für zeichen durchgehen { if(strcmp(zeile[i+1],":")==0) // schauen ob nächstes zeichen ein trennzeichen ist { // wenn ja, dann y++; // index des array erhöhen x=0; // wortlänge auf 0 setzen } carray[y][x]=zeile[i]; // dem wort ein buchstaben hinzufügen x++; // buchstabenzähler }
das aber extrem doof so und glaub ja nicht grad optimal(falls es überhaupt klappt ^^) .. zumal das trennzeichen so auch nur ein zeichen sein darf, etc etc
kann mir bitte irgendwer nen rat geben .. am schönsten wäre es falls jemand schonmal so ein problem hatte seine lösung oder sowetwas hier posten könnte ..
bitte!!
-
such mal nach der funktion fscanf
da kannste das direkt filtern:
dummy = fscanf (FileStream, "%s:%s:%i:%i:%i\n", string1, string2, zahl1, zahl2, zahl3);
%s ist hierbei der platzhalter für einen string (char*)
%i ist ein platzhalter für ein integer
-
Ich würd ein char nehmen, das mithilfe von get(char) die Datei durchläuft. Wenn das char kein ":" ist häng ich es an einen String aus einem (erweiterbarem) std::vector<string> an.
-
std::string & getline mit find
strtok könnte auch helfen.
-
@ulath .. das klingt interessant aber ich weiss auch das scanf unf fscanf doch paar macken haben und öfters das tun was ich net grad will
@Glamdrink .. jor das mit vector sagten schon viele aber ne hilfe die mir jetzt wirklich mal erklärt wie vector funktionieren soll habe ich leider noch nicht gefunden .. ich suche aber weiter da das wohl die beste lösung sein sollte
@Knuddlbaer .. mit string habe ich noch nie gearbeitet .. was für eine bibliothek brauch ich dafür? kannst mir kleines tutorial empfehlen?
thx für eure antworten
-
ich habe bis jetzt eigentlich noch nie probleme mit fscanf gehabt wenn man es korrekt anwendet .. also wnen du nicht gerade das trennzeichen mit in einem deiner teilstrings hast dürfte das ohne probs gehen! in diesem fall würdest du aber sehr warscheinlich auch mit einer eigenen methode probleme haben. und solche sachen wie das \n am ende der zeile sollte man natürlich auch net vergessen . sonnst kommt schon mal humburg raus ..
aus der msdn:
Each of these functions returns the number of fields successfully converted and assigned; the return value does not include fields that were read but not assigned. A return value of 0 indicates that no fields were assigned. If an error occurs, or if the end of the file stream is reached before the first conversion, the return value is EOF for fscanf and fwscanf.-> damit kannst du sehr gut kontrollieren ob richtig eingelsen wurde !
ps: die funktion fscanf bietet dir nullterminierte strings zurück. achte auch darauf das du den teilstring nicht zu kurz definierst dann kann der nullterminator nicht angehängt werden und dann bekommste allerdings fehler.
(nur mal sonnen par sachen um fehlern vorzubeugen :))
-
also ok ich ahbe es mal versucht, aber leider ohne erfolg
textdatei test.txt
inhalt "123;456"quellcode
FILE *xxx;
char a[5],b[5];xxx = fopen(datei, "rt"); // auch rb probiert
fscanf(xxx,"%s;%s",a,b);ausgabe: a=>"123;456"
b=> kryptische ascii zeichenwas mach ich falsch?
-
versuch mal anstatt %s für string .. %i und nen integer zu nehmen
-
Strings mit fscanf in statische Buffer lesen, die dann 5 Zeichen lang sind? Autsch. Probier doch mal lieber, das mit den C++-Teilen der Standardbibliothek hinzukriegen...