Wort aus einer Datei durch ein anderes ersetzen wie?

Adi | tmine

Erfahrenes Mitglied
hi ich versuche seit geraumer Zeit in c ein Wort aus einer Datei zu ändern.
Folgenden Code habe ich im Internet gefunden, nur der funktionier nicht recht:
Code:
/* search_and_replace.c */
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#define STRING_MAX 8192

int wort_begrenzer(char c) {
   return (c == ' ' || c == '\n' || c == '\t' || c == '\0' ||
       c == '.' || c == ',' || c == ';' || c == '!' ||c == '?');
}

/* Newline von fgets() entfernen */
void chomp(char *str) {
 size_t p=strlen(str);
 str[p-1] = '\0';
}

int main(int argc, char **argv) {
   FILE *file, *copy;
   char alt_string[STRING_MAX+1],neu_string[STRING_MAX+1],
        such_wort[STRING_MAX+1],replace_wort[STRING_MAX+1],
        *zgr;
   char puffer[STRING_MAX+1];
   int such_wortlen, i=0,w;
   size_t len=0;

   if(argc < 2) {
      fprintf(stderr, "Verwendung: %s datei\n", *argv);
      return EXIT_FAILURE;
   }
   file = fopen(argv[1],"r");    /* Datei zum Lesen öffnen     */
   copy = fopen(argv[1],"r+");   /* Datei zum Schreiben öffnen */
   if(file == NULL || copy == NULL) {
      printf("Fehler bei fopen()...\n");
      return EXIT_FAILURE;
   }
   alt_string[0]='\0';
   /* Kompletten String in alt_string legen ...  */
   /* Bitte ggf. selbst durch dynamische Speicherverwaltung
     * genügend Platz schaffen! */
   while( (fgets(puffer,STRING_MAX+1,file)) != NULL ) {
      len += strlen(puffer)+1;
      if(len < STRING_MAX)
         strcat(alt_string, puffer);
      else {
         printf("Puffergroesse ueberschritten!\n");
         break;
      }
   }
   neu_string[0]='\0';

   printf("Welches Wort wollen Sie ersetzen : ");
   fgets(such_wort, STRING_MAX, stdin );
   chomp(such_wort);

   such_wortlen = strlen(such_wort); /* Länge des Suchwortes */
   for(w = 0; w < such_wortlen; w++)
   /* Nach Wortbegrenzern duchlaufen ... */
   if(wort_begrenzer(such_wort[w])) {
      printf("Keine Wortbegrenzer im Suchwort\n");
      return EXIT_FAILURE;
   }
   printf("Durch welches Wort wollen Sie ersetzen : ");
   fgets(replace_wort, STRING_MAX, stdin);
   chomp(replace_wort);
   i = 0;
   while(1){
      if( (zgr=strstr(&alt_string[i], such_wort)) == NULL) {
         /* Kein Wort zu ersetzen */
         strcat(neu_string, &alt_string[i]);
         break;
      }
      else { /*..ansonsten von Byte i bis zgr in neu_string*/
         strncat(neu_string, &alt_string[i], zgr-&alt_string[i]);
         /* Jetzt überprüfen, ob wir ein Wort haben und
          * keinen Teilstring oder das Wort am Anfang steht */
         if( (zgr-&alt_string[0]==0 ||
              wort_begrenzer( *(zgr-1))) &&
              wort_begrenzer( *(zgr+such_wortlen))) {
            strcat(neu_string, replace_wort);
            /* Nach ersetztem Wort den Zeiger setzen ... */
            i += zgr + such_wortlen-&alt_string[i];
         }
         else {
            strncat(neu_string, zgr, 1);
            i += zgr + 1-&alt_string[i];
         }
      }
   } /* Ende while(1) */
   /* Für Testausgabe ... */
   /* printf("Neuer String : %s\n",neu_string); */
   strcpy(alt_string, neu_string);
   /* Achtung jetzt wirds ernst,
    * für Testausgabe in Kommentar setzen*/
   fputs(alt_string, copy);
   neu_string[0] = '\0';
   return EXIT_SUCCESS;
}

kann mir jemand sagen was ich alles änder(anpassen) muss damit der leuft? Wäre sehr dankbar.

mfg adi
 
