Сохранить текстовый файл в функции, но сохранить возможность записи в него?C ++ - PullRequest
0 голосов
/ 13 декабря 2011

У меня есть функция, которая заменяет два символа в файле за раз, что работает, однако, если я попытаюсь использовать функцию более одного раза, предыдущий обмен, который я сделал, будет удален из текстового файла и исходного текста. сейчас вернемся, поэтому второе изменение будет казаться моим первым. как я могу решить это?

void swapping_letters()
{
    ifstream inFile("decrypted.txt");   
    ofstream outFile("swap.txt");
    char a;
    char b;
    vector<char> fileChars;

    if (inFile.is_open())
    {
        cout<<"What is the letter you want to replace?"<<endl;
        cin>>a;             
        cout<<"What is the letter you want to replace it with?"<<endl;
        cin>>b;

        while (inFile.good())
        {
            char c;
            inFile.get(c);
            fileChars.push_back(c);
        }                   
        replace(fileChars.begin(),fileChars.end(),a,b);
    }
    else
    {
        cout<<"Please run the decrypt."<<endl;
    }

    for(int i = 0; i < fileChars.size(); i++)
    {
        outFile<<fileChars[i];
    }
}

1 Ответ

1 голос
/ 13 декабря 2011

Что вы, вероятно, хотите сделать, это параметризовать вашу функцию:

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

...