2016-04-08 31 views
0

kelimelerini değiştirerek programımda çalıştım ve şimdi bir çözüm bulamadığım bir noktadayım. Fext dosyasındaki bazı işaretlerin yerini almam gerekiyor, çünkü program sadece "TIT" kodunu "* 245 $ a" kod numarasıyla değiştiriyor, eğer diğer harfleri de aynı şekilde değiştirmek istersem, program değişmiyor. Metin dosyasında daha fazla yer değiştirmeyi nasıl uygulayabileceğimi bilen var mı? Başka biriyle 5'ten fazla işareti değiştirmek için daha iyi bir seçenek varsa bana bildirin. sadece bazı işlevler ve sınıflar beyan ve uygulanması gereken (şunları yapın bir dosya dönüştürmek içinC++ bir dizgede (metin dosyası)

#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; 
    } 
} 

: Birden dönüştürme kurallarını saklamak için C++ STL içinde map kullanabilirsiniz size

#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

bu http://stackoverflow.com/questions/5343190/how-do-i-replace-all-instances-of-a-string-with-another-string dosyasının kopyalarını mı? – fghj

+0

bu bir kopya değil çünkü zaten bir uzunluk fonksiyonu ile çalışıyorum, bu yüzden bu çözüm olamaz. Sorun birden fazla işareti değiştirmek ve değiştirme işlevimin (kodun sonunda) doğru olmamasıdır. Çıkış olmalıdır: * 245 $ aAnsätze "korporativer Marktwirtschaft" der Kore-Krise der frühen fünfziger Jahre/burt benim çıkarım böyle görünüyor: * 245 $ a (metin ikinci satırda izler, ama aynı satırda olmalıdır – silisun

cevap

1

ederiz ilk, ama burada biz çoğunlukla) üst düzey tasarımı odaklanmak:

/* 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; 
} 

Son olarak, öneririm eğer C-stili strstr fonksiyonu kullanmak Büyük dosyalar veya toplu işleme ile uğraşırken verimlilik için iyon. string :: find, strstr, fast pattern match in strings için KMP algorithm numaralı geçerli bir naif ardışık arama başlatır, hem verimli hem de kapsamlıdır (tüm eşlemeleri bir başka döngü yerine bir seferde değiştirebilir).

+0

Teşekkür ederim, çok yararlı bir fikir! Bu yüzden şimdi dersleri uygulamaya çalışıyorum ama hala biraz yardıma ihtiyacım var. İki sınıf (dosya ve filePcr) ne içermelidir? Bir cevabı takdir ederdim! – silisun

+0

@silisun File sınıfı temelde bir vektörü 'dir, burada vektörün her elemanı dosyanızdaki bir satıra karşılık gelir, 'openAndReadIn' ve' saveAs' işlevlerini sağlamış, her ikisi de işlemin olup olmadığını belirten bir 'bool' döndürür başarılı. FileProcessor sınıfı, dosyanın içeriğine korumalı erişim sağlamak için 'linkTo' işlevi dosyaya erişmek için erişir ve hedefte false değerini döndürürse, " :: yineleyici" türünde bir "imleç" sözcüğüne sahiptir. dosya sınıflandırıldı. Geri kalan işlevler, std :: string' içindeki yerleşik işlevler kullanılarak kolayca uygulanabilir. – Lotayou