Работа с файлами (считывание и запись)

104
09 ноября 2021, 09:40

Надо при помощи генератора случайных чисел сформировать 10 чисел в файле. Найти сумму максимального и минималного числа в файле. Числа от 0 до 30.

Проблема:

#include <iostream>
#include <cstdlib>
#include <time.h>
#include <fstream>
using namespace std;
int main()
{
    setlocale(LC_ALL, "ru");
    srand(time(NULL));
    int res = 0, i, min, max, num;
    ofstream File("doc.txt");
    if (!File) {
        cout << "Ошибка: файл не найден" << endl;
        return 1;
    }
    for (i = 0; i < 10; i++) {
        num = rand() % 30;
        File << num;
    }
    File.close();
    ifstream File2("doc.txt");
    int get, k;
    int A[1000];
    if (!File2) {
        cout << "Файл не найден!" << endl;
    }
    else {
        k = 0;
        while (File2 >> get) {
            A[k++] = get;
        }
        max = A[0];
        min = A[0];
        for (i = 0; i < 10; i++) {
            if (max < A[i])
                max = A[i];
            if (min > A[i])
                min = A[i];
        }
        cout << "Максимальное значение массива: " << max << endl;
        cout << "Минимальное значение массива: " << min << endl;
        res = max + min;
    }
    File2.close();
    cout << "Результат: " << res << endl;
    system("pause");
    return 0;
}
Answer 1

А вы не хотите разделять выводимые числа, например, пробелами? Или с новой строки? А не лепить их в одно большое число?

Скажем,

for (i = 0; i < 10; i++) {
    num = rand() % 30;
    File << num << " ";
}

Если бы вы не полагались на "магическую константу" 10, а сделали вот так:

    k = 0;
    while (File2 >> get) {
        A[k++] = get;
    }
    cout << "Считано " << k << " чисел" << endl;
    max = A[0];
    min = A[0];
    for (i = 0; i < k; i++) {

то ошибка стала бы очевидной сразу...

Answer 2

Вот зачем вам понадобилось хранить прочитанное в массиве, непонятно. Все что нужно сделать, это вот:

//учитывая, что ваши числа от 0 до 30
int max = -1, min = 31,
    n{}, cur{};
while (File2 >> cur && n < 10) {
    if (max < cur) max = cur;
    if (min > cur) min = cur;
    ++n;
}
cout << "minel " << min
     << "\nmaxel " << max
     << "\nsum = " << min + max;

Да, еще и при записи в файл вы ошиблись(см. ответ от Harry}

Answer 3
#include <iostream>
#include <vector>
#include <functional>
#include <random>
#include <cstdint>
#include <filesystem>
#include <iterator>
#include <fstream>

static decltype(auto) GetRandomEngine(int64_t bottomBorder, int64_t upperBorder) noexcept
{
    std::mt19937_64 generator(std::random_device{}());
    std::uniform_int_distribution<> uid(bottomBorder, upperBorder);
    return std::bind(uid, generator);
}

static std::vector<int64_t> GetVectorWithEntropy(uint64_t size, int64_t bottomBorder, int64_t upperBorder) noexcept
{
    auto random_generator{GetRandomEngine(bottomBorder, upperBorder)};
    std::vector<int64_t> data(size);
    std::generate(std::begin(data), std::end(data), random_generator);
    return data;
}

static std::filesystem::path CheckAndGetFileDescriptor(std::string file_name, bool exists)
{
    auto file_path = std::filesystem::current_path() / file_name;
    if (exists && std::filesystem::exists(file_path)) {
        throw std::runtime_error{"Error! file exist"};
    }
    if (!exists && !std::filesystem::exists(file_path)) {
        throw std::runtime_error{"Error! file no exist"};
    }
    return file_path;
}

template<typename T>
static void WriteDataToFile(std::vector<T> data, std::string file_name) 
{
    std::ofstream out_stream(CheckAndGetFileDescriptor(file_name, true), std::ios::out);
    if (!out_stream.is_open()) {
        throw std::runtime_error{"Error open file"};
    }
    std::copy(std::begin(data), std::end(data), std::ostream_iterator<int64_t>{out_stream, " "});
    out_stream.close();
}

template<typename T, auto MaxOrMin>
static T GetMaxOrMinValueFromFile(std::string file_name)
{
    T ret{};
    if (MaxOrMin) {
        ret = std::numeric_limits<T>::min();
    } else {
        ret = std::numeric_limits<T>::max();
    }
    auto f_obj{ [&](T n){ MaxOrMin ? ret = std::max(ret, n) : ret = std::min(ret, n);} };
    std::ifstream in_stream(CheckAndGetFileDescriptor(file_name, false), std::ios::in);
    if (!in_stream.is_open()) {
        throw std::runtime_error{"Error open file"};
    }
    std::for_each(std::istream_iterator<T>(in_stream), std::istream_iterator<T>(), f_obj);   
    in_stream.close();
    return ret;
}

int main()
{
    int64_t bottom{0};
    int64_t upper{30};
    uint64_t size{10};
    std::string file_name{"information"};
    auto data{GetVectorWithEntropy(size, bottom, upper)};
    try {
        WriteDataToFile<int64_t>(data, file_name);
        int64_t max_value{GetMaxOrMinValueFromFile<int64_t, true>(file_name)};
        int64_t min_value{GetMaxOrMinValueFromFile<int64_t, false>(file_name)};
        std::cout << "Maximum value : " << max_value << std::endl;
        std::cout << "Minimum value : " << min_value << std::endl;
        std::cout << "Sum : " << max_value + min_value << std::endl;
    } catch(std::exception& e) {
        std::cerr << e.what() << std::endl;
        return -1;
    }
    return 0;
}
READ ALSO
Использование javascript вместо typescript в angular

Использование javascript вместо typescript в angular

Есть ли возможность запускать js код в файлеts? Ибо когда копирую свой js код и вставляю в файл

249
Ошибка JS &quot;Uncaught TypeError: Cannot read property &#39;classList&#39; of null &quot;

Ошибка JS "Uncaught TypeError: Cannot read property 'classList' of null "

Помогите пожалуйста! Пишу тетрис на JS и все время выдает ошибку! Я новичок, поэтому не пинайте за мой код

105
Не получается использовать картинки в React

Не получается использовать картинки в React

Перерыл много страниц с тем, где пишут, как использовать картинки из папки с проектом, делаю так, к примеру:

82
Как найти определённых людей из участников группы вконтакте

Как найти определённых людей из участников группы вконтакте

Есть группа вконтакте в которой среди участников мне нужно выбрать всех девушек по имени Люба или ЛюбовьПосле этого желательно выбрать по возрастному...

195