Putc() wirkungslos , Text einer Datei veraendern



  • Hallo liebe Forumbenutzer .

    Habe eine Frage und zwar :

    Ich schreibe eine Funktion ,dass alle Großbuchstaben einer Textdatei in Kleinbuchstaben umwandelt .
    Ich kann zwar jedes Zeichen auslesen und es erkennt auch ob es ein Großbuchstabe ist jedoch kann ich es nicht verändern.
    Sprich die Textdatei bleibt unverändert wenn ich das Programm ausführe .

    Dies waere der Code :

    void TextToLower(FILE *FP) //File Pointer für Funktion = Parameter
    {
         int temp;  
    
         FP=fopen("Text.txt","rw");  // File Pointer wird  "die Datei zugewiesen "  .  Außerdem wird die Datei Text.txt geöffnet in
                                     // in der bereits  etwas steht
    
         if(FP==NULL) 
                     {
                     printf("Es ist ein Fehler aufgetreten \n\n"); // Klassisches BLABLA
    
                     }
    
         else
         {
    
             printf("Die grossgerschrieben Buchstaben sind :\n"); // Klassisches BLABLA
    
             while((temp=fgetc(FP))!=EOF)                  // Wird solange gemacht bis das Dateiende erreicht ist. Durch Aufruf von fgetc wird der FP um 1 groeßer 
                           {if(temp>='A'&&temp<='Z')       // Falls das momentane Zeichen ein Großbuchstabe ist 
                                                    {
                                                           printf(" %c \n",temp);  // nun wird das momentane Zeichen ausgegeben.  
                                                           fputc(temp+32,FP);      // hier " sollte " der Großbuchstabe durch einen Kleinbuchstaben ersetzt werden 
                                                                                   // daher wird zum zu temp 32 dazugezählt siehe ASCCI-Tabelle
    
                                                    }
    
                           }                        
    
          fclose(FP);                 // Datei wird geschlossen 
    
         }
    
    }
    

    Kann man mit putc nur einen Wert schreiben aber nicht veraendern ??
    Oder wieso funktioniert das nicht ?

    Ich bedanke mich schon mal im Vorraus fuer die Hilfe .

    P.s warum wird ( V o r r a u s ) zensiert ? 😃



  • "rw" ist keine gültige Option für fopen.
    Es gibt "r+" oder "w+" (und "a+") für das Öffnen zum lesen und schreiben.

    Zudem steht der Schreib/lesezeiger nach dem lesen auch nicht mehr auf dem gelsenen Buchstaben sondern dahinter.
    Öffne eine 2. Datei zum schreiben und kopiere die Daten da rein.

    xXiTzAdi schrieb:

    P.s warum wird ( V o r r a u s ) zensiert ?

    Weil das zuviele so schreiben und das so nicht in Duden steht.


  • Mod

    FILE *FP=fopen("Text.txt","r+b");  
    int character;
    
    while((character=fgetc(FP))!=EOF) 
    {
      fseek(FP, -1, SEEK_CUR);
      fputc(toupper(character), FP);
    }
    
    fclose(FP);
    


  • D.h

    Ich schreib statt "rw" einfach "r+" .
    Ich nehme an du meinst mit

    nach dem lesen

    den Aufruf von fgetc in der while Bedingung .
    Dass der Lese bzw Schreibzeiger auch nach Aufruf von fputc um 1 weiterrückt ist mir klar .

    Jedoch verstehe ich nicht ganz wieso ich eine 2 Datei benötige dass wird doch wohl auch so möglich sein ?

    Oha wusste gar nicht ,dass es voraus heißt wieder was dazu gelernt 😃 .



  • Ahh das ist ja noch was dazugekommen werde es gleich mal ausprobieren ..


  • Mod

    edit: Was hier stand war falsch, war nicht portabel.



  • So den Modus habe ich jetzt auf r+b geändert und in der while Schliefe die Seek- Funktion miteinbezogen . Jedoch habe ich jetzt eine Endlosschleife die mir immer den 1.ten Großbuchstaben ausgibt .
    Das toupper in der seek funktion habe ich durch tolower ersetzt da ich ja die Großbuchstaben in Kleinbuchstaben umwandeln will .

    while((temp=fgetc(FP))!=EOF)                  // Wird solange gemacht bis das Dateiende erreicht ist. Durch Aufruf von fgetc wird der FP um 1 groeßer 
                           {if(temp>='A'&&temp<='Z')       // Falls das momentane Zeichen ein Großbuchstabe ist 
                                                    {
                                                           printf(" %c \n",temp);  // nun wird das momentane Zeichen ausgegeben.  
                                                           fseek(FP,-1,SEEK_CUR);  // Dadurch geht der Dateizeiger an die Position 1 davor
                                                           fputc(tolower(temp),FP);      // hier " sollte " der Großbuchstabe durch einen Kleinbuchstaben ersetzt werden 
    
                                                    }
    
                           }
    


  • Statt if(temp>='A'&&temp<='Z') nimmst du besser if(isupper(temp))



  • DirkB schrieb:

    Statt if(temp>='A'&&temp<='Z') nimmst du besser if(isupper(temp))

    Blöde Frage und zwar wieso ist es besser statt if(temp>='A'&&temp<='Z') if(isupper(temp)) zu schreiben ??? Auf jeden Fall hab ich's gemacht . Ändert jedoch nichts an der Lage mein Problem bleibt bestehen.

    . Jedoch habe ich jetzt eine Endlosschleife die mir immer den 1.ten Großbuchstaben ausgibt .
    Das toupper in der seek funktion habe ich durch tolower ersetzt da ich ja die Großbuchstaben in Kleinbuchstaben umwandeln will .

    wäre dankbar für Hilfe



  • Ich erinnere mich düster daran, daß gemischtes Lesen und Schreiben in der selben Datei etwas problematischer sein konnte, wenn du die Dateiposition nicht zwischendurch angleichst. Da könnte ein fflush(FP); oder fseek(FP,0,SEEK_CUR); möglicherweise helfen.

    PS: @isupper(): Es hat einfach den Vorteil, daß es klarer ausdrückt, was du willst - und es ist außerdem EBCDIC-kompatibel 😉



  • Danke jetzt haut es hin .


Anmelden zum Antworten