Strings in der Datei ersetzen



  • Hallo,

    ich möchte in einer Datei ein string ersetzen und zwar "jpg" durch "jpeg".

    Wie kann man sowas machen ohne die replace-Funktion zu verwenden?

    Danke



  • Die Datei sieht so aus:

    <tag id="1" img="jpg">
     data, data, data
     data, data, data
     data, data, data
     data, data, data
    </tag>
    

    und daraus will ich:

    <tag id="1" img="jepg">data, data, data, data, data, data, data, data, data, data, data, data</tag>
    

    Hat jemand einen Beispiel?



  • Vorschlag:

    - Ursprungsdatei lesbar öffnen, Zieldatei schreibend öffnen.
    - Soviel Speicher reservieren wie groß Ursprungsdatei ist.
    - Datei in den Buffer einlesen (komplett).
    - mit strstr() nach "jpg" suchen, alles vor dem jeweiligen "jpg" direkt in Zieldatei schreiben, dann "jpeg" schreiben, wiederholen bis strstr() == NULL.
    - Dateien schliessen.
    - evtl. noch Ursprungsdatei löschen und Zieldatei umbenennen.



  • TactX schrieb:

    - Soviel Speicher reservieren wie groß Ursprungsdatei ist.

    Ich bin in C neu und wie groß, so groß?

    BUFSIZE = sizeof(pointerOfFile);
    char *buff = new char[BUFSIZE]; 
    
    ...
    
    delete []buff;
    


  • Zahl der Zeichen in Datei (aus FAQ ;))

    Und Speicher reservieren und freigeben machen wir in C mit malloc() und free(). new und delete ist C++.



  • TactX schrieb:

    Und Speicher reservieren und freigeben machen wir in C mit malloc() und free(). new und delete ist C++.

    Danke! Ich habe mal hier was ausprobiert und was meinst du dazu:

    ...
    int size = 1;
    
    while((getc(pointerToFile)) != EOF) {size++;}
    
    fseek(pointerToFile, 0, SEEK_SET);
    ...
    


  • Sollte auch funktionieren.



  • TactX schrieb:

    - Datei in den Buffer einlesen (komplett).

    Irgendwie kriege ich es nicht hin:

    while(!feof(pointerToFile)){
    
    fgets(buff, sizeOfFile, pinterToFile);
    
    printf("BUFF %s\n", buff);
    
    }
    

    BUFF wird nicht angezeigt und die Datei ist nicht leer... 😞



  • shuriko schrieb:

    BUFF wird nicht angezeigt und die Datei ist nicht leer... 😞

    Ah, ok! Mein Fehler! Ich habe "fseek" vergessen!



  • TactX schrieb:

    - Datei in den Buffer einlesen (komplett).

    Warum kriege ich Memory fault, wenn ich die Datei mit fread lese:

    int size = 1;
    
    while((getc(pointerToFile)) != EOF) {size++;}
    
    fseek(pointerToFile, 0, SEEK_SET);
    
    fread(buff, size, 1, pointerToFile);
    
    printf("BUFF: %s\n", buff);
    


  • Sicher, dass du für buff schon Speicher reserviert hast? Das kannst du ja erst nachdem du die Größe der Datei ermittelst hast.



  • TactX schrieb:

    Sicher, dass du für buff schon Speicher reserviert hast? Das kannst du ja erst nachdem du die Größe der Datei ermittelst hast.

    Ja, das habe ich nun kenne ich die new-Methode. Die malloc ist mir nicht klar:

    #define SIZE 1024
    
    char *buff = new buff[SIZE];
    


  • shuriko schrieb:

    TactX schrieb:

    Sicher, dass du für buff schon Speicher reserviert hast? Das kannst du ja erst nachdem du die Größe der Datei ermittelst hast.

    Ja, das habe ich nun kenne ich die new-Methode. Die malloc ist mir nicht klar:

    #define SIZE 1024
    
    char *buff = new buff[SIZE];
    

    Ok, ich habe's! Das Problem war, dass ich nicht aufmerksam war und einen file-Pointer zugemacht, der überhaupt nicht geöffnet war... 🙄



  • TactX schrieb:

    - mit strstr() nach "jpg" suchen, alles vor dem jeweiligen "jpg" direkt in Zieldatei schreiben, dann "jpeg" schreiben, wiederholen bis strstr() == NULL.

    Da habe ich gesucht und ich kann nur die Adresse der Rückgabewert kriegen:

    retOfstrstr = strstr(buff, "jpg");
    
    printf("%p", retOfstrstr);
    

    Dies hier kommte mit Memory fault zurück...

    printf("%s", retOfstrstr);
    


  • Poste doch bitte mal den gesamten Code. Ich glaube du hast da einige Fehler drin.

    Btw: Warum liest du überhaupt aus wie groß die Datei ist, wenn du eh nur einen fixen Wert an Speicher reservierst? Das ist total albern.



  • TactX schrieb:

    Poste doch bitte mal den gesamten Code. Ich glaube du hast da einige Fehler drin.

    int main (int argc, char *argv[]) {
    
        if(argc < 3){
    
            exit(1);
    
        }
    
        FILE *fpToInputFile;
        FILE *fpToOutputFile;
    
        char *pcCpy;
        char *pcTmp;
    
        fpToInputFile = fopen(argv[1], "r");
        fpToOutputFile = fopen(argv[2], "w+a");
    
        size_t size = GetFileSize(fpToInputFile);
    
        pcTmp = (char *)malloc(size);
        pcCpy = (char *)malloc(size);
    
        char pcNr[] = "jpg";
    
        if (fpToInputFile != NULL) {
    
            while (!feof(fpToInputFile)){
    
                fgets(pcTmp, size, fpToInputFile);
    
                pcCpy = strstr(pcTmp, pcNr);
    
                //printf("PCCPY: %s\n", pcCpy);
    
                fwrite(pcCpy, size, 1, fpToOutputFile);
    
            }
    
        }
    
        if (fpToInputFile != NULL) fclose(fpToInputFile);
        if (fpToOutputFile != NULL) fclose(fpToOutputFile);
    
        free(pcTmp);
        free(pcCpy);
    
        return 0;
    
    }
    


  • shuriko schrieb:

    int size = 1;
    while((getc(pointerToFile)) != EOF) {size++;}
    char *buff = new char[size];
    fseek(pointerToFile, 0, SEEK_SET);
    fread(buff, size, 1, pointerToFile);
    printf("BUFF: %s\n", buff);
    


  • Javaner schrieb:

    shuriko schrieb:

    int size = 1;
    while((getc(pointerToFile)) != EOF) {size++;}
    char *buff = new char[size];
    fseek(pointerToFile, 0, SEEK_SET);
    fread(buff, size, 1, pointerToFile);
    printf("BUFF: %s\n", buff);
    

    Ich gebe zu, dass ich einiges geändert habe. Also hiermit berechne ich die Größe der Datei.

    int GetFileSize(FILE *fpToFile){
    
        if( fpToFile == NULL) exit(1);
    
        int nFileSize = 0;
    
        while ((getc(fpToFile)) != EOF) { nFileSize++; }
    
        fseek(fpToFile, 0, SEEK_SET);
    
        return nFileSize;
    
    }
    


  • In dem Fall:

    char *buff = new char[GetFileSize(deinFilePointer)];
    


  • Javaner schrieb:

    In dem Fall:

    char *buff = new char[GetFileSize(deinFilePointer)];
    

    Es wurde mir hier darauf hingewiesen, dass man im C calloc() bzw. malloc() benutzt.



  • Auch gut! 😃

    char *buff = (char *)malloc(GetFileSize(deinFilePointer)*sizeof(char));
    

Anmelden zum Antworten