c++ - 如何制作菜单以将用户输入数据保存或检索到文件?
问题描述
所以,我想知道是否有一种从文件中保存和检索用户输入数据的好方法。我想检索string arrays
,int
和的变量double
。我知道这getline
是常用的,但不适用于 int 和 double。关于我可以用来使其与 int 和 double 变量一起使用的任何建议或提示?
我一直在努力研究它,但我不知道我是否理解正确。
解决方案
从文件中保存和检索用户数据的一种好方法是使用类,如下例所示(抱歉葡萄牙语的评论):
//Gravando objetos em arquivos
#include <iostream>
#include <fstream> //ofstream e ifstream
using namespace std;
class Pessoa
{
private:
string nome;
int idade;
public:
string& getNome() //obter nome
{
return nome;
}
int getIdade() //obter idade
{
return idade;
}
void setNome(string& nome)
{
this->nome = nome;
}
void setIdade(int idade)
{
this->idade = idade;
}
//sobrecarga do operador de inserção de dados <<
//ostream = output stream
friend ostream& operator<<(ostream& os, const Pessoa p)
{
//escrever cada membro
os << "\n" << p.nome << "\n";
os << p.idade;
return os;
}
//sobrecarga do operador de extracao de dados >>
//istream = input stream
friend istream& operator>>(istream& is, Pessoa& p)
{
//ler cada membro
is >> p.nome >> p.idade;
return is;
}
};
char menu()
{
char resp;
cout << "Digite 1 para inserir pessoas\n";
cout << "Digite 2 para listar as pessoas\n";
cout << "Digite 0 para sair\n";
cout << "Opcao: ";
cin >> resp;
return resp;
}
int main(int argc, char *argv[])
{
char resp; //resposta
while(true) //loop infinito
{
resp = menu();
if(resp == '1')
{
Pessoa pessoa;
string nome;
int idade;
//abrir arquivo
ofstream ofs("arquivo.txt", fstream::app); //esse fstream::app eh de append, q eh pra adicionar ao final do arquivo
cout << "\nDigite o nome da pessoa: ";
cin >> nome;
cout << "Digite a idade da pessoa: ";
cin >> idade;
cout << endl;
//seta o nome da pessoa
pessoa.setNome(nome);
pessoa.setIdade(idade);
ofs << pessoa; //assim daria erro se nos nao sobrecarregassemos o operador
//fechar arquivo
ofs.close();
}
else if(resp == '2')
{
Pessoa p;
ifstream ifs("arquivo.txt");
cout << "\nListando pessoas...\n\n";
//verifica se o arquivo existe e se eh possivel o ler
if(ifs.good())
{
// eof == end of file
// enquanto n chegar no fim do arquivo
while(!ifs.eof())
{
ifs >> p; //n da certo se n sobrecarregar tbm / faz a extracao dos dados
//mostrar os dados
cout << "Nome: " << p.getNome() << "\n";
cout << "Idade: " << p.getIdade() << "\n\n";
}
ifs.close();
}
else
{
cout << "Falha ao abrir o arquivo!\n\n";
}
}
else if(resp == '0')
{
cout << "\nBye!\n";
break;
}
else
{
cout << "\nOpcao invalida. Tente novamente...\n\n";
}
}
return 0;
}
Aboutgetline()
不适用于int
and double
,这是因为getline()
只读取string
.
推荐阅读
- c# - SQL 到 Linq 的等效语法
- firebase - Firestore 使用身份验证名称为特定用户编写安全规则
- c++ - 如何用 C++ 编写一个基本的来回对话
- python - 如何从 Django View 函数中的另一个函数返回
- regex - Perl RegEx 删除字符串中的双字符而不是双数字
- python - 如何访问循环输入的字符串?
- cors - Microsoft Edge CORS 提取失败
- python-3.x - Selenium 无法在 python 中处理弹出窗口或警报
- parsing - Clojure 使用 into 填充贴图
- go - 为什么 proto marshal 然后 unmarshal 在包含供应商目录的项目之外运行时会失败?