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.