首页 > 解决方案 > 删除文件 C++ 中的向量元素

问题描述

我一直在尝试从我的向量中删除一个元素使用fstream一段时间。我之前发过一篇关于这个的帖子,我应用了你们的建议,但我仍然没有让我的程序删除我的向量元素。我可以创建我的 .txt 文件并将其重新写入另一个文件,但我无法让我的代码删除该元素。我想我在使用ios::trucor时遇到了问题ios::out。有什么建议吗?随意尝试我的代码并检查一下。

#include <iostream>
#include <string>
#include <vector>
#include <iterator>
#include <fstream>
#include <stdlib.h>

using namespace std;


void Menu()
{
    cout << "******************" << endl;
    cout << "1 - Add student" << endl;
    cout << "2 - Delete student" << endl;
    cout << "3 - All students" << endl;
    cout << "******************" << endl;
}

struct School
{
    string Name;
    string remove;
    int Ages;
    int Option;
};

int main()
{
    School Students;
    vector <string> Names;

    ofstream Myfile("practiceFile.txt", ios::app);

    if(!Myfile.is_open())
    {
        cout << "Error opening file" << endl;
    }

    if(Myfile.is_open())
    {
        Menu();
        cout << endl;
        cout << "Option: ";
        cin >> Students.Option;
        cin.ignore();

        if(Students.Option == 1)
        {
            cout << "Enter name: ";
            getline(cin, Students.Name);
            Names.push_back(Students.Name);

            for(int i = 0; i < Names.size(); i++)
            {
                Myfile << Names[i] << endl;
            }
        }    
    
        if(Students.Option == 2)
        {
            cout << "Enter name: ";
            getline(cin, Students.remove);
            
            for(int i = 0; i < Names.size(); i++)
            {
                if(Students.remove == Names[i])
                {
                    auto itr = find(Names.begin(), Names.end(), Students.remove);
                    if(itr != Names.end())
                    {
                        Names.erase(itr);
                        Myfile << Names[i] << endl;
                    }
                }
            }
        }
    }


    ofstream TempFile("practiceFile_temp.txt", ios::trunc|ios::out);

    if(TempFile.is_open())
    {
        for(int i = 0; i < Names.size(); i++)
        {
            TempFile << Names[i] << endl;
        }
    }

    TempFile.close();
    Myfile.close();
 
    remove("practiceFile.txt");

    rename("practiceFile_temp.txt", "practiceFile.txt");
    
    string line;
    ifstream NewFile("practiceFile.txt", ios::in);
    
    while(NewFile >> line)
    {
        if(Students.Option == 3)
        {
            cout << line << endl;
        }         
    }
}

实际上,如果您编译我的代码,您将无法将字符串保存到文件中。但是当我删除这部分代码(如下)时,至少我可以将字符串保存到文件中但不能删除它们。正如我之前所说,我认为我没有使用ios::trunc|ios::out正确的。谢谢!

    ofstream TempFile("practiceFile_temp.txt", ios::trunc|ios::out);

    if(TempFile.is_open())
    {
        for(int i = 0; i < Names.size(); i++)
        {
            TempFile << Names[i] << endl;
        }
    }

    TempFile.close();
    Myfile.close();
 
    remove("practiceFile.txt");

    rename("practiceFile_temp.txt", "practiceFile.txt");

更新:

#include <iostream>
#include <string>
#include <vector>
#include <iterator>
#include <fstream>
#include <stdlib.h>

using namespace std;


void Menu()
{
    cout << "******************" << endl;
    cout << "1 - Add student" << endl;
    cout << "2 - Delete student" << endl;
    cout << "******************" << endl;
}

struct School
{
    string Name;
    string remove;
    int Ages;
    int Option;
};

int main()
{
    School Students;
    vector <string> Names;

    ifstream NewFile("practiceFile.txt");

    string line;
    while(getline(NewFile, line))
    {
        cout << line << endl;
    }

    ofstream Myfile("practiceFile.txt", ios::app);

    if(!Myfile.is_open())
    {
        cout << "Error opening file" << endl;
    }

    if(Myfile.is_open())
    {
        Menu();
        cout << endl;
        cout << "Option: ";
        cin >> Students.Option;
        cin.ignore();

        if(Students.Option == 1)
        {
            cout << "Enter name: ";
            getline(cin, Students.Name);
            Names.push_back(Students.Name);
        }    
    
        if(Students.Option == 2)
        {
            cout << "Enter name: ";
            getline(cin, Students.remove);
            
            for(int i = 0; i < Names.size(); i++)
            {
                if(Students.remove == Names[i])
                {
                    Names.erase(Names.begin() + i);
                }
            }
        }

        for(int i = 0; i < Names.size(); i++)
        {
            Myfile << Names[i] << endl;
        }
    }

    ofstream TempFile("practiceFile_temp.txt", ios::trunc);

    if(TempFile.is_open())
    {
        for(int i = 0; i < Names.size(); i++)
        {
            TempFile << Names[i] << endl;
        }
    }

    TempFile.close();
    Myfile.close();
 
    remove("practiceFile.txt");

    rename("practiceFile_temp.txt", "practiceFile.txt");
}

标签: c++vectorfstream

解决方案


推荐阅读