Hallo,
Ich versuche seit längeren in C Sprache ein Programm zu schreiben, was
beim starten einen Dateipfad abfragt. In meinen Fall trage ich einen
Pfad von einem Textdokument ein, was geöffnet werden soll. Im Anschluss
soll dieses Programm eine Abfrage machen nach welchen wort gesucht
werden soll in dem Textdokument. Danach noch eine Abfrage wodurch es
ersetzt werden soll.
Das Programm soll dann selbstständig alle gesuchten wörter ersetzen mit
dem neuen Wort.
Beispiel Textdokument:
Inhalt
Hallo World, Hallo World, Hallo World
Programm soll "World" suchen und ersetzen mit "Welt"....
Neuer Textdokument Inhalt
Hallo Welt, Hallo Welt, Hallo Welt
Hat jemand eine Idee für einen möglichen Code?
Bis jetzt funktioniert nur das öffnen der Datei...
Wieder mal eine Hausaufgabe und dabei hat das Sommersemester gerade erst
angefangen... "Hat jemand eine Idee für einen möglichen Code?" So lernst
Du doch nichts.
Schreib doch erstmal auf was Du hast (code tags beachten) und frage dann
konkret nach einzelnen Schritten, nachdem Du Deine Vorlesungsunterlagen,
Anfängerbuch, Tutor oder Google konsultiert hast.
das mein letzter Code Versuch.
#include <stdio.h>
#include <stdlib.h>
int main ()
{
char pfad [200];
char text [100];
char change [100];
//printf("Geben sie Textdatei Pfad ein...!\n");
//fgets(pfad,200,stdin);
//printf("Was soll gesucht werden?\n");
//fgets(text,100,stdin);
//printf("Womit soll ersetzt werden?\n");
//fgets(change,100,stdin);
FILE *datei;
datei = fopen (pfad,"r+");
if (datei == NULL)
{
printf("Fehler beim öffnen\n");
return 1;
}
fprintf (datei,"s\n" );
fclose (datei);
return 0;
}
Da obend ist etwas auskommentiert was erstmal unwichtig ist. Das sollen
die Späteren Abfragen sein, wenn das Programm startet.Hier habe ich
erstmal direekt ein Pfad im Programm eingegeben. Hier wollte ich sehen,
ob er die Datei öffnet und habe mir einfach die ganze datei ausgeben
lassen.Das funktioniert alles soweit.
Ich weiß nur nicht wie ich die gesuchte Variable und die ersetzung
Variable verarbeiten muss.
Nach langer recherche habe ich diese Funktion gefunde.
void Replace(char *pStr, char replace, char newChar)
{
do {
if(*pStr == replace) *pStr = newChar;
} while(*pStr++);
}
unsigned int Replace2(char *pStr, char replace, char newChar)
{
unsigned int cnt=0;
do {
if(*pStr == replace) {
*pStr = newChar;
cnt++;
}
} while(*pStr++);
return(cnt);
}
void main()
{
char text[120] = "eingelesene,Zeile";
unsigned int ret;
Replace (text, ',', '.');
ret = Replace2(text, ',', '.');
}
Kann man die umschreiben damit es am Ende läuft oder ist das der falsche
Lösungansatz?
Muss dazu ergänzen, das dies ein Labor ist von der Schule und wie haben
C nur die groben Grundlagen gehabt.
Der von dir gefundene Code ersetzt nur einzelne Zeichen durch ein Neues.
Prinzipiell geht es mit ganzen Strings aber so ähnlich. Die strstr()
Funktion könnte noch Hilfreich sein um überhaupt erstmal das Vorkommen
eines Strings zu finden. Ersetzen muss man dann allerdings noch selbst.
Ist es den möglich das er die Textdatei durchläuft am mit einer Schleife
und alle Wörter ersetzt?
unsigned int Replace2(char *pStr, char replace, char newChar)
was wäre den pSTR , replace , newChar?
newChar = ersetzendes Wort
replace = zu ersetzendes Wort
pSTR = ?
Vielen Dank schon einmal für die Mühe
Arbeite mit einer Quell- und einer Zieldatei.
Das erstzeten in Place geht nur, wenn Such- und Ersatzstring gleich lang
sind.
Das ist aber immer noch nicht trivial, da du auf die Dateizeiger
(Positionszeiger) achten musst.
fgets legt das abschließende '\n' von der Entertaste mit im String ab.
Das heißt ich lese die test.txt (quelldatei) aus und kann das irgendwie
in die 2te test.txt (Zieldatei) schreiben lassen mit den Änderungen?
wie ich es zur Zeit vor hatte, ist es nicht möglich?
Du könntest an einer Reihe von Punkten ansetzen um Deine Kenntnisse zu
erweitern.
Zum ersten betrifft das Datentypen:
Es gib eine Reihe, von denen Du bisher vielleicht schon gehört hast:
z.B. int, char und double.
Ein Sonderfall sind die Vektoren von char - und das ist hier für Dich
zuerst wichtig. Ein char wie in
[c]
char a;
[(c]
ist der Typ für ein einzelnes Zeichen - nicht aber für eine Kette von
Zeichen. In der Variable a kann nur ein einzelnes Zeichen gespeichert
werden.
Falls Du Ketten von Zeichen speichern willst, benötigst Du einen Vektor
von Zeichen, viel häufiger "String" genannt.
Dazu lies bitte mal:
http://openbook.rheinwerk-verlag.de/c_von_a_bis_z/011_c_arrays_011.htm#mja452663858fd23e86c51cfa3b9139f64
Wenn Du das gelesen hast, versuche einmal Deine eigenen Fragen von hier
Beitrag "Re: C Programmierung" zu
beantworten.
Die Antwort muss nicht perfekt sein, aber es muss erkennbar sein, dass
Du irgendwas daraus gemacht hast, was halbwegs in die richtige Richtung
geht.
Die 2. Datei muss einen anderen Namen bekommen
Z.B. test.txt.tmp
(es gibt auch C-Standardfunktionen, die dir einen eindeutigen Namen
liefern)
Danach musst du das Original löschen und die temporäre Datei umbennen.
So zerstörst du im Fehlerfall auch nicht das Original.
Daniel H. schrieb:> wie ich es zur Zeit vor hatte, ist es nicht möglich?
Bei deinem Beispiel
Hallo World, Hallo World, Hallo World
käme dann
Hallo Weltd, Hallo Weltd, Hallo Weltd
heraus
Wenn du World durch Universum erstzt, gibt das
Hallo Universumllo Universumllo Universum
Also eher nicht.
Habe ich mir durchgelesen. Diese Grundlagen habe ich schon verstanden.
Mein Problem liegt das ich nicht weiß, welche Befehle wichtig für mich
sind um nach Wörter zu suchen und diese dann zu ersetzen :(
Ich vermute mal stark du wolltest mir damit sagen, dass es zu ein
Bufferoverflow kommen kann ,wenn ich das original Wort ersetze durch ein
längeres.
Daniel H. schrieb:> Habe ich mir durchgelesen. Diese Grundlagen habe ich schon verstanden.
Ich fürchte Du irrst Dich. Falls Du es verstanden hättest, würdest Du
sehr wahrscheinlich so etwas:
> was wäre den pSTR , replace , newChar?> newChar = ersetzendes Wort> replace = zu ersetzendes Wort
nicht fragen. Denn es würde klar sein, das char nur für ein einzelnes
Zeichen steht und ergo, der Parameter newChar kein "Wort" enthalten
kann.
> Mein Problem liegt das ich nicht weiß, welche Befehle wichtig für mich> sind um nach Wörter zu suchen und diese dann zu ersetzen :(
Das ist in gewisser Weise ein zwar verständlicher aber doch behebbarer
Irrtum.
Befehle in C sind if, then, else, do, while, switch etc. ebenso wie die
große Klasse der Ausdrücke. Insofern ist die Frage danach, welchen
Befehl Du anwenden musst, um Wörter zu ersetzen falsch gestellt, denn
die Wirkung dieser Befehle ist so trivial, so weit vom beabsichtigten
Effekt entfernt, dass sie sinnlos wird. Es ist mehr oder weniger
wahrscheinlich, dass einer dieser Befehle bei der Lösung verwendet
werden kann und muss, aber ein Befehl allein wird das Problem nicht
lösen. Das sind einfach Anweisungen um den Kontrollfluss zu
beeinflussen.
Was mir zu fehlen scheint, ist die Kenntnis, dass zuallererst ein
Algorithmus, ein Verfahren gesucht wird. Danach und erst dann, ein Code,
der dieses Verfahren in Form von Anweisungen realisiert.
Diese Behauptung zielt nicht einfach nur auf die richtige Anwendung der
Begrifflichkeiten ab. Vielmehr auf die Grundidee der Programmierung. Und
das wäre der erste wesentliche Schritt, der die Frage nach "einem
Befehl" der "Wörter austauscht" als sinnlos erkennbar machen würde.
> Ich vermute mal stark du wolltest mir damit sagen, dass es zu ein> Bufferoverflow kommen kann ,wenn ich das original Wort ersetze durch ein> längeres.
Nein. Ich wollte das sagen, was ich geschrieben habe. Es ging um die
Eigenschaften von Datentypen.
Falls Du weiter darauf besteht, konkrete Lösungen für die
Programmieraufgabe zu erhalten: Die werde ich nicht liefern.
Ich werde Dir nur helfen, Dir selbst zu helfen und die richtigen Fragen
zu stellen und an den richtigen Stellen nach den Lösungen zu suchen.
Peter M. schrieb:> Kannst Du mir ein paar Fehler zeigen?
Lies dir die schlechten Bewertungen auf Amazon durch.
Oder https://www.c-plusplus.net/forum/272350Peter M. schrieb:> Ich habe große Teile davon durchgelesen und fand es gut lesbar, bin aber> selber nur ganz am Anfang.
Das es gut lesbar ist, heißt ja nicht, dass es richtig ist.
Und gerade Anfänger können die Fehler nicht erkennen.
Sie wissen also nicht, das sie etwas verkehrtes lernen.
Das ist ja das Dilemma.