Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Eigener Multireplacer

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
21.12.2006, 20:20 Uhr
weed



Tag, Coder.
Dieses mal brauche ich einen Multireplacer,
ein Programm, in dessen Desktop-Icon
ich soviele Dateien wie möglich reinziehen kann per Drag&Drop->
Dann gebe ich etwas ein und noch etwas womit sämtliche
Vorkommnisse der ersten Eingaben in allen hineingezogenen
Skripten ersetzt werden (für meine phpSkripte)

Das Problem: Wenn ich in einem DOS-Programm
mehr als 20 Dateien hineinzihe bekomme ich nur
Problembericht senden|nicht senden.
Wie bekomme ich es nur mit unbegrenzt vielen
Dateien hin?

danke im Voraus
--
lol Signatur lol
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
22.12.2006, 10:21 Uhr
Th



Dies ist leider eine Beschränkung des Windows Drag&Drop beim Explorer. Der Puffer für die Dateinamen (inklusive Pfade) ist leider auf eine bestimmte Größe limitiert (ich glaube 32K oder 64K). Dies stört mich auch, dann muß ich die Dateien immer in Blöcken öffnen.

Ich selbst habe einen MDI-Editor geschrieben, denn ich dann auch oft per Drag&Drop mit Textdateien vom Explorer-Fenster öffne. Wenn ich dann eine Fehlermeldung erhalte, wähle ich eben weniger Dateien aus und ziehe anschließend weitere Dateien in das Programmfenster.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
22.12.2006, 10:44 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


drag&drop ist nicht ansi ->
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
22.12.2006, 14:54 Uhr
weed



Ich habe nen Haufen php-Skripte, wo ich in jedem dieser Skripte
bestimmte Strings ersetzten muss.
Beispielweise die variable $epkmn_nr muss in jedem dieser
Skrpte ersetzt werden mit $self_pkset

Naja, heir mein Source...


C++:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

string c2str (char* var) {
  string rueck = "";
  int i = 0;
  while (var[i]) {
        rueck += var[i];
        i++;
  }
  return rueck;
}

int main (int argc, char *argv[]) {
  int i = 1;
  printf ("Dateien fuer den Replace-Prozess:\n");
  if (!argv[i]) {
    printf ("Keine per Drag and Drop uebergeben!\n");
  } else {
    while (argv[i]) {
      printf ("%s\n", argv[i]);
      i++;
    }
        
    printf ("\nWelche Teilstringe sollen in den Dateien ersetzt werden?\n");
    string replace;
    getline (cin, replace);
    printf ("\nWomit?\n");
    string with;
    getline (cin, with);
    
    printf ("\n--- --- Fixiere --- ---\n");
    i = 1;
    string line;
    int pos;
    while (argv[i]) {
      cout << argv[i] << endl;
      fstream r (argv[i], ios::in|ios::out);
      if (!r.is_open()) {
        cout << "  - Konnte nicht gelesen werden!" << endl;
      } else {
        while (!r.eof()) {
          r >> line;
/* Ersetzen der Vorkommnisse in der Zeile - Platzhalter */
          r << line;
        }
        r.close();
        cout << "  - Vorkommnisse ersetzt!" << endl;
      }
      i++;
    }
  }
  
  cout << endl;
  system ("PAUSE");
  return 0;
}


[quote="lol.txt"]hallo hans
der führer ist tot[/quote]

Ich ziehe jetzt die Textdatei lol.txt rein und werde gefragt,
welche Vorkommnisse womit ersetzt werden sollen.
Ich gebe ein hans und bei der Frage, womit es
ersetzt werden soll wurst.

Ersetzt wird ja auch ncihts, da ich keinen code reingesetzt habe,
der die Vorkommnisse ersetzt.

Ich habe statt


C++:
/* Ersetzen der Vorkommnisse in der Zeile - Platzhalter */


es versucht mit


C++:
          pos = line.find(replace);
          line.erase (pos, replace.length());
          line.insert (pos, with);


Aber wenn ich es so compiliere, schliesst das DOS-Fenster
nach Eingabe des Ersatzwortes sofort.

Wär' toll, wenn mir jemand hilft, das umzusetzen...
--
lol Signatur lol

Dieser Post wurde am 22.12.2006 um 15:13 Uhr von weed editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
23.12.2006, 14:49 Uhr
weed



Ich habe es jetzt folgendermaßen geschafft.


C++:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

string c2str (char* var) {
  string rueck = "";
  int i = 0;
  while (var[i]) {
        rueck += var[i];
        i++;
  }
  return rueck;
}

