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