Buchstabe einer Datei als Variable speichern



  • Hallo

    Ich suche eine Möglichkeit eine Datei, ohne den letzten Buchstaben, auf dem Bildschirm auszugeben und den letzten Buchstaben in einer Variablen zu speichern.

    Ich habe es auf folgende Weise probiert:

    (quelle=fopen("datei.txt","a+")); 
           fseek(quelle, 0L, SEEK_SET);
       while( (c=getc(quelle)) != '*')
          putc(c,stdout);
          fseek(quelle, -0L, SEEK_CUR);
       while( (c=getc(quelle)) != EOF)
       if (c == "b")
    	printf("gleich");
       if (c != "b")
    	printf("ungleich");
    

    * ist das Zeichen vor dem letzten Buchstaben und der letzte Buchstabe in der Datei datei.txt ist ein b
    trotzdem gibt er mir immer ungleich aus, obwohl es eigentlich gleich heißen sollte.

    Außerdem kommt noch folgende Fehlermeldung:
    aktuell.c: In Funktion »main«:
    aktuell.c:14: Warnung: Vergleich zwischen Zeiger und Ganzzahl
    aktuell.c:16: Warnung: Vergleich zwischen Zeiger und Ganzzahl

    und wenn ich c mit

    printf("%c",c);
    

    ausgeben will, ist die Ausgabe immer �.

    Ich hoffe ihr könnt mir helfen, bin hier schon fast am verzweifeln.

    Gruß Isgri



  • du musst

    if(c= 'b')
    

    machen

    also ' statt " !!!



  • sorry

    if(c== 'b')
    


  • Danke

    Jetzt gibt er aber, wenn es gleich ist gleich und ungleich aus, wenns ungleich ist aber nur ungleich
    und wenn das zweite if durch ein else ersetze, gibt er mir gleich dreimal ungleich aus und bei gleich gibt er ungleich, gleich ungleich aus
    irgendwie komisch^^

    Gruß Isgri



  • Du hast halt auch die Klammern souverän weggelassen. So sollte das gehen:

    (quelle=fopen("datei.txt","a+"));
           fseek(quelle, 0L, SEEK_SET); // auch unnötig, nach fopen() steht's nun mal am Anfang
    
       while( (c=getc(quelle)) != '*') // überliest alles bis zum ersten '*' und gibt's aus
          putc(c,stdout);
    
       fseek(quelle, -0L, SEEK_CUR);  // und noch mal von vorne ?
    
       while( (c=getc(quelle)) != '*'){ 
         if (c == 'b')
          printf("gleich");
         if (c != 'b')
          printf("ungleich");
       }
    

    In der Kürze liegt die Würze:

    while ( (c = getc( quelle))){
        if ( c == EOF || c == '*')
           break;
        putchar( c, stdout);
      }
    
      rewind( quelle);
    
      while ( (c = getc( quelle)) != EOF)
        printf( c == 'b' ? "gleich" : ungleich");
    


  • Danke

    hab deine Lösung mal ausprobiert
    als erstes kam die Fehlermeldung
    aktuell.c:14: Fehler: zu viele Argumente für Funktion »putchar«
    hab dann das putchar wieder durch putc ersetzt
    dann gabs zwar keine fehlermeldung mehr aber ganz viele ungleichs in der ausgabe

    Gruß Isgri



  • Ups - vertippt.

    Was ist eigentlich in der Datei ?



  • erst mehrere zeilen text
    dann ein * zum trennen
    und dann 1 buchstabe (kleines b)
    danach nichts mehr



  • Poste mal den kompletten Code.



  • ok, hier

    #include <stdio.h>
    #include <stdlib.h>
    int main(void) {
       FILE *quelle; 
       int c;
       char datei[20];
       long pos = 0;
           (quelle=fopen("datei.txt","a+")); 
           fseek(quelle, 0L, SEEK_SET);
       while( (c=getc(quelle)) != '*')
          putc(c,stdout);
          fseek(quelle, -1L, SEEK_CUR);
       while( (c=getc(quelle)) != EOF)
       if (c == 'b')
    	printf("gleich");
       if (c != 'b')
    	printf("ungleich");
    
    }
    

    Die datei sieht so aus

    text
    text
    text
    text
    text
    *
    b

    ist der letzte buchstabe der datei kein b kommt die meldung ungleich, ist er ein b lautet die ausgabe gleichungleich



  • Da fehlen immer noch die Klammern um das while, dann sollte es gehen.
    So wird nur die erste Anweisung nach dem while ausgeführt und es kommt
    natürlich doppelt.



  • ne, geht leider nicht

    wenn ich eine klammer um das while mach, gibts ne fehlermeldung
    und wenn ich welche um die if-anweisungen mache, dann wird die ausgabe wieder länger



  • Poste Code ... 🙂



  • hier:

    #include <stdio.h>
    #include <stdlib.h>
    int main(void) {
       FILE *quelle; 
       int c;
       char datei[20];
       long pos = 0;
           (quelle=fopen("datei.txt","a+")); 
    
       while( (c=getc(quelle)) != '*')
          {putc(c,stdout);}
          fseek(quelle, -2L, SEEK_END);
       while( (c=getc(quelle)) != EOF)
       	{if (c == 'b')
    		printf("gleich");
       	if (c != 'b')
    		printf("ungleich");}
    
    }
    


  • zefix, mach doch mal diese §%§&§%-Klammern rein, dann geht's:

    while( (c=getc(quelle)) != EOF)[b]{[/b]
           {if (c == 'b')
            printf("gleich");
           if (c != 'b')
            printf("ungleich");
    [b]}[/b]
    


  • aber das sind doch die gleichen wie ich hatte, nur das sie jetzt eine zeile drüber bzw. drunter stehen
    das sollte doch eigentlich egal sein, wo die stehen, oder?
    geht übrigens immer noch nicht.
    kann es vielleicht sein, das es irgendwie am compiler/OS liegt, dass es bei mir net geht?



  • Sorry - ich gebe das jetzt auf und buche das auf Deine Ignoranz, Beratungsresistenz und Doofheit.
    Lerne Word-Basic.

    Verplempere anderer Leute Zeit, nicht mehr meine.



  • wenn man es als beratung bezeichnet den code praktisch unverändert zurückzugeben, und zu behaupten, er funktioniere, dann kann man mich wirklich als beratungsresistent bezeichnen^^

    (wenn mir jemand erklärt wieso es einen unterschied macht, ob die { am ende der zeile steht oder am anfang der nächsten zeile, dann nehm ich alles zurück (zumindest mein compiler macht da anscheinend keinen unterschied))



  • #include <stdio.h>
    #include <stdlib.h>
    
    int main(void) {
    
       FILE *quelle;
       int c;
       char datei[20];
       long pos = 0;
    
       quelle=fopen("datei.txt","a+");
    
       while( (c=getc(quelle)) != '*')
       {
            putc(c,stdout);
       }
    
       fseek(quelle, -2L, SEEK_END);
    
       while( (c=getc(quelle)) != EOF)
       {
            if (c == 'b')
                 printf("gleich");
            if (c != 'b')
                 printf("ungleich");
       }
    }
    

    so hier der code bischen gescheid eingerückt... was geht jetzt nicht????

    P.S.: am ende solltest noch

    fclose(quelle);
    

    machen

    was passiert wenn du die erste while schleife und das fseek weg lässt? findest er dann das b?



  • BorisDieKlinge schrieb:

    while( (c=getc(quelle)) != '*')
       {
            putc(c,stdout);
       }
    

    besser so. ist lesbarer und provoziert keine 'assignment in condition' compiler-warnungen:

    for (;;)
    {
      int c = getc(quelle);
      if (c == '*')
         break;
      putc (c, stdout);
    }
    

    und dafür

    BorisDieKlinge schrieb:

    if (c == 'b')
       printf("gleich");
    if (c != 'b')
       printf("ungleich");
    

    gibts 'else'
    🙂


Anmelden zum Antworten