C++ 删除或覆盖文件中的现有信息
C++ deleting or overwriting existing information in a file
在 C++ 中有没有一种方法可以使用标准库来覆盖大文件中的二进制数据并保留文件中现有数据的其余部分,而无需首先加载整个文件?
示例:如果我有一个包含文本 "ABC" 的文件 "MyFile" 并且想将 'A' 替换为 'Q',是否有一种无需加载的方法"BC"进入内存?
我目前拥有的:
#include <fstream>
int main(int argc, char** argv)
{
std::fstream f;
f.open("MyFile",std::ios::in);
while (f.good())
{
char Current = f.get();
if (Current == 'A')
break;
}
int Location = f.gcount()-1;
f.close();
if (Location < 0)
{
printf("Nothing to do.\n");
return EXIT_SUCCESS;
}
else
{
f.open("MyFile",std::ios::in | std::ios::out);
f.seekp(Location);
f.write("Q",1);
//f.put('Q');
//f << "Q";
f.close();
return EXIT_SUCCESS;
}
}
这似乎现在有效 - 谢谢大家。
以 std::ios::in | std::ios::out
的身份打开文件,然后当您找到 'A' 的位置时,使用 f.seekg(Location);
将 "input caret" 移回该位置并写入文件。
请记住,您只能replace/overwrite。您不能追加到文件的中间。
这应该有效:
#include <fstream>
#include <iostream>
int main()
{
std::fstream f("d:\file.txt", std::ios::in | std::ios::out);
char c;
while (f >> c)
{
if (c == 'A')
{
f.seekp(-1, std::ios_base::cur);
f.put('Q');
return EXIT_SUCCESS;
}
}
std::cout << "Nothing to do." << std::endl;
return EXIT_SUCCESS;
}
在 C++ 中有没有一种方法可以使用标准库来覆盖大文件中的二进制数据并保留文件中现有数据的其余部分,而无需首先加载整个文件?
示例:如果我有一个包含文本 "ABC" 的文件 "MyFile" 并且想将 'A' 替换为 'Q',是否有一种无需加载的方法"BC"进入内存?
我目前拥有的:
#include <fstream>
int main(int argc, char** argv)
{
std::fstream f;
f.open("MyFile",std::ios::in);
while (f.good())
{
char Current = f.get();
if (Current == 'A')
break;
}
int Location = f.gcount()-1;
f.close();
if (Location < 0)
{
printf("Nothing to do.\n");
return EXIT_SUCCESS;
}
else
{
f.open("MyFile",std::ios::in | std::ios::out);
f.seekp(Location);
f.write("Q",1);
//f.put('Q');
//f << "Q";
f.close();
return EXIT_SUCCESS;
}
}
这似乎现在有效 - 谢谢大家。
以 std::ios::in | std::ios::out
的身份打开文件,然后当您找到 'A' 的位置时,使用 f.seekg(Location);
将 "input caret" 移回该位置并写入文件。
请记住,您只能replace/overwrite。您不能追加到文件的中间。
这应该有效:
#include <fstream>
#include <iostream>
int main()
{
std::fstream f("d:\file.txt", std::ios::in | std::ios::out);
char c;
while (f >> c)
{
if (c == 'A')
{
f.seekp(-1, std::ios_base::cur);
f.put('Q');
return EXIT_SUCCESS;
}
}
std::cout << "Nothing to do." << std::endl;
return EXIT_SUCCESS;
}