Что вы, вероятно, хотите сделать, это параметризовать вашу функцию:
void swapping_letters(string inFileName, string outFileName)
{
ifstream inFile(inFileName);
ofstream outFile(outFileName);
...
Поскольку у вас нет параметров, вызов его дважды эквивалентен:
swapping_letters("decrypted.txt", "swap.txt");
swapping_letters("decrypted.txt", "swap.txt");
Но «decrypted.txt» не изменился после первого вызова, потому что вы не изменили входной файл. Поэтому, если вы хотите использовать выходные данные первой операции в качестве входных данных для второй, вам нужно написать:
swapping_letters("decrypted.txt", "intermediate.txt");
swapping_letters("intermediate.txt", "swap.txt");
Существуют и другие способы решения этой проблемы. Читая файл по одному символу за раз, вы совершаете довольно много вызовов функций ... файл размером в миллион байт будет включать в себя 1 миллион вызовов get () и 1 миллион вызовов push_back (). Большую часть времени внутренняя буферизация означает, что это не будет слишком медленным, но есть лучшие способы:
Считать весь файл ASCII в C ++ std :: string
Обратите внимание, что если это реальная проблема, которую вы решаете, вам на самом деле не нужно считывать весь файл в память. Вы можете читать файл блоками (или посимвольно, как вы это делаете) и делать вывод, не удерживая весь файл.
Продвинутая идея, которая может вас заинтересовать в какой-то момент - это отображаемые в память файлы. Это позволяет вам обращаться с дисковым файлом, как с большим массивом, и легко изменять его в памяти ... в то же время позволяя операционной системе беспокоиться о том, сколько файлов будет загружаться или выгружаться за раз. Они хорошо подходят для некоторых задач, и в библиотеке boost есть независимый от платформы API для файлов с отображением в памяти:
http://en.wikipedia.org/wiki/Memory-mapped_file