gpt4 book ai didi

c++ - 写入和读取记录到.dat 文件 C++

转载 作者:行者123 更新时间:2023-11-30 03:02:03 27 4
gpt4 key购买 nike

我是 C++ 的新手,正在尝试弄清楚如何将以下结构格式的记录写入文本文件:

struct user {
int id;
char username [20];
char password [20];
char name [20];
char email [30];
int telephone;
char address [70];
int level;
};

到目前为止,我可以很好地写入它,但没有递增的 ID 号,因为我不知道如何计算记录数,所以在我将数据写入后文件看起来像这样文件。

1 Nick pass Nick email tele address 1
1 user pass name email tele address 1
1 test test test test test test 1
1 user pass Nick email tele addy 1
1 nbao pass Nick email tele 207 1

使用以下代码:

ofstream outFile;

outFile.open("users.dat", ios::app);

// User input of data here

outFile << "\n" << 1 << " " << username << " " << password << " " << name << " "
<< email << " " << telephone << " " << address << " " << 1;
cout << "\nUser added successfully\n\n";

outFile.close();

那么,如何在插入时增加每条记录的值,然后如何定位文件中的特定记录?

编辑:我已经能够显示每一行了:

  if (inFile.is_open())
{
while(!inFile.eof())
{

cout<<endl;
getline(inFile,line);
cout<<line<<endl;

}
inFile.close();
}

最佳答案

到目前为止你所拥有的还不错,除了它不能处理你的字符串中有空格的情况(例如在地址中!)

您要做的是编写一个非常基础的数据库。您需要三个需要单独实现的操作(尽管在某些情况下将它们交织在一起可能会给您带来更好的性能,但我相信这不是您关心的问题)。

  • 插入:你已经实现了这个。您唯一可能想要更改的是 """\n"。这样,结构的每个字段都在一个新行中,并且您的空格问题得到解决。后面看的时候需要一行一行的看
  • 搜索:要进行搜索,您需要打开文件,逐个读取结构(它本身包括读取与您的结构字段相对应的许多行)并确定您感兴趣的实体。如何处理它们是另一个问题,但最简单的情况是返回数组(或 vector )中的匹配实体列表。
  • 删除:这类似于搜索,只是您必须重写文件。你所做的基本上是,再次逐个结构地阅读结构,看看哪些符合你的删除标准。您忽略那些匹配的,并将其余部分写入(如插入部分)到另一个文件。之后,您可以用新文件替换原始文件。

这是一个伪代码:

Write-entity(user &u, ofstream &fout)
fout << u.id << endl
<< u.username << endl
<< u.password << endl
<< ...

Read-entity(user &u, ifstream &fin)
char ignore_new_line
fin >> u.id >> ignore_new_line
fin.getline(u.username, 20);
fin.getline(u.password, 20);
...
if end of file
return fail

Insert(user &u)
ofstream fout("db.dat");
Write-entity(u, fout);
fout.close();

Search(char *username) /* for example */
ifstream fin("db.dat");
user u;
vector<user> results;
while (Read-entity(u))
if (strcmp(username, u.username) == 0)
results.push_back(u);
fin.close();
return results;

Delete(int level) /* for example */
ifstream fin("db.dat");
ofstream fout("db_temp.dat");
user u;
while (Read-entity(u))
if (level != u.level)
Write-entity(u, fout);
fin.close();
fout.close();
copy "db_temp.dat" to "db.dat"

旁注:在写入数据后放置 \n 是个好主意(这样您的文本文件就会 end in a new line )

关于c++ - 写入和读取记录到.dat 文件 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10450900/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com