C++ 从文本文件中删除行?c++;
我想从文本文件中删除一行。首先,我复制源文件的内容,并将删除的记录标记为“已删除”到临时文件。接下来,我将源文件从临时文件中过度加载,但标记为“已删除”记录的文件除外。我的程序会自动将文件名和下3行标记为“已删除” 这是我的密码:C++ 从文本文件中删除行?c++;,c++,C++,我想从文本文件中删除一行。首先,我复制源文件的内容,并将删除的记录标记为“已删除”到临时文件。接下来,我将源文件从临时文件中过度加载,但标记为“已删除”记录的文件除外。我的程序会自动将文件名和下3行标记为“已删除” 这是我的密码: #include <iostream> #include <fstream> #include <string> using namespace std; int main() { string temp; st
#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);
因此,文件的内容首先被擦除
那么,还有其他人在说什么。为什么要复制文件两次?那太过分了。为什么不先创建没有删除记录的新文件,然后将临时文件重新命名为原始文件?除非您想保留原始文件,否则根本不需要备份。将内容保存在内存中,然后在删除的记录中重新写入文件。不过,这假设文件总是足够小,可以保存在内存中。如果不是这样,那么萨姆的建议更好。