da ist ja schon das problem es gibt keinen Fehler^^ nur das "skript" hält nirgends an... es öffnet schnell das Fensterchen und schliesst es auch shcon wieder... ohne das man ne datei auswählen , oder wonst was eingeben konnte. darum glaube ich muss man irgendwas dran ändern, nur ich weiss nit was... bin neuling
 
:google:
Weißt du überhaupt ansatzweise, wie das Programm funktioniert?
int main(int argc, char **argv) {
--> Das Programm erwartet Argumente beim ausführen.

if(argc < 2) {
fprintf(stderr, "Verwendung: %s datei\n", *argv);
return EXIT_FAILURE;
}
--> Das Programm erwartet genau 1Argument, dass den Dateinamen, der zu untersuchenden Datei, angibt. Ist kein Argument angegeben, dann gibt das Programm ein Hilfe-Text aus und wird beendet.
Weil kein getchar(); oder SYSTEM("PAUSE"); (nur bei Windows) angegeben ist, verschwindet das Fenster sofort, wenn es nicht aus den Shell geöffent wird.
Deswegen einfach Programm aus dem Shell öffnen und Dateinamen als Argument angeben.
 
Zuletzt bearbeitet:
@GeHo:
Hmmm... das erinnert mich daran, daß es mittlerweile tatsächlich so weit ist, daß genug Programmierer (oder angehende Programmierer) unterwegs sind, die nie in den Genuß eines reinen DOS und der Konfigurationsorgien in config.sys (emm386 läßt grüssen) und autoexec.bat gekommen sind.
Also nicht unbedingt jedem sagen die Begriffe "shell" oder "command.com" etwas. Es gibt in der Tat Leute, die nicht wissen, daß man auch schon vor Windows Computer bedienen konnte, einfach weil sie es nicht miterlebt haben. ;-]
 
Danke für eure Antworten. Ich glaube langsam zu wissen in welche Richtung es geht, werde aber noch nicht ganz schlau aus euren Beiträgen. :( könnt ihr mir ev. das Ganze ein Bisschen näher erklären?
Wäre voll nett danke schon mal für die bisherige Hilfe.

mfg adi
 
hab ich richtig überlegt wenn ich nun versucht habe das ganze so im cmd (test.exe /test.txt) zu starten? was habe ich falsch gemacht? es kommt nämlich fehler beim fopen
 
Das Programm, was du da ausgegraben hast, ist ein blankes C-Programm. Das kann nichts mit Windows XP, Fenstern, Maus etc. anfangen. Wenn du bei deinem Windows mal auf Start->Ausführen gehst und als auszuführenden Befehl cmd eingibst, dann befindest du dich in der sogenannten DOS-Shell, die selbst in Windows XP noch vorhanden ist.
Alternativ gibt es auch Start->Programme->Zubehör->Eingabeaufforderung oder wo auch immer sich das Teil versteckt.

Dieses komische schwarze Fenster mit dem bißchen weiße Schrift - das ist die DOS-Shell. Und für so eine Shell wurde das Programm auch geschrieben. Wenn du dich mittels "cd" bis zu dem Verzeichnis durchhangelst, in dem das Kompilat deines Programmes liegt und dann die entsprechende .exe-Datei ausführst, dann bekommst du eine entsprechende Rückmeldung von dem Programm und es sagt dir, wie es zu verwenden ist.

Unter reinem Windows passiert das gleiche, nur mit dem winzigen kleinen Zusatz, daß Windows so "schlau" ist und die DOS-Shell nach Abarbeitung des Programms sofort wieder schließt. Exakt das ist dieser Effekt, den du beschrieben hast:
es öffnet schnell das Fensterchen und schliesst es auch shcon wieder...


Nachtrag:
Ein Fehler beim fopen deutet mit ziemlich hoher Wahrscheinlichkeit darauf hin, daß er die Datei nicht finden kann. Sollte mich auch sehr wundern. Denn "/test.txt" würde _vielleicht_ noch in einem Linux- / Unix-System gefunden werden können, aber nicht unbedingt unter Windows. Lege dir einfach die test.txt im gleichen Verzeichnis an, in dem auch die test.exe liegt. Dann sollte ein cmd "test.exe .\test.txt" Erfolg bringen.
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück