首页 > 解决方案 > 如何制作菜单以将用户输入数据保存或检索到文件?

问题描述

所以,我想知道是否有一种从文件中保存和检索用户输入数据的好方法。我想检索string arrays,int和的变量double。我知道这getline是常用的,但不适用于 int 和 double。关于我可以用来使其与 int 和 double 变量一起使用的任何建议或提示?

我一直在努力研究它,但我不知道我是否理解正确。

标签: c++filesavegetlinedata-retrieval

解决方案


从文件中保存和检索用户数据的一种好方法是使用类,如下例所示(抱歉葡萄牙语的评论):

//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()不适用于intand double,这是因为getline()只读取string.


推荐阅读