tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
NEIN
ANTWORTEN
18
ZUGRIFFE
872
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Teilzeitphilosoph Teilzeitphilosoph ist offline Mitglied Gold
    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
     

  2. #2
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    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.

  3. #3
    Teilzeitphilosoph Teilzeitphilosoph ist offline Mitglied Gold
    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.
     

  4. #4
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von Teilzeitphilosoph Beitrag anzeigen
    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.
    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.

  5. #5
    Teilzeitphilosoph Teilzeitphilosoph ist offline Mitglied Gold
    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
     

  6. #6
    Teilzeitphilosoph Teilzeitphilosoph ist offline Mitglied Gold
    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. :/
     

  7. #7
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    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.

  8. #8
    Teilzeitphilosoph Teilzeitphilosoph ist offline Mitglied Gold
    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.
     

  9. #9
    Teilzeitphilosoph Teilzeitphilosoph ist offline Mitglied Gold
    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)
     

  10. #10
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von Teilzeitphilosoph Beitrag anzeigen
    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.
    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.

  11. #11
    Avatar von Vereth
    Vereth Vereth ist offline Mitglied Brokat
    Registriert seit
    Nov 2009
    Ort
    Dortmund
    Beiträge
    372
    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.

  12. #12
    Teilzeitphilosoph Teilzeitphilosoph ist offline Mitglied Gold
    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.
     

  13. #13
    Avatar von Vereth
    Vereth Vereth ist offline Mitglied Brokat
    Registriert seit
    Nov 2009
    Ort
    Dortmund
    Beiträge
    372
    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.

  14. #14
    Teilzeitphilosoph Teilzeitphilosoph ist offline Mitglied Gold
    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)
     

  15. #15
    Avatar von Vereth
    Vereth Vereth ist offline Mitglied Brokat
    Registriert seit
    Nov 2009
    Ort
    Dortmund
    Beiträge
    372
    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.
    Teilzeitphilosoph bedankt sich. 
    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

  1. Bestimmte Werte aus Zellen auslesen
    Von oliver02 im Forum Office-Anwendungen
    Antworten: 3
    Letzter Beitrag: 03.11.10, 20:22
  2. bestimmte Werte aus string auslesen
    Von pepsi_gx im Forum C/C++
    Antworten: 2
    Letzter Beitrag: 03.08.09, 12:04
  3. Aus DB Bestimmte werte auslesen
    Von creativeheadz im Forum PHP
    Antworten: 11
    Letzter Beitrag: 02.02.06, 18:43
  4. Tabellen auslesen und bestimmte Werte übernehmen
    Von dfp im Forum Delphi, Kylix, Pascal
    Antworten: 3
    Letzter Beitrag: 31.07.02, 13:44
  5. Bestimmte Werte auslesen [EILT!!]
    Von neo2kone im Forum Relationale Datenbanksysteme
    Antworten: 1
    Letzter Beitrag: 08.10.01, 01:29