如何在不删除 c++ 内容的情况下编辑 txt 文件?

How can i edit a txt file without deleting the content in c++?

提问人:KraKen Wtf 提问时间:11/27/2022 更新时间:11/29/2022 访问量:209

问:

我想在 txt 文件中创建一个数据库并使用 seekp() 访问它并编辑它的某些部分,但是当我打开文件写入其中时,程序会创建一个新文件,删除前一个文件。


#include <fstream>
#include <iostream>
using namespace std;

int main() {

    ofstream g;
    g.open("text.txt",ios::out);
    if(!g.is_open())
        cout<<"error";
    else {
        g.seekp(2);
        g.write("apple",5);
    }
    g.close();

    return 0;
}
C++ 文件 fstream 输出

评论

2赞 Neil Butterworth 11/27/2022
您无法有效地就地编辑文本文件
0赞 john 11/27/2022
您只能将文件中间的数据替换为相同大小的新数据。您无法删除或插入数据。

答:

2赞 Cee McSharpface 11/27/2022 #1

您需要不同的打开模式。

当涉及到 ofstream 的行为时,文档非常晦涩难懂(出于所有实际目的,您观察到的行为是设计使然:它将截断)。

请改用 with。fstreamios_base::in | ios_base::out | ios_base::binary

除非您使用某个字符始终为一个、两个或四个字节的编码,否则您将无法始终如一地使用文本模式执行此操作。此外,在文件结束前的任何查找位置写入不会将内容移到当前查找位置之外,它只是被覆盖。因此,为了实现类似数据库的行为,您至少需要某种固定大小的记录或索引数据结构。

评论

0赞 john 11/27/2022
OP 想要编辑文本文件的一部分。无论选择哪种打开模式,这都是不可能的,除非新数据的大小与旧数据相同。我认为这个答案没有充分解释。
0赞 KraKen Wtf 11/28/2022
iOS 和 ios_base有什么区别?
0赞 Cee McSharpface 11/29/2022
stackoverflow.com/a/19128092/1132334“将 std::ios_base 用于 std::ios_base 中实际定义的成员:这样,任何查找定义的人都不必通过沿继承链向上走来查找文档”