C ++删除文件中的文本行
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/15999193/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
C++ deleting line of text in a file
提问by user2279578
I have a problem with my c++ program... My whole program is a database for student names, grades and ages and I have a problem with function when user wants to delete data for 1 student. Here is the code:
我的 C++ 程序有问题...我的整个程序是一个学生姓名、年级和年龄的数据库,当用户想要删除 1 名学生的数据时,我的功能有问题。这是代码:
void deletestudentdata()
{
string name, grade, tname;
int age, x=0; // x - "counter" to check if user entered wrong name
system("cls");
cout << "Enter name of the student you want to erase from database" << endl;
cin >> tname;
ifstream students("students.txt");
ofstream temp("temp.txt"); // temp file for input of every student except the one user wants to delete
while(students >> name >> grade >> age)
{
if(tname!=name){ // if there are students with different name, input their data into temp file
temp << name << ' ' << grade << ' ' << age << endl;
}
if(tname==name){ // if user entered correct name, x=1 for later output message that the user data has been deleted
x=1;
}
}
students.clear(); // clear eof and fail bits
students.seekg(0, ios::beg);
students.close();
temp.close();
remove("students.txt");
rename("temp.txt","students.txt");
if(x==0){ // x was set to 0 at start, so if it didn't change, it means user entered the wrong name
cout << "There is no student with name you entered." << endl;
}
else{ // x is not 0, it means user entered the correct name, print message that students data has been deleted
cout << "Student data has been deleted." << endl;
}
}
It works, but the problem is that I enter student data and when I want to delete it via this function it doesn't delete it, I first have to close the program and then reopen the program and then call that function so it deletes students data.
它有效,但问题是我输入了学生数据,当我想通过此功能删除它时,它不会删除它,我首先必须关闭程序,然后重新打开程序,然后调用该函数,以便删除学生数据。
How can I change it so I can delete students data right after inputing, without having to close the program first?
如何更改它以便我可以在输入后立即删除学生数据,而不必先关闭程序?
回答by Software_Designer
It doesn't work when the student name is not found it just say student name deleted instead of saying it wasn't found
找不到学生姓名时它不起作用它只是说学生姓名已删除而不是说找不到
#include <string>
#include <vector>
#include <fstream>
#include <iostream>
using namespace std;
void displaystudentdata()
{
string name, grade, tname;
int age, x=0; // x - "counter" to check if user entered wrong name
system("cls");
ifstream students("students.txt");
cout<<"-------------------------------------------------------------------\n\n";
while(students >> name >> grade >> age)
{
cout<<"Name= "<<name <<", Grade= "<< grade <<" , Age= " <<age<<"\n";
}
students.clear(); // clear eof and fail bits
students.seekg(0, ios::beg);
students.close();
}
void deletestudentdata()
{
string name, grade, tname;
int age, x=0; // x - "counter" to check if user entered wrong name
ifstream students("students.txt");
ofstream temp("temp.txt"); // temp file for input of every student except the one user wants to delete
cout<<"-------------------------------------------------------------------\n\n";
cout << "Enter name of the student you want to erase from database >" << endl;
cin >> tname;
//ifstream students("students.txt");
//ofstream temp("temp.txt"); // temp file for input of every student except the one user wants to delete
while(students >> name >> grade >> age)
{
if(tname!=name){ // if there are students with different name, input their data into temp file
temp << name << ' ' << grade << ' ' << age << endl;
}
if(tname==name){ // if user entered correct name, x=1 for later output message that the user data has been deleted
x=1;
}
}
students.clear(); // clear eof and fail bits
students.seekg(0, ios::beg);
students.close();
temp.close();
remove("students.txt");
rename("temp.txt","students.txt");
if(x==0){ // x was set to 0 at start, so if it didn't change, it means user entered the wrong name
cout << "There is no student with name you entered." << endl;
}
else{ // x is not 0, it means user entered the correct name, print message that students data has been deleted
cout << "Student data has been deleted." << endl;
}
}
int main(void)
{
displaystudentdata();
deletestudentdata();
displaystudentdata();
cout << "Student data has been deleted. \n\n" << endl;
cout<<" \nPress any key to continue\n";
cin.ignore();
cin.get();
return 0;
}