-
15.02.10 15:30 #1
- Registriert seit
- Jun 2007
- Beiträge
- 136
Moinz.
Ich hab hier ne wunderschöne txt-Datei, mit solchen Inhalten:
01;1234;Eins
02;567;Zwei
03;9999999;Drei
und das immer so weiter.
Jetzt will ich mit C nur die mittleren Werte auslesen und eine Datei zu öffnen ist ja nich das Problem. Ich brauch aber nicht den ersten und dritten Wert und hab mir sagen lassen, dass man mit fseek() den Pointer auf ne gewisse Stelle springen lassen kann, ausliest und weiter springt...aber ich weiß -noch- nicht wie. Oder geht das alles auch anders? Ich bin da für jeden Vorschlag offen.
-bedank-
TZP
-
15.02.10 16:20 #2
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.
Nein, fseek ist dafür unnütz, da du nicht weißt an welcher Position in der Datei eine Zeile beginnt usw.
Du könntest die Datei zeilenweise mit fgets verarbeiten und die Zeilen dann z.B. mit strtok oder sscanf verarbeiten.
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
15.02.10 16:39 #3
- Registriert seit
- Jun 2007
- Beiträge
- 136
Mmm...ich bin mir nich sicher, ob ich das richtig verstanden habe aber in der Datei beginnt jede neue Zeile an der ersten Position...also quasi immer ganz links am Rand.
-
15.02.10 16:53 #4
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
In einer Datei gibt es keine Ränder. Das was du auf dem Bildschirm siehst, wenn du die Datei in einem Editor öffnest, ist nur eine Representation der Daten in der Datei wobei Zeilenendemarkierungen (CRLF, CR bzw LF) als "Zeilenumbruch" interpretiert werden.
Eine Datei besteht aus einer Folge von Bytes. Du kannst nicht wissen an welcher Stelle z.B. ein \n Zeichen steht, ohne die Datei zu lesen.
GrußGeändert von deepthroat (15.02.10 um 17:03 Uhr)
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
15.02.10 17:26 #5
- Registriert seit
- Jun 2007
- Beiträge
- 136
Ach so, dann hab ich mir das immer falsch vorgestellt. Also zieh ich mir jede Zeile rein, springe mit scanf zum ersten ';' und lese bis zum nächsten ';' und gehe dann zur nächsten Zeile und und und. Ah...wieder was gelernt.

