2016-04-08 9 views
0

so arbeitete ich auf dem Programm und jetzt bin ich an einem Punkt, wo ich nicht eine Lösung finden können. Ich muss einige weitere Zeichen in der Fext-Datei ersetzen, denn jetzt ersetzt das Programm nur "TIT" durch die Codenummer "* 245 $ a", wenn ich andere Buchstaben auf die gleiche Weise ersetzen möchte, ändert sich das Programm nicht. Weiß jemand, wie ich noch mehr Ersetzungen in der Textdatei implementieren kann? Lassen Sie es mich wissen, wenn es eine bessere Möglichkeit gibt, mehr als 5 Zeichen durch andere zu ersetzen. DankeC++ Wörter in einem String (Textdatei) ersetzen

#include <fstream> 
#include <fstream> 
#include <iostream> 
#include <string> 
using namespace std; 


int main() 
{ 

    char dateiname[64], kommando[64]; 

    ifstream iStream; 

    cout << "Choose an activity" << endl << 
    " s - search " << endl << 
    " c - convert" << endl << 
    " * - end program" << endl; 
    cin.getline(kommando,64,'\n'); 
    switch(kommando[0]) 
    { 
     case 'c': 
      cout << "Enter a text file!" << endl; 
      cin.getline(dateiname,64,'\n'); 
      iStream.open("C://users//silita//desktop//schwarz.txt"); 

     case 's': 
      break; 
     case '*': 
      return 0; 
     default: 
      cout << "I can not read " << kommando << endl; 
    } 

    if (!iStream) 
    { 
     cout << "The File" << dateiname << "does not exist." << endl; 
    } 

    string s; 
    char o[] = "TIT"; 
    while (getline(iStream, s)) 
    { 
     while(s.find(o, 0) < s.length()) 
      s.replace(s.find(o, 0), s.length() - s.find(o, 3),"*245$a"); 

     cout << s << endl; 
    } 

    iStream.close(); 
} 
+0

Duplikat dieser http://stackoverflow.com/questions/5343190/how-do-i-replace-all-instances-of-a-string-with-another-string? – fghj

+0

das ist kein Duplikat, weil ich bereits mit einer Längenfunktion arbeite, also kann das nicht die Lösung sein. Das Problem besteht darin, mehr als ein Zeichen zu ersetzen, und dass meine Ersetzungsfunktion (am Ende des Codes) nicht korrekt ist. Die Ausgabe sollte sein: * 245 $ aAnsätze "korporativer Marktwirtschaft" in der Korea-Krise der Frühen fünfziger Jahre/burt meine outpout sieht wie folgt aus: * 245 $ a (der Text folgt in der zweiten Reihe, sollte aber in der gleichen Zeile sein) – silisun

Antwort

1

Sie map in C++ STL verwenden können mehrere convert Regeln zu speichern:

#include<map> 
#include<algorithm> 
using namespace std; 

map<string,string> convertRules; 
typedef map<string,string>::iterator MIT; 

void setConvertRules(int numOfRules){ 
    string word,code; 
    for(int i = 0 ; i < numOfRules; ++i){ 
     cin>>word>>code; 

     //Use code as search key in order to decrypt 
     //If you want to encrypt, use convertrules[word] = code; 
     convertRules[code] = word; 
    } 
} 

Um eine Datei zu konvertieren, wie folgt tun (einige Funktionen und Klassen deklariert werden müssen und umgesetzt erster, aber hier in erster Linie wir auf Top-Level-Design konzentrieren):

/* Detailed class implementations are omitted for simplicity */ 

//a class to store contents of a file 
class File; 

//a processor to read, insert and overwrite certain file 
class FileProcessor; 

void FileProcessor::convert(const string &code, const string &word){ 
    cursor == file.begin(); 
    while(cursor != fp.end()){ 
     _fp.convertNextLine(code,word); 
    } 
} 

File file; 
FileProcessor filePcr; 

int main() 

    const string sourceDir = "C://users//silita//desktop//schwarz.txt"; 
    const string destDir = "C://users//silita//desktop//schwarz_decrypted.txt"; 

    //Open a .txt file and read in its contents 
    if (!file.openAndReadIn(sourceDir)){ 
     cerr << "The File" << sourceDir << "does not exist." << endl; 
     abort(); 
    } 

    //Try to link processor to open file 
    if(!fp.linkTo(file)){ 
     cerr << "Access to file" << sourceDir << "is denied." << endl; 
     abort(); 
    } 

    //iterator is like a more safe version of C-style pointer 
    //the object type is a string-string pair 
    for(MIT it = convertRules.begin(); it != convertRules.end(); ++it){ 
     fp.convert(it->first, it->second); 
    } 

    file.saveAs(destDir); 
    return 0; 
} 

Schließlich, wenn ich würde vorschlagen, Sie verwenden C-Stil strstr Funkt Effizienz für den Umgang mit großen Dateien oder Batch-Verarbeitung. string :: find nimmt eine naive sequentielle Suche startegy während strstr mit dem berühmten KMP algorithm für fast pattern match in strings implementiert, die sowohl effizient und gründlich ist (kann alle Matchs in einem anstelle eines anderen for-Schleife gehen ersetzen).

+0

Vielen Dank, sehr hilfreiche Idee !! Also versuche ich jetzt, die Klassen zu implementieren, aber ich brauche noch Hilfe. Was sollten die beiden Klassen (file und filePcr) enthalten? Würde eine Antwort zu schätzen wissen! – silisun

+0

@silisun Die File-Klasse ist im Grunde eine 'Vektor ' wobei jedes Element des Vektors auf eine Zeile in der Datei entspricht, sofern es 'openAndReadIn' und' saveAs' Funktionen, die beide eine 'bool' Rückkehr anzeigt, ob der Betrieb ist erfolgreich. Die FileProcessor Klasse hat einen 'cursor' vom Typ' Vektor :: iterator' geschützten Zugriff auf den Inhalt der Datei zu liefern, während die Funktion ‚linkto‘ trys einen solchen Zugang zu Datei zu gewinnen, und wird das Ziel bei false zurück Datei ist klassifiziert. Der Rest der Funktionen kann leicht mit eingebauten Funktionen in 'std :: string' implementiert werden. – Lotayou