Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Zeilen in einer Textdatei ändern (war:Anfänger braucht HILFE !!!!)

Empfohlene Antworten

Veröffentlicht

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.

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:

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

}

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.

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).

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.

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.

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.

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?

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.

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.

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

Muchas Grazias!!!

Ihr seit spitze. :uli

Freu mich schon auf meine Bücher :D

1000 Dank.

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]

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.

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

Danke.

Wie kann es sein, das jemand wie du ( hab deine Page begutachtet ) Arbeit sucht?

Du müsstest doch Arbeitsstellen on maß bekommen. :)

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.