我想知道在处理数据库文件时应该应用的文件处理流。我想创建一个数据库文件,即包含内容的文件,这些内容可以编辑
例如 - 假设文件包含以下数据
Harshul 97 Jack 42 Sergey 69 Bill 96 Mark 92 Will 49
这是一个数据库文件,其中包含用户姓名以及帐户中的资金(存储在帐户名称后面)。
现在假设我想在我的数据库中添加一个新帐户,我必须首先检查一个帐户是否已经存在,因为如果它存在,那么我将显示错误消息,否则我将只是通过追加创建一个新帐户数据到文件中。
现在我认为我需要编辑数据,所以我应该使用fstream但是在使用fstream的时候我遇到了文件结束标记的问题,它设置了很好的位到失败位并停止文件io操作我得到了一个解决方案为此,即在必要时清除流(每当文件指针击中eof时)
EG -
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但是得到的结果是它不是正确的事情而是我应该打开该文件一次又一次File Handling:What is the use of peek() function in c++?
虽然我也同时建议使用ifstream和ofstream(没有截断和吃模式),但我想知道我是否能够用它编辑数据。假设我输入了一个新的个人说法的详细信息&# 34; Finch 96"现在,ofsteam变量将考虑新的条目,但对于ifstream对象,它先前已将文件数据读入其缓冲区,并且没有考虑我们的新条目" Finch 96"直到我们不在ifstream对象中重新打开文件
我已经搜索了很多关于此事的内容,但没有得到结果可能是我无法正确表达我的问题而现在我认为我的目标对所有人都很清楚
答案 0 :(得分:1)
您可能不应该首先创建文本文件。您是否考虑过使用sqlite或某些真实数据库,例如PostgreSQL或MongoDb?
如果您坚持以编程方式编辑文本文件,唯一的方法是处理每一行:要么将所有行保存在内存中,要么将它们(除了您要更改的文件除外)复制到一些新文件中....哪个效率不高。
您可能也对文字serialization格式感兴趣,例如JSON,它非常易于使用且非常强大。
答案 1 :(得分:1)
如果您希望能够手动编辑 ,则文本文件很不错。如果将其称为数据库,并且只想以编程方式处理它,则应考虑二进制文件。在最简单的级别,您可以拥有固定大小记录的直接文件,这样您就可以进行就地记录编辑。或者,如果您在周围存在圆形轮子时优先不重新发明椭圆形轮子,则可以使用sqlite数据库来处理实现细节。
但是如果你真的需要一个文本文件,你应该在一个记录容器中读取它一次,并一次保存所有记录。一个好的做法是保存到同一文件夹中的临时文件,并仅在成功写入所有内容后重命名。