int main (int argc, char *argv[]) {
  int i = 1;
  if (!argv[i]) {
    printf ("Uebergeben sie Dateien, in denen Vorkommnisse ersetzt werden\nsollen, per Drag and Drop in dieses DOS-Programm!\n");
  } else {
      printf ("Dateien fuer den Replace-Prozess:\n");
      while (argv[i]) {
      printf ("%s\n", argv[i]);
      i++;
    }

    printf ("\nWelche Teilstringe sollen in den Dateien ersetzt werden?\n");
    string replace;
    getline (cin, replace);
    printf ("\nWomit?\n");
    string with;
    getline (cin, with);

    printf ("\n--- --- Fixen --- ---\n");
    i = 1;

    int pos;
    int replaced;
    string inhalt;
    char linie[100];
    while (argv[i]) {
      cout << argv[i] << endl;
      fstream r (argv[i], ios::in);
      if (!r.is_open()) {
        cout << "  - Konnte nicht geoeffnet werden!" << endl;
      } else {
        inhalt = "";
        bool weiter = (!r.eof())?true:false;
        while (weiter == true) {
          r.getline(linie, sizeof(linie));
          inhalt += c2str(linie);
          if (!r.eof()) {
            inhalt += "\n";
          } else {
            weiter = false;
          }
        }
        r.close();

        fstream w (argv[i], ios::out);
        if (!w.is_open()) {
          cout << "  - Konnte nicht zum Schreiben mit neuem Wert geöffnet werden!" << endl;
        } else {
          replaced = 0;
          pos = inhalt.find(replace);
          while (pos != -1) {
            inhalt.erase(pos, replace.length());
            inhalt.insert(pos, with);
            replaced++;
            pos = inhalt.find(replace);
          }
          w << inhalt;
          w.close();
          cout << "  - " << replaced << " Vorkommnisse ersetzt!" << endl;
        }
      }
      i++;
    }
  }
  
  cout << endl;
  system ("PAUSE");
  return 0;
}


Wenn ich jetzt eine Textdatei (lol.txt) mit dem Inhalt:
[/quote]hallo $epkmn_nr
bla $epkmn_nr[/quote]

in die exe reinziehe, werde ich gefragt, welche Vorkommnisse womit ersetzt werden
sollen in der lol.txt.
Ich gebe ein-> ersetzen: $epkmn_nr womit: $eigen_pkset
Dann gucke ich in die txt-Datei rein und es hat sauber
funktioniert.

Jetzt ziehe ich gleich 2 txt-Dateien rein udn es funktioniert sauber.
In beiden wurden die Vorkommnisse ersetzt und meine DOS-Anwendung
sagt sogar, wieviele Teilstrings ersetzt wurden.

Wenn ich jetzt aber eine *.brc Datei reinziehe (Textdatei halt nur mit .brc-Endung),
und ich gebe ein, was womit ersetzt werden soll, kommt anstatt eines
" - X Vorkommnisse ersetzt"
oder im Fehlerfall
" - Konnte nciht geöffnet werden"
ein Unterstrich und as wars...

Was habe ich da fasch gemacht?

/* edit */

Problem gelöst 8)


C++:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

string c2str (char* var) {
  string rueck = "";
  int i = 0;
  while (var[i]) {
        rueck += var[i];
        i++;
  }
  return rueck;
}

int main (int argc, char *argv[]) {
  int i = 1;
  if (!argv[i]) {
    printf ("Uebergeben sie Dateien, in denen Vorkommnisse ersetzt werden\nsollen, per Drag and Drop in dieses DOS-Programm!\n");
  } else {
      printf ("Dateien fuer den Replace-Prozess:\n");
      while (argv[i]) {
      printf ("%s\n", argv[i]);
      i++;
    }

    printf ("\nWelche Teilstringe sollen in den Dateien ersetzt werden?\n");
    string replace;
    getline (cin, replace);
    printf ("\nWomit?\n");
    string with;
    getline (cin, with);

    printf ("\n--- --- Fixen --- ---\n");
    i = 1;

    int pos;
    int replaced;
    string inhalt;
    char linie[100];
    bool weiter;
    fstream r;
    fstream w;
    while (argv[i]) {
      cout << argv[i] << endl;
      r.open(argv[i], ios::in);
      if (!r.is_open()) {
        cout << "  - Konnte nicht geoeffnet werden!" << endl;
      } else {
        inhalt = "";
        weiter = (!r.eof())?true:false;
        while (weiter == true) {
          r.getline(linie, sizeof(linie));
          inhalt += c2str(linie);
          if (!r.eof()) {
            inhalt += "\n";
          } else {
            weiter = false;
          }
        }
        r.close();

        w.open(argv[i], ios::out);
        if (!w.is_open()) {
          cout << "  - Konnte nicht zum Schreiben mit neuem Wert geöffnet werden!" << endl;
        } else {
          replaced = 0;
          pos = inhalt.find(replace);
          while (pos != -1) {
            inhalt.erase(pos, replace.length());
            inhalt.insert(pos, with);
            replaced++;
            pos = inhalt.find(replace);
          }
          w << inhalt;
          w.close();
          cout << "  - " << replaced << " Vorkommnisse ersetzt!" << endl;
        }
      }
      i++;
    }
  }
  
  cout << endl;
  system ("PAUSE");
  return 0;
}

--
lol Signatur lol

Dieser Post wurde am 23.12.2006 um 15:24 Uhr von weed editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
23.12.2006, 18:11 Uhr
0xdeadbeef
Gott
(Operator)


Zieh dir halt cygwin und lass sed drüber laufen:

bash:

#!/bin/sh

export TEMPFILE=$(mktemp)

for i in *.php
do
  sed 's/\$epkem_nr/$self_pkset/g' "$i" > $TEMPFILE
  mv $TEMPFILE "$i"
done
rm temp_xyz.php


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 23.12.2006 um 18:13 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: