Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.94/34: Рейтинг темы: голосов - 34, средняя оценка - 4.94
13 / 13 / 1
Регистрация: 06.06.2011
Сообщений: 157

Бинарные файлы. Написать функцию, которая записывает в бинарный файл N случайных вещественных чисел в указанном диапазоне

23.02.2014, 22:42. Показов 7284. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Подскажите пожалуйста!
Генерирую рандомное кол-во вещественных чисел, и записываю их в бинарный файл, после чего читаю оттуда.
Не могу понять в чем проблема, т.к. не работает функция.
само задание такое:
Кликните здесь для просмотра всего текста
Написать функцию, которая записывает в бинарный файл N случайных вещественных чисел в указанном диапазоне (диапазон и количество чисел задаются с клавиатуры и передаются в функцию как параметры. N – натуральное число 1<N<1000000).
Написать функцию вывода содержимого двоичного файла (по умолчанию – на экран, при указании имени выходного файла – в текстовый файл), параметрами функции служат имена входного и выходного файла. Дальнейшее выполнение программы должно продолжиться только после команды пользователя.
Написать функции, реализующие задания соответствующего варианта. Задания должны выполняться по следующему сценарию:
Задание №1. Создать бинарный файл.
Задание №2. Вывести содержимое бинарного файла на экран и в текстовый файл.
Задание №3. Записать выходной бинарный файл в соответствии с заданием своего варианта.
Задание №4. Вывести содержимое выходного бинарного файла на экран и в файл
Задание №5. Дописать к содержимому бинарного файла из задания №1 содержимое бинарного файла, полученного в результате выполнения задания №3.
Задание №6. Вывести содержимое полученного бинарного файла на экран и в файл.
Задание №7. Выполнить перезапись по месту бинарного файла, полученного в результате выполнения задания №5 в соответствии с заданием своего варианта.
Задание №8. Вывести содержимое полученного бинарного файла на экран и в файл.

- Записать выходной файл, заменив каждое второе отрицательное число половиной максимума.

Код который не работает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include<iostream>
#include <ctime>  
#include <stdlib.h> 
#include <fstream>
#include <istream>
#include <ostream>
#include <string>
using namespace std;
 
double generation(double min, double max) 
{
    double x=(double)rand()/RAND_MAX;
    return min+x*(max-min);
}
 
void create (int& n, double&a,double&b)
{ 
    ofstream fs("oonumber1.bin", std::ios::binary);
    double num;
    //std::fstream fs( name, std::ios::in | std::ios::out | std::ios::trunc | std::ios::binary );
    if( !fs.is_open() )
    {
        std::cout << "файл не открыт" << "oonumber1.bin";
    }
    for( int i = 0; i < n; i++ )
    {
        num = generation(a,b);
        fs.write((char *)&num, sizeof(num));  
    }
    fs.close();
}
 
void Display (int& n)
{
// std::fstream fs(name, std::ios::in | std::ios::out | std::ios::trunc | std::ios::binary );
    ifstream fs("oonumber2.bin",std::ios::binary);
    double max=0,max1=0;
    double *val=new double[n];
    fs.read((char *)val, sizeof(val));     // чтение файла в массив
    fs.close();                        // закрываем
    for(int i = 0; i < n; i++) cout << val[i] << ' ';
    cout << '\n';  
    char ch = getchar();
        fs.close();
}
 
int main()
{
    srand((unsigned)time(NULL));  
    setlocale(LC_ALL, "Russian");
    double a,b;
    int n;
    double *m,g,max,max1=0;
    string name;
    cout<<"Введите кол-во случайных чисел: "; cin>>n; 
    cout<<"Введите диапазон от: "; cin>>a; cout<<"До: "; cin>>b;
    //cout<<"Введите название бинарного файла: "; cin>>name; cout<<endl;
    create(n,a,b);
    Display(n);
    system("pause");
    return 0;
}
но выходит такой результат:

откуда эти цифры???

А вот если делаю заполнение и вывод так:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include<iostream>
#include <ctime>  
#include <stdlib.h> 
#include <fstream>
#include <istream>
#include <ostream>
#include <string>
using namespace std;
 
double generation(double min, double max) {
 
    double x=(double)rand()/RAND_MAX;
    return min+x*(max-min);
 
}
 
int main()
{
    srand((unsigned)time(NULL));  
    setlocale(LC_ALL, "Russian");
    double a,b;
    int n;
    double *m,g,max,max1=0;
    string name;
    cout<<"Введите кол-во случайных чисел: "; cin>>n; 
    cout<<"Введите диапазон от: "; cin>>a; cout<<"До: "; cin>>b;
    //cout<<"Введите название бинарного файла: "; cin>>name; cout<<endl;
 
        FILE *f;
    f=fopen("1.dat", "wb");
    fwrite(&n, sizeof(int), 1, f);
    for (int i=0; i<n; i++)
    {
        g=generation(a,b);
        fwrite(&g, sizeof(double), 1, f);
    }
    fclose(f);
    f=fopen("1.dat", "rb");
    fread(&n, sizeof(int), 1, f);
    cout<<"n="<<n<<endl;
    m=new double[n];
    fread(m, sizeof(double), n, f);
    for (int i=0; i<n; i++)
    {
    max=abs(m[i]);
    if(max>max1)
    {
    max1=max;
    }
    cout<<m[i]<<"\t";
    cout<<endl;
    }
    cout<<"****************************"<<endl;
    cout<<"Максимальное число по модулю: "<<max1<<endl;
    cout<<"****************************"<<endl;
    fclose(f);
    system("pause");
    return 0;
}
то результат таков:


Но мне нужно сделать это заполнение в функции
Кликните здесь для просмотра всего текста
1)Написать функцию, которая записывает в бинарный файл N случайных вещественных чисел в указанном диапазоне (диапазон и количество чисел задаются с клавиатуры и передаются в функцию как параметры. N – натуральное число 1<N<1000000).
2) Написать функцию вывода содержимого двоичного файла (по умолчанию – на экран, при указании имени выходного файла – в текстовый файл), параметрами функции служат имена входного и выходного файла. Дальнейшее выполнение программы должно продолжиться только после команды пользователя.

вот это у меня и не выходит... прошу советов и литературы.
Спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.02.2014, 22:42
Ответы с готовыми решениями:

Составить программу которая записывает в файл c:\lang\prim_dat.txt 50 случайных чисел в диапазоне от 0.30
Составить программу которая записывает в файл c:\lang\prim_dat.txt 50 случайных чисел в диапазоне от 0..30.

Написать функцию,которая записывает в бинарный файл данные о сканере из приведённой стуктуры
Нужна помощь,решить следующую задачу: Все необходимые данные для ф-и должны передаваться им в качестве параметров.Использование...

Создать структуру и написать функцию, которая записывает в бинарный файл данные о сканере из структуры
Сама структура имеет вид: struct scan_info{ char model; // наименование модели int price; // цена double x_size; //...

29
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
02.03.2014, 20:23
Студворк — интернет-сервис помощи студентам
fs2.close() не на месте был, и в for() не нужно <= len, просто <:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
void zamena(string name, string name2)
{
    double max = 0, max1 = 0;
    std::ifstream fs(name, std::ios::binary);
    if (!fs.is_open())
    {
        std::cout << "Файл " << name << "не был открыт для чтения";
        return;
    }
    fs.seekg(0, fs.end);
    int len = fs.tellg() / sizeof(double);
    fs.seekg(0, fs.beg);
    double *val = new double[len];
    fs.read((char *)val, sizeof(double)* len);     // чтение файла в массив
    fs.close();                        // закрываем
    for (int i = 0; i < len; i++)
    {
        max1 = fabs(val[i]);
        if (max < max1)
        {
            max = max1;
        }
 
    }
    cout << "Максимальное число по модулю: " << max << endl;
    max = max / 2;
    cout << "Половина Максимума: " << max << endl;
    char ch = getchar();
 
    /////////////////////
    std::ofstream fs2(name2, std::ios::binary);
    if (!fs2.is_open())
    {
        std::cout << "Файл " << name2 << "не был открыт для записи";
    }
    
    for (int i = 0; i < len; i++)
    {
        if (i % 2 == 0)
        {
            fs2.write((char *)&val[i], sizeof(val[i]));
        }
        else
        {
            fs2.write((char *)&max, sizeof(max));
        }
        
    }
    fs2.close();
}
1
13 / 13 / 1
Регистрация: 06.06.2011
Сообщений: 157
02.03.2014, 20:27  [ТС]
alsav22, Работает! Благодарю! пойду дальше выполнять задание. Спасибо!
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
02.03.2014, 20:28
По коду. Проверку на открытие файла нужно делать сразу после открытия (до всяких seekg()), если файл не открылся, то делать return из функции.
1
13 / 13 / 1
Регистрация: 06.06.2011
Сообщений: 157
02.03.2014, 20:29  [ТС]
alsav22, Ммм, спасибо. подправлю, учту.
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
02.03.2014, 20:31
В Display() не нужно создавать и читать файл в массив, это лишнее. Можно читать по double и сразу выводить. И проверьте код на утечки памяти, а то массивы через new создаёте, а delete [] я не вижу.
1
13 / 13 / 1
Регистрация: 06.06.2011
Сообщений: 157
02.03.2014, 20:47  [ТС]
alsav22, так имелось ввиду?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int Display(string name)
{
    std::ifstream fs(name, std::ios::binary);
    if (!fs.is_open())
    {
        std::cout << "Файл " <<name<<"не был открыт для чтения";
        return 1;
    }
    fs.seekg(0, fs.end);
    int len = fs.tellg() / sizeof(double);
    fs.seekg(0, fs.beg);
 
    double max = 0, max1 = 0;
    double val=0;
    while(fs.read((char *)&val, sizeof(val))) 
    cout << val << ' ';
    cout << '\n';
    char ch = getchar();
    fs.close();
}
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
02.03.2014, 20:52
Можно так, но зачем тогда len тут определяется? Делать возвращаемое значение int тоже не обязательно, можно void и просто return;
1
13 / 13 / 1
Регистрация: 06.06.2011
Сообщений: 157
02.03.2014, 20:53  [ТС]
alsav22, Спасибо, за совет с значением int, а первое, это опять невнимательность. оно тут вовсе не нужно, не до убрал...
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
02.03.2014, 20:59
Лучший ответ Сообщение было отмечено о_О_Кто_здесь как решение

Решение

Цитата Сообщение от о_О_Кто_здесь Посмотреть сообщение
Спасибо, за совет с значением int
Но это если не нужно обрабатывать возвращаемое значение, а если уж делать возврат int или bool, то дальше в коде обрабатывать это. Т.е., если файл не открылся, то завершение программы.

Добавлено через 2 минуты
И если делается возврат при ошибке, то нужно делать возврат и при удачном завершении функции (в конце функции).
1
13 / 13 / 1
Регистрация: 06.06.2011
Сообщений: 157
02.03.2014, 21:28  [ТС]
alsav22, понял, спасибо.
к примеру..
C++
1
2
3
4
5
6
7
double generation(double min, double max)
{
    double x = (double)rand() / RAND_MAX;
    if (x<2.343)return 1; // тюе тут мы выходим из функции если условие нас не удовлетворяет 
    else
        return  min + x*(max - min); // тут возврат при удачи.
}
Ну да, а если bool, то состояние total=false, а при нужном условии меняем на total=true.
C++
1
2
3
4
5
6
7
bool generation2(double min, double max)
{
    bool total = true;
    double x = (double)rand() / RAND_MAX;
    if (x>6) total = false;
        return total;
}
Добавлено через 13 минут
Вух, все, это задание закончил. Спасибо огромное! Теперь пойду дальше... Спасибо за помощь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.03.2014, 21:28

Написать программу, которая находит сумму всех целых нечетных чисел в диапазоне, указанном пользователя.
#include &lt;iostream&gt; using namespace std; void main(){ int a,b; cout&lt;&lt;&quot;OT &quot;; cin&gt;&gt;a; cout&lt;&lt;&quot;DO &quot;; cin&gt;&gt;b; ...

Программа, которая записывает в файл типа byte 100 случайных чисел от 0 до 255
Здравствуйте уважаемые форумчане, помогите пожалуйста с задачей: Создайте программу, которая записывает в файл типа byte 100 случайных...

Написать программу, которая генерирует 10 случайных чисел в диапазоне от 1 до 10
Написать программу, которая генерирует 10 случайных чисел в диапазоне от 1 до 10, выводит эти числа на экран и вычисляет их среднее...

Написать программу, которая генерирует последовательность из 10 случайных чисел в диапазоне от 1 до 10, выводит эти числа на экран и вычисляет их
Написать программу, которая генерирует последовательность из 10 случайных чисел в диапазоне от 1 до 10, выводит эти числа на экран и...

Написать программу которая записывает в файл n положительных чисел, не используя рандом
Написать программу которая записывает в файл n положительных чисел, не используя рандом


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
Грибы - это женщины, деревья - это мужчины. Анти инь янь для союза мужчины и женщины.
anaschu 18.07.2026
ГЛАВНЫЙ НАУЧНО-ФИЛОСОФСКИЙ ВЫВОД: Сексуально-Репродуктивный Капитализм против Государства Моногамии Коллеги, мы вышли на финишную прямую 20-мерного ОДУ-моделирования вековой сукцессии (ветка. . .
Текстовый слайдер с нумерацией страниц и кроссбраузерность.
russiannick 18.07.2026
Один мой друг написал текстовый слайдер с нумерацией страниц. Сегодня я расскажу как он умудрился подружить его с кроссбраузерностью. Очевидно сложно угодить с шириной каждому браузеру. Один крадет. . .
Грибы - это мемы, дерево - это человек. Применение микоризной модели к теории меметики Докинза.
anaschu 18.07.2026
Меметический изоморфизм теории «всего»: Грибная сукцессия как модель эволюции идей Докинза Базовый код системы ОДУ микоризной сукцессии описывает не просто биологию, а универсальную. . .
Грибы - это корпорации, деревья - это государства. Механизм массонского захвата власти
anaschu 18.07.2026
Макроэкономический изоморфизм теории «всего»: Грибная сукцессия как модель транснационального капитализма Базовый код системы ОДУ микоризной сукцессии описывает не просто биологию, а. . .
Расчёт периметра прямоугольника по координатам вершин
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Вычислить периметр прямоугольника, заданного координатами своих вершин на плоскости. Решение: Создан документ со следующими. . .
Подсчёт частоты трёхбуквенных слов в тексте
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Выясните, сколько раз в предложенном тексте встречается каждое трехбуквенное слово. Решение: Создан документ с единственным. . .
Сумма и количество положительных элементов в чётных строках массива
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Вычислить сумму и количество положительных элементов массива, расположенных в четных строках. Решение: Создан документ с. . .
Поиск произведения положительных чётных чисел в последовательности
Maks 18.07.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Дана произвольная последовательность целых чисел. Найти произведение положительных четных чисел данной последовательности. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru