2013-04-14 2 views
5

У меня проблема с моей программой на C++ ... Вся моя программа - это база данных для имен учащихся, классов и возрастов, и у меня есть проблема с функцией, когда пользователь хочет удалить данные за 1 студент. Вот код:C++ удаление строки текста в файле

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; 
    } 
} 

Он работает, но проблема в том, что я ввожу данные студентов и когда я хочу, чтобы удалить его с помощью этой функции не удаляет его, я сначала закрыть программу, а затем повторно запустите программу, а затем вызовите эту функцию, чтобы она удаляла данные учащихся.

Как я могу изменить его, чтобы удалить данные студентов сразу после ввода, без необходимости сначала закрыть программу?

+0

Можете ли вы уточнить то, как вы его выполняете, например: «Я вводил данные о студентах», как? – Synxis

+1

Я запустил его в VS2012. Не было никаких проблем. – shivakumar

+0

Предположительно, вы сохраняете список имен учеников в другом месте во время запуска своей программы, а не только в файле, и вам также нужно удалить ученика. (Или очистите список и заполните его, когда вы скопируете имена.) –

ответ

3

Нравится это. Его eaiser, чтобы показать код, чем объяснить.

#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; 
} 
Смежные вопросы