c++ - 删除文件 C++ 中的向量元素
问题描述
我一直在尝试从我的向量中删除一个元素使用fstream
一段时间。我之前发过一篇关于这个的帖子,我应用了你们的建议,但我仍然没有让我的程序删除我的向量元素。我可以创建我的 .txt 文件并将其重新写入另一个文件,但我无法让我的代码删除该元素。我想我在使用ios::truc
or时遇到了问题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");
}
解决方案
推荐阅读
- cuda - 如果我使用 31 个块,为什么这种 CUDA 缩减会失败?
- python - Pandas 从同一数据框中查找条件,然后添加到右侧作为新列
- graphviz - graphviz python如何不将集群中的节点与另一个集群中的节点对齐
- java - 为什么我的抽屉菜单在同一个 XML 上有一个 ConstraintLayout 时没有响应?
- r - 将列的平均值添加为折线图中的一个点
- laravel-5 - 在 Laravel 中将表与其模型的默认范围连接起来
- python - 在 python 中创建和使用首选项文件
- java - 当两个类都由两个不同的服务器提供服务时,Httpsession 属性不会传递给另一个类
- sequelize.js - 为什么sequelize查询返回一项但原始SQL返回2项?
- swift - UIStackView 具有自定义大小的元素和中心的项目 - Swift - 以编程方式