如何在C ++中删除一行?

时间:2014-05-21 18:33:43

标签: c++ file-io

我是文件处理的新手......

我正在编写一个程序,以下列格式保存文本文件中的数据:

         3740541120991
        Syed Waqas Ali
        Rawalpindi
        Lahore
       12-12-2012
         23:24
           1
            1

(对不好对齐,这不是程序的一部分)

现在我正在为删除记录的程序编写删除功能。 到目前为止,这是我的代码:

void masterSystem::cancelReservation()
{

string line;
string searchfor = "3740541120991";
int i=0;

ifstream myfile("records.txt");

while (getline(myfile, line))
{
    cout << line << endl;
    if (line==searchfor)
    {
                 // DELETE THIS + THE NEXT 8 LINES
    }
}

}

我做了一些研究,发现没有简单的方法来访问文本文件的行,所以我们必须创建另一个文本文件。 但问题是如何在将记录删除到新文本文件之前复制记录/数据?

2 个答案:

答案 0 :(得分:9)

打开输入文件;从输入文件一次读取一行。如果您决定要保留该行,请将其写入输出文件。另一方面,如果要“删除”该行,请不要将其写入输出文件。

答案 1 :(得分:0)

你可以拥有每行记录,并使例如更容易:

3740541120991|Syed Waqas Ali|Rawalpindi|Lahore|12-12-2012|23:24|1|1

|字符对每个字段进行调整。这是一种众所周知的技术,称为CSV(逗号分隔值)

这样您就不必担心读取连续行以删除记录并添加记录只访问该文件一次。

所以你的代码就是:

void masterSystem::cancelReservation()
{

    string line;
    string searchfor = "3740541120991";

    ifstream myfile("records.txt");

    while (getline(myfile, line))
    {
       // Here each line is a record
       // You only hace to decide if you will copy 
       // this line to the ouput file or not.
    }
}

不要只考虑删除记录,还需要针对此文件执行其他操作save a new recordread into memorysearch

考虑一下关于搜索的时刻,并考虑到您当前的设计,尝试回答这个问题:12-12-2012和上午12:00之间存在多少次预订?

在您的代码中,您必须访问每条记录 8次的文件,即使其他数据与问题无关。但是,如果你在一行中有每条记录,你只需要为每条记录访问文件1次。

有一些保留,差异接近0,但它呈指数增长(n ^ 8)。