从txt文件删除一行不起作用

时间:2019-10-11 05:44:06

标签: c++

我想删除我的txt文件中的一行

student courses
s111 cs214
s222 cs112
s333 cs218

我想从中删除第2行,即s222 cs112,我试图使用此getline代码,但没有删除一行。.它保留了用户输入的行,并删除了其余的行[note:user输入一个与它执行的数组相等的输入]] ...这是我删除文本行的代码

string course;
string stud;
int i = 0;
cout << "PLease enter course to delete" << endl;
cin >> stud;
while (stud != registration_details[i].get_id()) {
    fstream ofs;
    ofs.open("Registration.txt", ios::out | ios::trunc);
    ofs << registration_details[i].get_id() << registration_details[i].get_course();
    ofs.close();
    i++;
}

但是在输入[stud]中输入cs222之后,这就是我的文件发生的情况。

student courses
s111 cs214

我要删除的输入将删除,但与此同时,它也删除了第三部分,即s333 请帮助

3 个答案:

答案 0 :(得分:1)

看看循环的作用。它遍历registration_details数组,直到找到要删除的元素。在循环内,它将删除该文件,并将其替换为包含数组当前元素的单个行文件。因此,除非您告诉它删除第一行(在这种情况下它将不执行任何操作),否则它将用仅包含您要删除的行之前的行的单行替换文件。

您需要先打开文件(循环之前),然后循环遍历数组中的所有元素(因此,在找到要删除的行时不要停止)。对于不是要删除的条目的每个条目,都需要将其写出。

答案 1 :(得分:0)

条件为假时,我们使用的while循环将退出。在您的情况下,就是找到匹配项。因此,应用程序将不会在此之后打印下一组行。 您可以做的是:

  • 环绕所有行
  • 添加if条件并continue行 匹配的

请参阅下面的示例代码

fstream ofs;
ofs.open("Registration.txt", ios::out | ios::trunc);
for ( const auto& oLineDetails : registration_details )
{
    if ( stud == oLineDetails.get_id() )
    {
        continue;
    }
    ofs << oLineDetails.get_id() << oLineDetails.get_course();
}
ofs.close();

答案 2 :(得分:0)

您的代码中有两个错误:
1. while条件,如果为false(即当stud为匹配项时)将退出
2.为每个记录打开和截断文件

什么是registration_details?它是向量还是数组?我将首先使用std :: vector的size()或C语言风格的数组的sizeof(registration_details) / sizeof(registration_details[0])来获取其大小,并将其存储为可变大小。然后,我将执行以下操作:

fstream ofs;
ofs.open("Registration.txt", ios::out | ios::trunc);

for (size_t i=0; i < size; ++i)
{
    if (stud != registration_details[i].get_id())
    {
        ofs << registration_details[i].get_id() << " " << registration_details[i].get_course() << std::endl;
    }
}

ofs.close();