-bedank-
TZP
-
16.02.10 12:38 #6
- Registriert seit
- Jun 2007
- Beiträge
- 136
So....zur Hälfte hab ich´s.
Code :1 2 3 4 5 6 7 8 9 10 11 12 13
char *result; char content[2000]; .... while(fscanf(myfile, "%s", content) != EOF){ result = strtok(content ,";"); if( result == "9999999") { printf ("%s\n","gefunden" ); } printf ("%s\n",result ); } fclose(myfile); ....
Das Problem: Wenn ich ne Datei wie mein Beispiel hab, dann gibt er mir am Ende nur "Drei" aus und das war´s. Ich hätte aber gerne die Ausgabe "gefunden" aber das passiert nich. Das ist gewiss wieder nur so ne Kleinigkeit, die mich für den Rest meines Lebens verfolgen wird. :/
-
16.02.10 14:17 #7
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.
Warum nimmst du fscanf? Warum nimmst du nicht einfach fgets?
Strings kann man mit der Funktion strcmp vergleichen.
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
16.02.10 14:30 #8
- Registriert seit
- Jun 2007
- Beiträge
- 136
Das mit fgets war doch die bessere Lösung. Allerdings kann ich mich mit strcmp nich wirklich anfreuden. Wenn ich das richtig sehe, kann man damit nur ganze Strings vergleichen. Ich möchte aber, dass er nur den mittleren Teil ausgibt, wenn er wirklich gefunden werden sollte.
Wobei ich gerade feststelle, dass ich mich eh total falsch formuliert habe.
Die Idee ist, dass jemand eine Zahl eingibt...sagen wir mal 2612345. Eine txt-Datei könnte dann so aussehen.
01;36;Test1
02;2612;Test2
03;345;Test3
Jetzt soll mit der Usereingabe in der txt-Datei gesucht werden und wenn ein oder mehrere Teile in den mittleren Einträgen gefunden wurden, soll der/die ganz rechten Einträge zurück kommen. In dem Fall wäre das dann Test2 und Test3. Ich bin doch der Meinung, dass strtok da nich verkehrt ist aber fummel mir noch die genaue Funktionsweise zusammen, bin aber guter Dinge.
-
16.02.10 15:57 #9
- Registriert seit
- Jun 2007
- Beiträge
- 136
Hmhm...wieder einen Schritt weiter aber immer noch nich am Ziel. Momentan sieht es so aus:
Code :1 2 3 4 5 6 7 8 9
while((fgets(content, 40, myfile)) != NULL){ result = strtok(content, ";"); result = strtok(NULL, ";"); if(*result == *"04567830"){ printf ("%s\n",result ); break; } }
Das Lustige daran ist, dass er so "36" ausgibt und wenn ich den Break weglasse, kommt er zu "345"...so als ob die Abfrage innerhalb der If-Anweisung keine Wirkung hat. Sehr strange.
Geändert von Teilzeitphilosoph (17.02.10 um 09:21 Uhr)
-
16.02.10 16:25 #10
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Natürlich hat die if-Abfrage eine Wirkung. Du prüfst ob der erste Buchstabe von result (das hoffentlich nicht NULL ist!) gleich dem Zeichen '0' ist.
Um Strings zu vergleichen mußt du eine der Stringvergleichsfunktionen verwenden (z.B. strncmp) oder was soll die Bedingung des if bedeuten?
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Je nach Dateiformat (Whitespaces etc.) müsste doch auch einfach dieses hier funktionieren.
Code cpp:1
fscanf(myfile,"%*d;%d;%*s\n",&ivar);
Das '*' unterdrückt die Zuweisung ungewünschter Felder an Variablen.Vielen Dank für die Nutzung des Bewerten- und Danke-Buttons
Wenn man sieht, dass man einen anderen glücklich gemacht hat, ist die Welt um zwei glückliche Menschen reicher.
-
17.02.10 09:21 #12
- Registriert seit
- Jun 2007
- Beiträge
- 136
Ich hab´s jetzt so lösen können.
Code :1 2 3 4 5 6 7 8 9 10 11
while((fgets(content, 50, myfile)) != NULL){ prefix = strtok( content, ";"); prefix = strtok( NULL, ";"); result = strstr("2612345",prefix); if(result){ printf ("%s\n",result); break; }else{ printf ("%s\n", "Nüscht"); } }
Das sieht soweit gut aus.
-
Das hier müsste auch funktionieren
Code cpp:1 2 3 4 5 6 7
while( fscanf(myfile,"%*ld;%ld;%s\n",&lvar,str) == 2){ if(lvar == 2612345 ){ printf ("%s\n",str); break; }else{ printf ("%s\n", "Nüscht"); }
Vielen Dank für die Nutzung des Bewerten- und Danke-Buttons
Wenn man sieht, dass man einen anderen glücklich gemacht hat, ist die Welt um zwei glückliche Menschen reicher.
-
17.02.10 09:50 #14
- Registriert seit
- Jun 2007
- Beiträge
- 136
Mit fscanf hab ich noch n paar Probleme, da ich die Syntax nich komplett kapiere. Ma gucken, ob ich es hinkriege. Korrigiere mich bitte.

myfile ist klar. Dann gebe ich n Pointer auf ne long int aus, noch n longint und dann nen String...also meine drei Werte aus der txt, gefolgt von einem Zeilenumbruch.
lvar und str...mhm..gute Frage. Und das 2 müsste für die zweite Stelle stehen. Würde das auch klappen, wenn ich z.B.
1009;234;Bla
hätte? Ja, ich bin noch kein Pro aber ich will es lernen.
Geändert von Teilzeitphilosoph (17.02.10 um 09:52 Uhr)
-
So ähnlich, aber anders.

fscanf funktioniert wie scanf, nur eben auf Files. Der erste Parameter ist der Dateizeiger, richtig. Der zweite Parameter ist der Formatstring. Dort werden drei Felder mit dem %-Zeichen deklariert, aber das erste Feld wurde mit %*ld deklariert; das Sternchen weist die Funktion an, dieses Feld nicht einer Variablen zuzuweisen, deswegen sind nur zwei Variablen in der Parameterliste. Es wird also das erste Feld ignoriert, das zweite Feld an lvar zugewiesen, und das dritte Feld landet im String str. Der Returnwert von fscanf ist EOF oder die Anzahl der erfolgreich zugewiesenen Variablen.
Zur letzten Frage: ja.
Genaueres über den Formatstring und seine Möglichkeiten findest du in dieser fscanf-Doku.Vielen Dank für die Nutzung des Bewerten- und Danke-Buttons
Wenn man sieht, dass man einen anderen glücklich gemacht hat, ist die Welt um zwei glückliche Menschen reicher.
Ähnliche Themen
-
Bestimmte Werte aus Zellen auslesen
Von oliver02 im Forum Office-AnwendungenAntworten: 3Letzter Beitrag: 03.11.10, 20:22 -
bestimmte Werte aus string auslesen
Von pepsi_gx im Forum C/C++Antworten: 2Letzter Beitrag: 03.08.09, 12:04 -
Aus DB Bestimmte werte auslesen
Von creativeheadz im Forum PHPAntworten: 11Letzter Beitrag: 02.02.06, 18:43 -
Tabellen auslesen und bestimmte Werte übernehmen
Von dfp im Forum Delphi, Kylix, PascalAntworten: 3Letzter Beitrag: 31.07.02, 13:44 -
Bestimmte Werte auslesen [EILT!!]
Von neo2kone im Forum Relationale DatenbanksystemeAntworten: 1Letzter Beitrag: 08.10.01, 01:29



2Danke

Zitieren

Login






