文件处理C++:这是处理数据库文件时使用的理想流

File handling C++:Which is the ideal stream to be used while working with database files?

本文关键字:文件 处理 理想 数据库 C++      更新时间:2023-10-16

我想了解在处理数据库文件时应该应用的文件处理流。我想创建一个数据库文件,即一个包含内容的文件,这些内容可以编辑

假设文件包含如下所示的数据

Harshul 97  Jack 42  Sergey 69  Bill 96  Mark 92  Will 49

它是一个数据库文件,包含用户的姓名以及他们账户中的资金(存储在账户名称之后)。

现在假设我想将一个新帐户添加到我的数据库中,为此我必须首先检查一个帐户是否已经存在,因为如果它存在,那么我将显示错误消息,否则我将通过将数据附加到文件中来创建一个新的帐户。

现在我认为我需要编辑数据,所以我应该使用fstream,但在使用fstrea时,我遇到了文件结束标记的问题,该标记将好比特设置为失败比特并停止文件I-o操作。我得到了一个解决方案,即在任何必要的地方清除流(每当文件指针命中eof时)

例如

fstream file("Filename.txt",ios::in|ios::ate|ios::out);
char str[80];
while(file>>str)
{
    //do the required stuff
}
//clear the stream and reuse it
file.clear();
file.seekp(0);

但这有点愚蠢,所以我想我应该使用peek()函数,它告诉我们下一个比特是否在它之前是eof,但得到的结果是,这不是正确的做法,而是我应该一次又一次地打开文件文件处理:在c++中,peec()函数有什么用?

然而,我也得到了同时使用ifstream和ofstream(没有trunk和ate模式)的建议,但我想知道我是否能够用它编辑数据条目"Finch96",直到我们不重新打开ifstream对象中的文件

我已经搜索了很多关于这件事的信息,但没有得到结果,可能是我不能正确地表达我的问题,现在我认为我的目标对所有来说都很清楚

如果您想手动编辑文本文件,文本文件是很好的。如果您将其称为数据库,并且只想以编程方式处理它,则应该考虑使用二进制文件。在最简单的级别上,您可以有一个具有固定大小记录的直接文件,这允许您进行记录的就地编辑。或者,如果你不想在圆形轮子存在的情况下重新发明椭圆轮子,你可以使用sqlite数据库来处理实现细节。

但是,如果您真的需要一个文本文件,您应该在一个记录容器中读取一次,并一次保存所有记录。一个好的做法是保存到同一文件夹中的临时文件中,只有在所有内容都已成功写入时才对其进行重命名。

您可能不应该首先创建文本文件。您是否考虑过使用sqlite或PostgreSQL或MongoDb之类的真实数据库?

如果您坚持以编程方式编辑文本文件,唯一的方法就是处理每一行:要么将它们全部保存在内存中,要么将它们(除了您要更改的文件)复制到某个新文件中。。。。这不是很有效。

您可能还对JSON等文本序列化格式感兴趣,它非常易于使用,功能非常强大。