Чтение числовых данных через текстовый файл и сохранение в переменную - PullRequest
0 голосов
/ 17 октября 2018

Пока это мой код.Он читает файл каждый раз, но вывод выглядит так:

-92559631349317830736831783200707727132248687965119994463780864.000000

для обоих прочитанных значений.Я только недавно изменил переменную с float на double.Я понимаю, что у меня есть неиспользуемые переменные, и это еще не весь код.Если бы я мог получить помощь, достаточную для отображения правильных значений в выражении cout, это было бы очень полезно.Что мне нужно сделать с моим inUserAccount заявлением?

Пока я проверил множество источников, и ничто не использует тот же код, который мы изучили до сих пор, или то, что в нашей книге.Файл, который мы читаем, выглядит следующим образом:

4567.89

15.98

один - чековый счет, другой - сбережения.Заранее спасибо.

#include <iostream>
#include <iomanip>
#include <string>
#include <fstream>

using namespace std;

int main() {

fstream inUserAccount;
double checkingBalance, savingsBalance;
char ChkorSav, option, yesorNo;
int  count=0;
bool validInput=true ;

while (validInput = true) {     // my loop for the whole ATM cycle
    cout << "Welcome to your ATM!\nPlease choose from the options below:\n"
        << "1:Deposit\n2:Withdraw\n3:Balance Inquiry\n4:Transfer Money\n";

    setprecision(2);

    while (validInput) {
        cin >> option;
        if (option == '1' || option == '2' || option == '3' || option == '4')
            validInput = false;

        else cout << "Please enter a valid option. \n";

        if (validInput == true && count >= 3)
            cout << "(Enter the corresponding number to the option you desire) \n";
        count++;
    }
    count = 0;          // resetting my loop variables
    validInput = true;


        inUserAccount.open("lab5data.txt");
        double savings, checking;
        inUserAccount >> fixed >> savings >> checking;
        cout << fixed << savings << endl << checking;

1 Ответ

0 голосов
/ 17 октября 2018

Если я правильно понимаю, ваш вопрос состоит в том, чтобы прочитать файл с числовыми значениями в разных строках, которые должны быть присвоены double s ...

Используйте эту магическую функцию:

template<class T>
std::vector<T> read_stream(std::ifstream& stream)
{
    std::vector<std::string> numerical_strings;               // A vector which stores all the lines...
    std::stringstream ss;                                     // Creating a string stream...
    ss << stream.rdbuf();                                     // Reading the contents of file into the string stream...
    std::string temporary;                                    // A temporary string that iterates over all lines...
    while (std::getline(ss, temporary, '\n'))                 // Looping over all lines...
        if (!temporary.empty())                               // We will only push it inside the vector if the line is not empty...
            numerical_strings.emplace_back(temporary);        // Push line inside the vector...
    std::vector<T> numbers;                                   // A vector of "numbers" of type you want...
    for (auto & elem : numerical_strings)                     // Iterate over the string vector...
    {
        auto temp_number = T(strtold(elem.c_str(), nullptr)); // Your usual conversion function...
        if (errno == ERANGE)                                  // Checking for errors...
            continue;                                         // If the line is alpha numeric or something like that, skip it...
        numbers.emplace_back(temp_number);                    // If the line is a valid number, push it inside the vector...
    }
    return numbers;                                           // Return the vector of the numbers of arbitrary type...
}


Пример, демонстрирующий его использование:
int main()
{
    std::ifstream some_file("account_file.txt");
    auto a = read_stream<long double>(some_file);
    for (auto b : a) // It will iterate through all the numeric lines, not just the first two...
        std::cout << std::fixed << std::setprecision(2) << b << std::endl;
    return 0;
}

Вывод:
4567,89
15.98


Примечание: Для вашей задачи вам нужны только первые два элемента вектора ... Так что просто проверьте, если он пуст, используяa.empty() и возьмите первый номер с a[0] и второй номер с a[1] ...


Кроме того, убедитесь, что эти списки включены вtop:

#include <fstream>
#include <sstream>
#include <iomanip>

С уважением,

Ruks.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...