【问题标题】:How to make menu to save or retrieve user input data to file?如何制作菜单以将用户输入数据保存或检索到文件?
【发布时间】:2021-09-05 14:40:24
【问题描述】:

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

一直在研究,不知道理解对不对。

【问题讨论】:

  • 一种方法是将所有内容都转换为字符串。然后,将其作为 C 风格的字符串写入文件(不能直接写出std::string)。
  • @PaulSanders 有没有什么好的读物可以帮助我理解如何更好地做到这一点?我对 C++ 很陌生
  • 你可能会读到this(通过谷歌搜索找到C++ serialization)。

标签: c++ file save getline data-retrieval


【解决方案1】:

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

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

关于getline() 不适用于int 和double,这是因为getline() 只能读取string。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-22
    • 2013-12-24
    • 2023-04-02
    • 1970-01-01
    相关资源
    最近更新 更多