@evg_96

Как правильно организовать файловый ввод?

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

code
#define _CRT_SECURE_NO_WARNINGS

#include <iostream>
#include <fstream>
#include <cstdlib>

const int size = 60;

int main()
{
    char filename[size];
    std::ifstream in;

    std::cout << "Enter name of data file: ";

    std::cin.getline(filename, size);

    in.open(filename);

    if (!in.is_open())
    {
        std::cout << "Could not open the file " << filename << std::endl;
        std::cout << "Program terminating.\n";

        exit(EXIT_FAILURE);
    }

    double value;
    double sum = 0.0;
    int count = 0;

    in >> value;
    count++;
    sum += value;

    std::cout << "value: " << value << ", sum: " << sum << std::endl;

    while (in.good())
    {
        in >> value;
        count++;
        sum += value;

        std::cout << "value: " << value << ", sum: " << sum << std::endl;
    }

    if (in.eof())
        std::cout << "End of file reached.\n";
    else if (in.fail())
        std::cout << "Input terminated by data mismatch.\n";
    else
        std::cout << "Input terminated for unknown reason.\n";

    if (count == 0)
        std::cout << "No data processed.\n";
    else
    {
        std::cout << "Items read: " << count << std::endl;
        std::cout << "Sum: " << sum << std::endl;
        std::cout << "Average: " << sum / count << std::endl;
    }

    in.close();

    system("PAUSE");

    return 0;
}



Изначально пример кода содержал вот такой вот кусок кода:
in >> value;

while (in.good())
{
    ++count;
    sum += value;
    
    in >> value;
}


Но как бы он не соответствовал логическому результату. В итоге получалось что последний элемент не учитывался.
В общем как правильно организовывать файловый ввод, что бы все по красоте было и чтобы учитывались все данные, а не как я нагородил один и тот же код дважды чтобы тупо подогнать под результат...?

code2
in >> value;
count++;
sum += value;

std::cout << "value: " << value << ", sum: " << sum << std::endl;

while (in.good())
{
    in >> value;
    count++;
    sum += value;

    std::cout << "value: " << value << ", sum: " << sum << std::endl;
}

Правильно:
5ae5e1590b3ed970319138.pngНе правильно:
5ae5e1c2bb7af789551173.png
  • Вопрос задан
  • 63 просмотра
Пригласить эксперта
Ответы на вопрос 1
NIKITF
@NIKITF
Knows Russian language
Здравствуйте.
Предлагаю свой вариант решения, основанный на классе string


#include<iostream>
#include<fstream>
#include<string>
using namespace std;
int main()
{
	string namefile; cout << "Enter name of file: "; 
	cin >> namefile;
	namefile += ".txt"; cout << endl;
	ifstream Q(namefile); string temporary; 
	double summary{ 0 }; unsigned items{ 0 };
	while (Q >> temporary)
	{
		summary += stod(temporary);
		items++;
		cout << "Value: " << stod(temporary);
		cout << endl<< "Current summary: " << summary << endl;
		cout << endl<<endl<<endl; temporary.clear();
	}
	cout << "We have reached the edge." << endl << endl;
	cout << items << " items have just read" << endl << endl;
	cout << "Summary: " << summary << endl << endl;
	cout << "Average: " << (summary / items);
	return 0;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы