stronzo Geschrieben 26. Februar 2005 Geschrieben 26. Februar 2005 Hallo Leute, ich bin am verzweifeln. Ich suche schon die ganze Nacht nach einer Lösung, kann aber keine finden die ich verstehe Ich muss über ein C Programm gewisse Zeilen in einer Textdatei ändern. Nehmen wir an die datei heist test.txt und sie enthält neben vielen andern Zeilen eine Zeile: ..... nachricht "hallo" ..... Ich möchte daß das Prog nun das "Hallo" durch einen Text ersetzt den ich dem Prog übergebe. Ich hab irgendwo gelesen dass man die Datei auslesen muss sie in eine variable speichert, die gewünschten zeilen ändert, in eine neue Datei schreibt und dann die alte Datei ersetzt. Meine Frage, WIE STELLT SO EIN DUMMER NEWBIE WIE ICH DAS AN ??? Bitte ausführlich wenns geht. Danke im vorraus. Zitieren
carstenj Geschrieben 26. Februar 2005 Geschrieben 26. Februar 2005 Hi, auch wenn ich wahrscheinlich keine Beliebtheitspunkte durch meine Antwort erhalte, frage ich mich, in welchem Rahmen du diese Aufgabe bekommen hast. Du wirst ja zumindest schonmal eine Zeile C-Code gesehen haben nehme ich an?! Da leider von dir kaum Ansätze zu sehen sind, fällt es mir natürlich schwer, eine Lösung zu posten. Ich hab irgendwo gelesen dass man die Datei auslesen muss sie in eine variable speichert, die gewünschten zeilen ändert, in eine neue Datei schreibt und dann die alte Datei ersetzt. Das ist doch schonmal ein Anfang. Was genau ist denn jetzt dein Problem? Der Algorithmus, was oft das Komplizierteste am Programmieren ist, steht ja quasi schon da. Zusammengefasst: * Datei öffnen * Daten bearbeiten * Daten in neue Datei schreiben * Datei schließen Nun muss man eben nachsehen, welche Möglichkeiten einem Ansi C bietet, um den o. a. Algo in Programmcode zu quetschen. :mod: Zitieren
stronzo Geschrieben 26. Februar 2005 Autor Geschrieben 26. Februar 2005 Mein Problem liegt darin, dass ich nich weiß wie das mit dem ersetzten von den zeilen und dem schreiben der neuen datei hinbekomm. Das folgende is wie ich die Datei öffne (war auch nich einfach mit null ahnung): void test(const userinput * const u) { FILE *bkp = fopen("test.txt","r,w");; char *tempstr; tempstr = mycalloc(maxtextlength); while(fgets(tempstr,maxtextlength,bkp_ptr) != NULL) { u_respond(u," %s ",tempstr); } fclose(bkp_ptr); mydelete(tempstr); } Zitieren
Klotzkopp Geschrieben 26. Februar 2005 Geschrieben 26. Februar 2005 Hallo stronzo, und Willkommen auf dem Board. Ein Bitte: Gewöhn dir an, aussagekräftige Threadtitel zu wählen. Den hier hab ich für dich geändert. Zitieren
Bubble Geschrieben 26. Februar 2005 Geschrieben 26. Februar 2005 Wenn Du keine fertige Funktion verwenden möchtest (es also selbst programmieren) ist die prinzipielle Vorgehensweise die Folgende: 1. Datei ins RAM einlesen. Wenn die Datei zu groß ist auf geschickte Festplattenoperationen ausweichen. 2. Den zu ersetzenden Teil-String finden. Wenn man dies wirklich gut machen will ist es nicht trivial (die trivialen Lösungen haben eine hohe Laufzeit). Die Wahl vom Algorithmus hängt auch davon ab, ob Du nur einen einzelnen Teil-String im Text suchen möchtest oder im gleichen Text viele unterschiedliche Teil-Strings finden möchstest. Zu diesem Thema gibt es Literatur, wenn Du Hinweise brauchst, wonach Du suchen musst, frag mich einfach noch mal. 3. Nachdem Anfang und Ende des zu ersetzenden Teil-Strings bekannt sind, kannst Du den neuen Text durch geeignetes Zusammenkopieren der einzelnen Blöcke (vor dem Teil-String + neuer Teil-String + nach dem Teil-String) bilden. Zitieren
Money Making Machinist Geschrieben 27. Februar 2005 Geschrieben 27. Februar 2005 Wo wir grad beim Thema sind: Ich hätt da auch mal ne Frage, wie kann ich in einem Textfile navigieren. Bsp: [txt] [Wertebeispiel] Werte1 = 3 Werte2 = 14 Werte3 = 12 [/txt] Wie kann ich wie oben im Bsp die Zeile "Werte2 = 14" den Wert 14 einlesen (Aber nur den Werte 14). Zitieren
stronzo Geschrieben 27. Februar 2005 Autor Geschrieben 27. Februar 2005 Nehmen wir einmal an ich habe was.txt mit jedemenge Zeilen: ... was geht von wo nachricht "Hallo du" von wegen ... Die Zeile die ich ersetzten möchte ist: nachricht "Hallo du" Und sie soll ersetzt werden mit: nachricht Ich hab kein Plan Die Zeile mit "nachricht" kommt nur einmal in der was.txt vor. Das "nachricht" soll erhalten werden und nur der Text dahinter bis zum Zeilenende soll geändert werden. Und da unter der zeile mit "nachricht" ja wieder Text steht muss das ja dann in eine neue Datei geschrieben werden und die Alte mit der Neuen ersetzt werden. Kann mir dazu jemand ein Codebeispiel in C geben? Ich versteh es eher wenn ich ein Codebeispiel sehe. Ich hab mir jetzt auch 2 Bücher zum C Programmieren bestellt um euch nicht mit solchen Fragen zu belästigen, allerdings sind die erst Ende nächster Woche da. Und ich brauch den Code schon gestern. Vielen Dank. Zitieren
carstenj Geschrieben 27. Februar 2005 Geschrieben 27. Februar 2005 Hallo, ich hab da mal was gemacht, guck es dir mal an, vielleicht hilfts dir ja: #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXSTRING 1024 void filter(char text[]) { char* erstePos = strchr(text, '\"'); /* Suche erstes " Zeichen */ char* letztePos = strrchr(text, '\"'); /* Suche letztes " Zeichen */ if(erstePos != NULL) strncpy(erstePos, "hab keinen plan\n", 256); printf("%s", text); } void oeffneDatei(char inhalt[] ) { FILE* datei; datei = fopen("stronzo.txt", "r+"); while(fgets(inhalt, MAXSTRING, datei)) { filter(inhalt); } } int main() { char inhalt[MAXSTRING]; oeffneDatei(inhalt); return 0; } [/php] Das wird noch noch in eine Datei gespeichert, aber das solltest du ja nun hinbekommen. Allerdings wirst du dich mit den einzelnen Funktionen auseinandersetzen müssen, damit du das verstehst. Zitieren
Money Making Machinist Geschrieben 27. Februar 2005 Geschrieben 27. Februar 2005 Wo wir grad beim Thema sind: Ich hätt da auch mal ne Frage, wie kann ich in einem Textfile navigieren. Bsp: [txt] [Wertebeispiel] Werte1 = 3 Werte2 = 14 Werte3 = 12 [/txt] Wie kann ich wie oben im Bsp die Zeile "Werte2 = 14" den Wert 14 einlesen (Aber nur den Werte 14). Öhm, meine Frage scheint wohl ein bisschen untergegangen zu sein. Zitieren
Bubble Geschrieben 27. Februar 2005 Geschrieben 27. Februar 2005 Nehmen wir einmal an ich habe was.txt mit jedemenge Zeilen: ... was geht von wo nachricht "Hallo du" von wegen ... Kann man davon ausgehen, dass "nachricht" immer exakt am Anfang einer Zeile steht? Kann man noch andere Annahmen machen, um das Problem zu vereinfachen? Zitieren
carstenj Geschrieben 27. Februar 2005 Geschrieben 27. Februar 2005 Hi, Öhm, meine Frage scheint wohl ein bisschen untergegangen zu sein. deswgen wäre es sinnvoller gewesen, einen eigenen Thread zu eröffnen. Und ja, deine Post habe ich bekommen. Gut zu wissen, dann habe ich schonmal mindestens einen treuen Leser. Schau dir mal mein Beispiel an, mit kleinen Veränderungen würde es auch dein Problem lösen. Zitieren
stronzo Geschrieben 27. Februar 2005 Autor Geschrieben 27. Februar 2005 Kann man davon ausgehen, dass "nachricht" immer exakt am Anfang einer Zeile steht? Kann man noch andere Annahmen machen, um das Problem zu vereinfachen? Ja, "nachricht" steht immer am anfang der zeile. Mehr an vereinfachungen wüsste ich leider nicht. Die Zeile in der es steht kann leider variieren. Zitieren
stronzo Geschrieben 27. Februar 2005 Autor Geschrieben 27. Februar 2005 Habs jetzt fast komplett hinbekommen, mir fehlt nur noch eine sache. Ich möhte dass der User dem Programm einen Neuen String übergeben kann, welcher dann an der Stelle eingesetzt wird. Wie der User Input machen kann is mir klar, nur wie bekomm ich dann den kompletten string in eine neue Variable geschrieben? also z.B: replace.exe Hallo ich bin John. strcpy(new_str,argv[1]); würde ja lediglich das erste Wort (Hallo) in new_str schreiben. Was muss ich statt argv[1] schreiben um Hallo ich bin John. in new_str zu bekommen? THX Zitieren
carstenj Geschrieben 28. Februar 2005 Geschrieben 28. Februar 2005 Hi, das gleiche, du musst nur das Programm mit Anführungszeichen aufrufen: programmname.exe "hallo, die ist ein Test" Ansonsten stände das erste Wort in argv[1], das zweite in argv[2] etc... Zitieren
stronzo Geschrieben 28. Februar 2005 Autor Geschrieben 28. Februar 2005 Muchas Grazias!!! Ihr seit spitze. :uli Freu mich schon auf meine Bücher 1000 Dank. Zitieren
stronzo Geschrieben 28. Februar 2005 Autor Geschrieben 28. Februar 2005 Ich hab jetzt versucht den obeigen code in eine einzige main() zu quetschen. Der Compiler meldet keine Fehler, allerdings bekomme ich jetzt beim ausführen "Segmentation fault (core dumped)". Wo liegt im folgenden Code der Fehler ? int main(int argc, char **argv) { FILE* datei; FILE* datei2; char inhalt[1024]; char nstr[100]; char* const_str; char* temp_str; char* erstePos; if(argc < 2) { printf("Eine Neue Nachricht musst du schon angeben!!!\n"); return 0; } datei = fopen("stronzo.txt", "r"); /* Öffnet Datei zum lesen */ datei2 = fopen("temp.txt", "w+"); /* Öffnet Datei2 zum schreiben */ strcpy(nstr,argv[1]); /* Kopiert argv[1] in nstr */ strcpy(const_str,"nachricht"); /* Kopiert nachricht in const_str */ while(fgets(inhalt, 1024, datei)) { erstePos = strstr(inhalt,const_str); /* Sucht nach const_str in inhalt */ strcpy(temp_str,const_str); /* Kopert const_str in temp_str */ strcat(temp_str, " "); /* Hängt ein Leerzeichen an temp_str an */ strcat(temp_str, nstr); /* Hängt nstr an temp_str an */ strcat(temp_str, "\n"); /* Hängt einen Zeilenumbruch an temp_str an */ if(erstePos != NULL) strncpy(erstePos, temp_str, 256); /* Ersetzt erstePos in Inahlt mit temp_str */ printf("%s", inhalt); /* Gibt inhalt auf dem Bildschirm aus */ fputs(inhalt,datei2); /* Speichert inhalt in datei2 */ } fclose(datei); /* Schließt datei */ fclose(datei2); /* Schließt datei2 */ remove("stronzo.txt"); /* Löscht stronzo.txt */ rename("temp.txt","stronzo.txt"); /* Benennt temp.txt zu stronzo.txt */ return 0; } [/PHP] Zitieren
carstenj Geschrieben 28. Februar 2005 Geschrieben 28. Februar 2005 Hallo, char* const_str; char* temp_str; [/PHP] hier ist der Fehler bzw. die Ursache: Du hast zwei Zeiger, für die kein Speicher reserviert wurde. Du hast zwei Möglichkeiten: * Speicher reservieren mit malloc (dann musst du aber auch free aufrufen) * Keine Zeiger sondern Arrays nehmen (const_str[1024] etc...) Ich empfehle letzteres...... EDIT: Es ist natürlich so, dass du bei einem Array wissen musst, wieviel Zeichen maximal eingetragen werden können. Ich hab 1024 gewählt, weil es so eine schöne Computerzahl ist. Da ist rein willkürlich, wenn es auch wahrscheinlich ausreichen wird. Sollten allerdings mehr als 1024 Zeichen (inkl. der \0) eingetragen werden, musst du das Feld mit realloc vergrößern. Aber das wird auch in deinen Büchern stehen. Zitieren
stronzo Geschrieben 28. Februar 2005 Autor Geschrieben 28. Februar 2005 OK, danke. Fehler behoben. Das mit Zeigern und Arrays hab ich noch nicht ganz begriffen. Bzw. was ein Zeiger ist weiß ich: Ein Zeiger zeigt auf die Adresse in der der Wert gespeichert wird/wurde. Und was genau ist ein Array ? Hat mir dazu jemand weiterführende Lektüre ? Thx Zitieren
carstenj Geschrieben 28. Februar 2005 Geschrieben 28. Februar 2005 Hallo, guck mal hier: http://www.pronix.de/modules/C/openbook/c_programmierung_14.php Zitieren
stronzo Geschrieben 28. Februar 2005 Autor Geschrieben 28. Februar 2005 Danke. Wie kann es sein, das jemand wie du ( hab deine Page begutachtet ) Arbeit sucht? Du müsstest doch Arbeitsstellen on maß bekommen. Zitieren
carstenj Geschrieben 28. Februar 2005 Geschrieben 28. Februar 2005 Hi, danke, aber möglicherweise liegts einfach an der mangelnden Berufserfahrung. Ist immer ne schöne Ausrede zur Beruhigung. Aber falls dein Arbeitgeber jemanden sucht, kannst du mich ja empfehlen. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.