c++ - 防止文本文件在函数中删除但保持写入它的能力? C++

标签 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];
    }
}

最佳答案

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

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

请注意,如果这是您要解决的实际问题,您实际上不需要将整个文件读入内存。您可以按 block 读取文件(或像您一样逐个字符地读取文件)并在不保存整个文件的情况下进行输出。

您有时可能会感兴趣的一个高级概念是内存映射文件。这使您可以将磁盘文件视为一个大数组,并轻松地在内存中对其进行修改……同时让操作系统担心一次要调入或调出多少文件的详细信息。它们非常适合解决某些问题,并且在 boost 库中有一个独立于 C++ 平台的内存映射文件 API:

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

关于c++ - 防止文本文件在函数中删除但保持写入它的能力? C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8483998/

相关文章:

java - 我应该使用什么方法来替换字符串中的文本

SQL:替换为少量记录(mysql)

c - 为什么人们不使用异或交换?

go - 在 Go 中交换变量值的最佳方式?

java - 交换数组中的元素

c++ - 无法编译mysql源码

c++ - 是否有在 visual studio 2010 中自动包含类的快捷方式?

c++ - 在额外函数中使用 delete/new 时堆损坏

c++ - 缺少作用域变量 OpenCV c++

sql-server - TSQL 用窗口和 CTE 替换 "Quirky Update"计算