Можно ли открыть файл в параметре функции? - PullRequest
0 голосов
/ 24 сентября 2019

Я проверяю, правильно ли я что-то сделал здесь, в C ++.С тех пор, как недавно вышел Python, то, как все работает в языке, немного странно для меня, но я к этому привыкаю.

Задача состояла в том, чтобы:

Шаг 1: Определить структуру, которая может содержать информацию о банковских счетах.Первый: ■ Каждый экземпляр будет содержать имя для учетной записи и номер учетной записи.Мы создали входной файл, который имеет как минимум три учетные записи, называемые «accounts.txt»:

"moe 6
larry 28
curly 42"

Считать файл информации об учетной записи, заполнив вектор объектов учетной записи.Определите локальные переменные, соответствующие каждому элементу данных.Перебирайте файл, читая эти переменные.Очистите вектор, снова откройте файл (вызовите метод open) и повторите вышеописанное, за исключением использования фигурных скобок для инициализации экземпляра.Закройте файл и отобразите все объекты.

Шаг 2. Определите класс для хранения учетных записей.Повторите шаги из задачи 1, которые вы проделали с версией struct.Используйте ту же переменную потока!Напишите геттеры для доступа к полям в учетных записях при печати.Добавьте оператор вывода для вашего класса.Во-первых, повторите цикл печати, используя этот оператор вывода. Теперь сделайте оператор вывода другом, добавив прототип друга в определение класса своей учетной записи.Добавьте строку в оператор вывода, которая печатает поля «напрямую», т.е. без использования геттеров.Векторный метод push_back будет передан как временный объект, определенный как аргумент для push_back.Повторите заполнение вектора с помощью emplace_back и снова отобразите содержимое.

Шаг 3: Добавьте транзакции в свой мир.Транзакция будет реализована в виде класса и будет иметь поле для указания, является ли это депозитом или выводом средств, и поле для указания суммы, которую вносят или снимают.Класс учетной записи будет отслеживать транзакции, примененные к нему.Для хранения этой истории транзакций потребуется вектор.Также потребуется поле «Баланс», чтобы указать, сколько на счете.У счета будут методы «зачисление» и «снятие», которым будет передана сумма, и будет добавлен соответствующий объект транзакции в историю и, при необходимости, будет изменен баланс.Оператор вывода для учетной записи необходимо будет изменить, чтобы он мог отображать (форматировать) историю, то есть транзакции.Когда вы закончите, проверьте это, прочитав в другом файле "Transactions.txt", который имеет такие команды, как:

"Account moe 6
Deposit 6 10
Withdraw 6 100
Account larry 28
Withdraw 6 100
Deposit 6 10
Deposit 6 10
Withdraw 6 5
Account curly 42"

Я не уверен, правильно ли я открыл файл accounts.txt так, как онив розыске.Я определил это внутри параметра функции readandDisplayUsingStruct.Можно ли так делать?Казалось бы, это плохой стиль кодирования?Во всяком случае, они были очень конкретными в том, как я должен выполнить это задание с шагами, которые они предоставили.Это было более ограничительным, поскольку они не позволяли мне придумывать свой собственный способ сделать это.

Я предоставил фрагмент кода, который я написал ниже.


class AccountClass
{
private:
    string name;
    int accno;
    vector<Transaction> vHistory;
public:
    AccountClass(string nm, int acno) :name(nm), accno(acno)
    {

    }
    string getName()
    {
        return name;
    }

    int getaccno()
    {
        return accno;
    }

    void addTransaction(Transaction t)
    {
        vHistory.push_back(t);
    }
};

void readandDisplayUsingStruct(string fileName= "accounts.txt")
{
    ifstream fin;

    fin.open(fileName);

    if (!fin.is_open())
        return;

    string line;

    vector<Account> vAccounts;

    //Read each line from the file
    while (getline(fin, line))
    {
        stringstream ss(line);
        string name;
        int no;
        //Split the line into name and id using string stream
        ss >> name;
        ss >> no;
        Account acc{ name,no };
        vAccounts.push_back(acc);
    }

    cout << "The Read Values are" << endl;

    for (Account acc : vAccounts)
    {
        cout << "Name : " << acc.name << "\n";
        cout << "No : " << acc.accno << "\n";
    }

    //Clear the vector
    vAccounts.clear();

    fin.close();

    //Again do the same operation using local variables without Braces Initialisation.
    fin.open(fileName);

    if (!fin.is_open())
        return;

    string line1;

    vector<Account> vAccounts2;

    //Read each line from the file
    while (getline(fin, line1))
    {
        stringstream ss(line1);
        string name;
        int no;
        //Split the line into name and id using string stream
        ss >> name;
        ss >> no;
        Account acc;
        //Explicit initialisation
        acc.name = name;
        acc.accno = no;
        vAccounts2.push_back(acc);
    }

    std::cout << "The Read Values are" << endl;

    for (Account acc : vAccounts)
    {
        std::cout << "Name : " << acc.name << "\n";
        std::cout << "No : " << acc.accno << "\n";
    }

    fin.close();

}

...