2011-12-15 4 views
0

У меня есть код, который работает, но только один раз. Мне нужен ввод char a, который должен быть заменен на вход char b. В первый раз через цикл он меняет местами два выбранных символа, но на второй и последующих итерациях он ничего не делает, кроме того, что outFile одинаково. Как я могу поменять местами более двух символов, пока я не остановлюсь?Перестановка символов в файле, несколько раз

ifstream inFile("decrypted.txt"); 
ofstream outFile("swapped.txt"); 

const char exist = 'n'; 
char n = '\0'; 
char a = 0; 
char b = 0; 

cout<<"\nDo u want to swap letters? press <n> to keep letters or any button to continue:\n"<<endl; 
cin>>n; 

while (n != exist)       
{ 
    cout<<"\nWhat is the letter you want to swap?\n"<<endl; 
    cin>>a;    
    cout<<"\nWhat is the letter you want to swap it with?\n"<<endl; 
    cin>>b; 
    if (inFile.is_open()) 
    { 
     while (inFile.good()) 
     { 
      inFile.get(c); 

      if(c == b) 
      { 
       outFile<< a; 
      } 
      else if (c == a) 
      { 
       outFile<< b; 
      } 
      else 
      { 
       outFile<< c; 
      }        
     } 
    } 
    else 
    { 
     cout<<"Please run the decrypt."<<endl; 
    } 

    cout<<"\nAnother letter? <n> to stop swapping\n"<<endl; 
    cin>>n; 
} 

ответ

2

Рассмотрите другой подход.

Соберите все свопы символов в таблице поиска. По умолчанию translate['a'] == 'a', входной символ совпадает с символом вывода. Для обмена a с z только что установленным translate['a'] = 'z' и translate['z'] = 'a'.

Затем выполните один проход по файлу, скопировав и переведя в одно и то же время.

#include <array> 
#include <fstream> 
#include <iostream> 
#include <numeric> 

int main() 
{ 
    std::array<char,256> translate; 
    std::iota(translate.begin(), translate.end(), 0); // identity function 

    for (;;) 
    { 
     char a, b; 
     std::cout << "\nEnter ~ to end input and translate file\n"; 
     std::cout << "What is the letter you want to swap? "; 
     std::cin >> a; 
     if (a == '~') break; 
     std::cout << "What is the letter you want to swap it with? "; 
     std::cin >> b; 
     if (b == '~') break; 
     std::swap(translate[a], translate[b]); // update translation table 
    } 

    std::ifstream infile("decrypted.txt"); 
    std::ofstream outfile("swapped.txt"); 

    if (infile && outfile) 
    { 
     std::istreambuf_iterator<char> input(infile), eof; 
     std::ostreambuf_iterator<char> output(outfile); 
     // this does the actual file copying and translation 
     std::transform(input, eof, output, [&](char c){ return translate[c]; }); 
    } 
} 
+0

плохо проверить этот бит после работы, но быстрый взгляд кажется разумным. – Dom

+0

любая причина, почему мой способ не работал? поэтому я могу иметь в виду в следующий раз. – Dom

+0

Спасибо, что просто скомпилировали его и работали как удовольствие! ура! – Dom

2

Вы прочли весь файл и, как таковой, не будете читать больше байтов или записать больше байтов. Вы можете использовать поиск, чтобы вернуться к началу, или просто закрыть и повторно открыть файлы.

+0

Я добавил (а) в File.seekg (0); и outFile.seekp (0); но все же не удача – Dom

+0

может ли это быть другим флагом, поднимающимся отдельно от eof ?? я не могу посмотреть, будет ли там или нет – Dom