hilfe: txt-datei öffnen und gleichzeitig in der mitte einer best. Zeile ein \n einfügen
-
ja, ich hab das \n im Format vergessen
-
hi,
also - kann es sein, dass strcat am ENDE des strings einhängt - und nicht wie von mir gewollt VOR des strings ?
-
enterbreak schrieb:
hi,
also - kann es sein, dass strcat am ENDE des strings einhängt - und nicht wie von mir gewollt VOR des strings ?und wo ist denn das Problem damit? Benutze es 2 mal.
char x[20]; strcpy(x, "\n"); strcat(x, "Hallo, Welt"); strcat(x, "!\n"); printf("abc %s def\n", x);
-
so - nochmal,
soweit bin ich nun:es klappt aber leider immer noch nicht:
#include <stdio.h> #include <string> #include <memory.h> #include <ctype.h> #include <fstream> #include <iostream> #include <time.h> #include <direct.h> #include <stdlib.h> char* myReplace(char* alt,char* wort_alt,char* wort_neu) { char* ptr; char* neu; ptr=strstr(alt,wort_alt); neu=(char*)malloc(strlen(alt)-strlen(wort_alt)+strlen(wort_neu)); memcpy(neu,alt,ptr-alt); memcpy(neu+(ptr-alt),wort_neu,strlen(wort_neu)); memcpy(neu+(ptr-alt)+strlen(wort_neu),ptr+strlen(wort_alt),ptr-alt+strlen(wort_alt)); return neu; } int main () { FILE* file = fopen("datei.txt","rw"); if(file) { char Buffer [1024]; int BufferSize = 1024; while(fgets(Buffer,BufferSize,file)>0) { char *satz_neu; satz_neu=myReplace(Buffer," Wort1","\nWort1"); printf("%s",satz_neu); fputs(Buffer,stdout); } fclose(file); } return 0; }
was mache ich denn nun falsch???
bitte hilfe!
-
Vieles.
Das schlimmste ist wohl, dass du lauter Speicherleichen verursachst.
In deinem Fall kannst du die Daten der Datei nicht mit dem Modus r+ ändern, da die Zeichen die ersetzt werden sollen mehr sind als die Zeichen, die als Ersatz gelten. Du wirst also nicht drumherumkommen können, die ganze Datei einzulesen und erstmal im Arbeitsspeicher zu ändern. Nach der Änderung musst du die komplette Datei wieder schreiben.
Eine andere Möglichkeit wäre, dass du eine zweite Datei öffnest, in der du nur schreibst (in der ersten liest du dann natürlich auch nur!). Dort kannst du dann die Änderungen speichern. Und wenn es notwendig ist am Schluss die alte (gelesene) mit der neuen (geschriebene) überschreiben.So nun zu deiner Ersetzenroutine.
- Das erste Problem hab ich ja schon genannt. Dadurch dass du mit malloc() ständig neuen Speicher reservierst, diesen aber nicht mehr freigibst, erzeugst du Speicherleichen.
- Dann gibst du auch noch eine lokale Variable zurück, was man tunlichst vermeiden sollte (außer sie ist static; aber auch das sollte man vermeiden, wenn möglich und sinnvoll).
- Bei deinem dritten memcpy() stimmt die zu kopierende Länge nicht. Das Ergebnis, dass du jetzt ausrechnest, muss noch von strlen(alt) abgezogen werden. (Du willst schließlich den Rest nach dem gefundenen Wort kopieren, oder??)
- Überleg mal was passiert, wenn dein Suchwort nicht gefunden werden kann.
- Deine Ersetzen-Funktion kann nur einmal das gesuchte Wort finden und ersetzen. Was ist, wenn es aber mehrmals vorkommt?
-
hi,
so - es hat mir doch noch jemand helfen können - hier nun die lösung (für alle newbies wie ich einer bin in zukunft vielleicht ganz nützlich bei derartigen datei-handlings)
:pchar* eingabedatei = "c:\\datei.txt"; char* ausgabedatei = "c:\\datei2.txt"; char* suchtext = "Wort1:"; char* ersetzung = "\nWort1:"; char* suchtext2 ="Wort2:"; char* ersetzung2="\nWort2:"; char* suchtext3 ="Wort3:"; char* ersetzung3="\nWort3:"; FILE* rein; FILE* raus; char buffer[1024]; size_t len; char* p1; char* p2; /* Dateien öffnen */ rein = fopen(eingabedatei, "r"); if (rein==NULL) { fprintf(stderr, "Kann %s nicht lesen.\n", eingabedatei); return 1; } raus = fopen(ausgabedatei, "w"); if (raus==NULL) { fclose(rein); fprintf(stderr, "Kann %s nicht schreiben.\n", ausgabedatei); return 2; } /* Lesen + ersetzen + schreiben */ while(fgets(buffer, sizeof(buffer), rein)) { p1 = buffer; // while ((p2=strstr(p1, suchtext))!=NULL) // war ein test if((p2=strstr(p1, suchtext))!=NULL) { fwrite(p1, 1, p2-p1, raus); fwrite(ersetzung, 1, strlen(ersetzung), raus); p1 = p2+strlen(suchtext); } if((p2=strstr(p1, suchtext2))!=NULL) { fwrite(p1, 1, p2-p1, raus); fwrite(ersetzung2, 1, strlen(ersetzung2), raus); p1 = p2+strlen(suchtext2); } if((p2=strstr(p1, suchtext3))!=NULL) { fwrite(p1, 1, p2-p1, raus); fwrite(ersetzung3, 1, strlen(ersetzung3), raus); p1 = p2+strlen(suchtext3); } if (*p1) fwrite(p1, 1, strlen(p1), raus); } fclose(raus); fclose(rein); system("copy c:\\datei2.txt c:\\datei.txt"); system("del c:\\datei2.txt");
nun hätt ich aber doch noch eine frage (weils bei mir nicht geklappt hat):
ich hab in der datei.txt noch folgendes stehen:Kundenanschrift:
Hans Muster
Musterstr. 1
99999 Musterhausen
Musterlandund ich möchte folgendes in meiner datei 2 haben:
Kundenanschrift:
Name: Hans Muster
Straße: Musterstr. 1
PLZ/Ort: 99999 MusterhausenLand: Musterland
kann mir da jemand hilfestellung geben, wie ich das problem anpacke?
danke schonmal
gruß
-
mag denn niemand mehr
- oder sind alle im biergarten?
-
ich galube, daß das daran liegt, daß man deine Frage nicht sofort blickt, da sie so allgemein formuliert ist. Zeig doch schon mal deinen Versuch!
ich würde den algo ungefähr so aussehen lassen:
da die Anschrift immer ganz verschieden sein kann und falls du nicht weißt wo diese genau in deiner Quelle steht, würde ich nach dem string 'Kundenanschrift:' suchen und dann vor Übertragen der Zeilen den betreffenden Ordnungsbegriff wie zB 'Name' etc zuerst schreiben. So ganz einfach eben :p
-
@enterbreak
Dein nächstes Problem könnte sich etwas schwierig gestalten. Die Abarbeitung hängt stark davon ab, wie deine Datei aufgebaut ist. Was ist außer der Kundenanschrift enthalten? Weitere Kundenanschriften oder anderer Text? Ist die Kundenanschrift immer so aufgebaut, wie im Beispiel oder kann auch mal z. B. die Straße fehlen oder könnte noch was zusätzliches dabeistehen? Was ist, wenn die Anschrift ein Postfach hat?Wahrscheinlich wird es wohl auf das hinauslaufen, was freshman schon angedeutet hat.
-
ok - ich seh's ein - es sind zu viele unklarheiten in meiner txt-datei und vor allem sind dort die daten auch ziemlich unterschiedlich
(man nehme ein beispiel gesammelter shop-verkaufs-daten.)