从文件C ++中删除

时间:2015-01-27 16:27:30

标签: c++ fstream ostream

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

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 []的类数组,每个对象都有以下成员:class department,class number,credit hours,teacher name,teacher first name,room number and current GPA。我通过向他们询问他们想要删除的教师姓氏来开始我的职能,因为所有其他人都可以重复。我在我的对象上搜索了这个姓氏。

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

我是否可以用它前面或后面的物体覆盖它。

即。他们想要删除10个实例中的时间表[4]我可以用[5]覆盖[4],[5]用[6]覆盖等等吗?

编辑:

这是正在读取的文件写入(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

EDIT2:

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();
}

1 个答案:

答案 0 :(得分:1)

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

也许您应该使用数据库。

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

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

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