Strings in der Datei ersetzen



  • 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));
    


  • Also mir gefällt

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

    wesentlich besser. Dazu sollte man aber auch einen C-Compiler benutzen, keinen C++-Compiler.



  • Javaner schrieb:

    Auch gut! 😃

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

    Danke. Es tut was. 😉

    Aber mein Problem bleibt noch immer. Ich kapiere es einfach nicht, wie ich "jpg" durch "jpeg" ersetzen kann. Die Anleitung, die ich bereits bekommen habe ist zwar logisch aber nicht für einen Anfänger.

    Ich weiß nicht mit welchen Funktionen unter C es zu realisiren ist aber die Lösung für mich wäre:

    Datei zum Lesen öffnen.
    Zeile für Zeile auslesen.
    Nach einem String in der Zeile suchen.
    Wenn das String gefunden wird, dann ersetzen (durch überschreiben wahrscheinlich).
    Weiter suchen bis die Datei zu Ende ist.
    Datei schließen.



  • Meine Variante ist aber sauberer! 🕶



  • Datei 1 zum Lesen öffnen.
    Datei 2 zum Schreiben öffnen.
    Zeile für Zeile auslesen.
    Nach einem String in der Zeile suchen.
    Solange der String gefunden wird, ersetzen
    Zeile in die neue Datei schreiben
    Weiter suchen bis die Datei zu Ende ist.
    Datei 1 schließen.
    Datei 2 schließen.
    Datei 1 löschen.
    Datei 2 in Datei 1 umbenennen.



  • Javaner schrieb:

    Solange der String gefunden wird, ersetzen
    Zeile in die neue Datei schreiben

    Ersetzen wahrscheinlich Zeichen für Zeichen? Die Funktion strstr findet zwar die Anfangstelle des gesuchten String aber dann?.. was mache ich dann?



  • shuriko schrieb:

    Ersetzen wahrscheinlich Zeichen für Zeichen?

    Das ist in C (im Vergleich zu Java) schon ziemlich friemelig. Deshalb
    habe ich mich davor auch gedrückt! :p
    Anstatt einen neuen String zusammen zu basteln, schreibe die Teilergebnisse
    sofort raus. In etwa so:

    const char *p = zeile;
    const char *q;
    
    while (p && (q=strstr(p, "jpg")) != NULL) {
      // Ausgabe der Zeichen von p bis ausschließlich q
      // Ausgabe des Strings "jpeg"
      p = q+3;
    }
    

Anmelden zum Antworten