Zum Inhalt springen

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


Empfohlene Beiträge

Geschrieben

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.

Geschrieben

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:

Geschrieben

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

}

Geschrieben

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.

Geschrieben

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.

Geschrieben

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.

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

Geschrieben
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?

Geschrieben

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.

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

Geschrieben

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

Geschrieben

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]

Geschrieben

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.

Geschrieben

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

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...