【问题标题】:Deleting from a file C++从文件中删除 C++
【发布时间】:2015-01-27 16:27:29
【问题描述】:

好的,这是我目前用于删除功能的代码。

void classSchedule::deleteEntry(classSchedule schedule[], int numElems)
{
    string entryToDelete;
    cout << endl << "Enter the Teacher's Last Name of the Entry you want to delete: ";
    cin >> entryToDelete;

    int i, recordToDelete = -1;
    for (i = 0; i < numElems; i++)
    {
        if (schedule[i].teacherLastName == entryToDelete)
            recordToDelete = i;
    }
    if (recordToDelete != -1)
    {

    }

}

本质上是这样的:我有一个名为 schedule[] 的类数组,每个对象都有以下成员:班级部门、班级编号、学分、老师姓氏、老师名字、房间号和当前gpa。我通过询问他们想要删除的老师姓氏来开始我的功能,因为其余的都可以重复。我在我的对象中搜索了那个姓氏。

我想知道如何从文件中删除该对象的整个实例。

我是否可以用它前面或后面的对象覆盖它。

即他们想从 10 个实例中删除 schedule[4],我可以用 [5] 覆盖 [4],用 [6] 覆盖 [5] 等等?

编辑:

这是正在读取写入的文件(classes.txt):

ENG 112 3 Tetlof S S062 3.1

CST 280 3 Klingler T K114 3.4

LWA 220 2 Wesolak J M121 2.1

POL 103 4 Fortin B J122 4.1

ENG 111 2 Harood J K131 3.1

编辑2:

void classSchedule::outputToFile(classSchedule schedule[], int& numElems)
{
    ofstream fileOut;

    fileOut.open("classes.txt", ios::out | ios::app);

    fileOut << schedule[numElems - 1].classDepartment
            << " " << schedule[numElems - 1].creditHours
            << " " << schedule[numElems - 1].teacherLastName
            << " " << schedule[numElems - 1].teacherFirstName
            << " " << schedule[numElems - 1].roomWingAndNumber
            << " " << schedule[numElems - 1].currentGPA;
    fileOut.close();
}

【问题讨论】:

  • 除非性能有问题,否则将所有内容写入文件,就像创建新文件一样,但要从文件中删除的条目除外。
  • 我在原帖中添加了文件
  • 还添加了将新条目输出到文件中的文件

标签: c++ fstream ostream


【解决方案1】:

您有三种选择: 1) 将修改后的数据输出到新文件;或 2) 将记录标记为已删除,但可以重复使用;或 3) 将数据“向上”移动到未使用的插槽(如数组)。

也许您应该改用数据库。

许多应用程序将原始数据和修改后的数据写入新文件。要删除的数据不会写入文件。这是最简单的解决方案。

如果您的文件有固定大小的记录,您可以将已删除的记录标记为可用,以便再次使用。这可能需要在记录中添加一个标志,表明它是死的还是活的。

一个丑陋的方法是用它前面的数据覆盖已删除的数据。例如,如果我有一个包含 3 个句子的文件,我删除了第 2 个句子,我将读取第 3 个句子并将其写入第 2 个句子开始的位置。

【讨论】:

  • 所以对于 flag 方法,您是否考虑在文件中添加另一个值为 true 或 false 的值,如果它的 false 不输出,如果它的 true 输出它?
  • 您在文件中的记录中有一个标志。如果标志为真,则它是有效记录。如果标志为假,则忽略该记录,除非您需要重用该空间。抱歉,“输出”含糊不清。
  • 我建议您查看数据库,尤其是 Sqlite,因为它很小,但它会为您处理文件 I/O。
猜你喜欢
  • 1970-01-01
  • 2018-07-08
  • 1970-01-01
  • 2013-07-11
  • 2011-05-19
  • 2019-12-10
  • 2020-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多