保持文本文件在函数中擦除但是能够写入它吗? C ++

时间:2011-12-13 03:30:49

标签: c++ replace swap ifstream

我有一个函数可以在文件中一次交换两个字符,但是如果我尝试多次使用该函数,我将从文本文件和原始文本中擦除以前的交换现在回来了,因此第二次改变似乎是我的第一次。我怎么解决这个问题?

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 个答案:

答案 0 :(得分:1)

您可能想要做的是参数化您的功能:

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");

还有其他方法可以解决此问题。通过一次读取一个字符的文件,你进行了大量的函数调用......一个百万字节的文件将涉及100万次get()调用和100万次调用push_back()。大多数情况下,内部缓冲意味着这不会太慢,但有更好的方法:

Read whole ASCII file into C++ std::string

请注意,如果这是您正在解决的实际问题,则实际上并不需要将整个文件读入内存。您可以按块(或逐个字符)读取文件,并在不保留整个文件的情况下完成输出。

您可能在某些方面感兴趣的高级想法是内存映射文件。这使您可以将磁盘文件视为一个大型阵列,并可以在内存中轻松修改它...同时让操作系统担心每次要分页或分页的文件数量的详细信息。它们非常适合某些问题,并且在boost库中有一个与C ++平台无关的内存映射文件API:

http://en.wikipedia.org/wiki/Memory-mapped_file