Forum: PC-Programmierung C Programmierung


von Daniel H. (Gast)


Lesenswert?

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

von physiker (Gast)


Lesenswert?

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.

von physiker (Gast)


Lesenswert?

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.

Beitrag #4970681 wurde von einem Moderator gelöscht.
von Daniel H. (Gast)


Lesenswert?

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.

von Sebastian V. (sebi_s)


Lesenswert?

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.

von Daniel H. (Gast)


Lesenswert?

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

von Dirk B. (dirkb2)


Lesenswert?

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.

von Daniel H. (Gast)


Lesenswert?

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?

von Theor (Gast)


Lesenswert?

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.

von Dirk B. (dirkb2)


Lesenswert?

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.

von Dirk B. (dirkb2)


Lesenswert?

Theor schrieb:
> Dazu lies bitte mal:
> 
http://openbook.rheinwerk-verlag.de/c_von_a_bis_z/011_c_arrays_011.htm#mja452663858fd23e86c51cfa3b9139f64

Bitte nicht.
Die Onlineversion ist noch die 1. Auflage und voller Fehler.
Zudem hat der Autor einen nicht so guten Ruf.

von Daniel H. (Gast)


Lesenswert?

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.

von Theor (Gast)


Lesenswert?

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.

von Peter M. (r2d3)


Lesenswert?

Dirk B. schrieb:
> 
http://openbook.rheinwerk-verlag.de/c_von_a_bis_z/011_c_arrays_011.htm#mja452663858fd23e86c51cfa3b9139f64
>
> Bitte nicht.
> Die Onlineversion ist noch die 1. Auflage und voller Fehler.
> Zudem hat der Autor einen nicht so guten Ruf.

Kannst Du mir ein paar Fehler zeigen?
Ich habe große Teile davon durchgelesen und fand es gut lesbar, bin aber 
selber nur ganz am Anfang.

von Dirk B. (dirkb2)


Lesenswert?

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/272350

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.