C++ 从文本文件中删除行?c++;

C++ 从文本文件中删除行?c++;,c++,C++,我想从文本文件中删除一行。首先,我复制源文件的内容,并将删除的记录标记为“已删除”到临时文件。接下来,我将源文件从临时文件中过度加载,但标记为“已删除”记录的文件除外。我的程序会自动将文件名和下3行标记为“已删除” 这是我的密码: #include <iostream> #include <fstream> #include <string> using namespace std; int main() { string temp; st

我想从文本文件中删除一行。首先,我复制源文件的内容,并将删除的记录标记为“已删除”到临时文件。接下来,我将源文件从临时文件中过度加载,但标记为“已删除”记录的文件除外。我的程序会自动将文件名和下3行标记为“已删除”

这是我的密码:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main()
{
    string temp;
    string line;
    string strReplace_name;
    string deleted="deleted";

    int timer=0;

    fstream filein("filein.txt");
    fstream fileout("fileout.txt");
    if(!filein || !fileout)
    {
        cout << "Error opening files!" << endl;
        return 1;
    }

    cout<<"Name: ";getline(cin,strReplace_name);

    string checking;
    int counter=1;

    while(getline(filein,checking))
    {
        if((counter%4==1)&&checking == strReplace_name)
        {
            goto sucess;
        }
        counter++;

    }
    cout<<"Error,No such name!"<<endl;
    goto error;


    sucess:
    filein.close();

    filein.open("filein.txt");

    while(getline(filein,temp))
    {
            if(temp == strReplace_name)
            {
                temp = deleted;
                fileout << (temp += "\n");

                getline(filein,temp);
                temp = deleted;
                fileout << (temp += "\n");

                getline(filein,temp);
                temp = deleted;
                fileout << (temp += "\n");

                getline(filein,temp);
                temp = deleted;
                fileout << (temp += "\n");
            }
            else
            {
                temp += "\n";
                fileout << temp;
            }
    }

    filein.close();
    fileout.close();
    filein.open("filein.txt");
    fileout.open("fileout.txt");
    if(!filein || !fileout)
    {
        cout << "Error opening files!" << endl;
        return 1;
    }

    while(getline(fileout,line))
    {
        if(line!=deleted)
        {
            filein << line << endl;
        }

    }
    error:
        return 0;
}
运行后的临时文件:

dumb
10001
16
girl
deleted
deleted
deleted
deleted
ABC
1002
56
boy
dumb
10001
16
girl
ABC
1002
56
boy




1002
56
boy
运行后的源文件:

dumb
10001
16
girl
deleted
deleted
deleted
deleted
ABC
1002
56
boy
dumb
10001
16
girl
ABC
1002
56
boy




1002
56
boy

为什么在运行编译器后我的源代码会这样?我的代码有问题吗???

您正在覆盖内容,但必须先删除它

filein.txt的内容是:

dumb\n10001\n16\ngirl\nnice\n10002\n19\ngirl\nABC\n1002\n56\nboy
将光标重置为文件写入的开头:

dumb\n10001\n16\ngirl\nABC\n1002\n56\nboy\n
使用输入数据运行代码后得到的结果是

dumb\n10001\n16\ngirl\nABC\n1002\n56\nboy\nrl\nABC\n1002\n56\nboy

我无法重建输出中的空行,但解决方法是先清除文件,或写入新文件并移动它。

最终文件损坏的原因是依赖于
fstrem::open()
的默认
模式。当您打开
filein.open(“filein.txt”)
最后一次(当您向它输出时,它实际上应该被称为
fileout
),您应该使用:

filein.open("c:\\temp\\filein.txt", ios_base::out | ios_base::trunc);
因此,文件的内容首先被擦除


那么,还有其他人在说什么。

为什么要复制文件两次?那太过分了。为什么不先创建没有删除记录的新文件,然后将临时文件重新命名为原始文件?除非您想保留原始文件,否则根本不需要备份。将内容保存在内存中,然后在删除的记录中重新写入文件。不过,这假设文件总是足够小,可以保存在内存中。如果不是这样,那么萨姆的建议更好。