Форум программистов, компьютерный форум CyberForum.ru

бинарные файлы, C++ - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 50, средняя оценка - 4.78
PrettyNya
0 / 0 / 0
Регистрация: 04.01.2012
Сообщений: 12
05.01.2012, 16:14     бинарные файлы, C++ #1
Работа с двоичными файлами.
Создать файл состоящий из n-вещественных чисел. Найти сумму всех положительных чисел данного файла.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.01.2012, 16:14     бинарные файлы, C++
Посмотрите здесь:

Бинарные файлы.. C++
C++ С++ бинарные файлы
C++ Бинарные файлы
Бинарные файлы c++ C++
Бинарные файлы C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,511
05.01.2012, 16:43     бинарные файлы, C++ #2
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
#include <iostream>
#include <fstream>
using namespace std;
 
int main()
{
    double d=2.2,e=-1.5,f=4.67,g=0.00,h=-1;
    fstream file;
    file.open("file.txt",fstream::in | fstream::out | fstream::trunc);
    if(!file)
     exit(1);
    file<<d<<' '<<e<<' '<<f<<' '<<g<<' '<<h;
 
    double temp,sum;
    temp=sum=0;
 
    file.seekp(0);
    while(!file.eof())
    {
        file>>temp;
        if (temp>0)
         sum+=temp;
    }
 
    cout<<sum;
}
Добавлено через 10 минут
Забыл только что у Вас бинарные файлы, при открытии файла не хватает флага
C++
1
fstream::binary
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
05.01.2012, 16:55     бинарные файлы, C++ #3
Цитата Сообщение от PrettyNya Посмотреть сообщение
Работа с двоичными файлами.
Создать файл состоящий из n-вещественных чисел. Найти сумму всех положительных чисел данного файла.
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include <iostream>
#include <fstream>
#include <string>
#include <time.h>
#include <cstdlib>
 
int main( )
{
    srand( time( 0 ) );
 
    std::string file_name;
 
    std::cout << "file name >>> ";
    getline( std::cin, file_name );
 
    std::fstream fs( file_name, std::ios::in | std::ios::out | std::ios::trunc | std::ios::binary );
 
    if( !fs.is_open() )
    {
        std::cout << "could not open '" << file_name << "' for rw\n";
        return 1;
    }
 
    size_t count;
 
    std::cout << "numbers count >>> ";
    std::cin >> count;
 
    if( !count )
    {
        std::cout << "must be greater then 0\n";
        return 2;
    }
 
 
    for( size_t i = 0; i < count; i++ )
    {
        double num = ( rand() - double( rand() ) ) * double( rand() % 10 * 0.1 );
        fs.write( (const char *)(&num), sizeof(num) );
 
        if( !fs.good() )
        {
            std::cout << "error while writing values\n";
            return 3;
        }
    }
 
    std::cout << "done writing;\n";
 
    fs.seekg( 0, std::ios_base::beg );
 
    double summ = 0.0;
    size_t i = 0,
           pos_count = 0;
 
    while( !fs.eof() )
    {
        double val;
        fs.read( (char*)(&val), sizeof( val ) );
 
        if( fs.eof() )
           break;
 
        if( !fs.good() )
        {
            std::cout << "error while reading values\n";
            return 4;
        }
 
        if( val > 0 )
        {
           summ += val;
           pos_count++;
        }
 
        i++;
    }
 
    std::cout << "done reading: " << i << " values read; the summ of positive doubles is " << summ << " (" << pos_count << " values)\n";
 
    fs.close();
 
    return 0;
}
Добавлено через 1 минуту

Не по теме:

Gepar, у вас ведь operator<< запишет double в текстовом виде. Какой же он у вас тогда бинарный?

Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,511
05.01.2012, 17:20     бинарные файлы, C++ #4
talis, моя ошибка, делал изначально как просто запись в файл, потом когда листал темы увидел надпись бинарные и добавил что нужно бы дописать флаг для бинарного файла, а теперь вот вспомнил что вывод << не будет писать в виде бинарного файла.
Исправляюсь
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
#include <iostream>
#include <fstream>
using namespace std;
 
int main()
{
    double d=2.2,e=-1.5,f=4.67,g=-0.02;
    fstream file;
    file.open("file.txt",fstream::in | fstream::out | fstream::trunc | fstream::binary);
    if(!file)
     exit(1);
    file.write((const char*) &(d),sizeof(double)).write((const char*) &(e),sizeof(double));
    file.write((const char*) &(f),sizeof(double)).write((const char*) &(g),sizeof(double));
 
    double temp,sum;
    temp=sum=0;
 
    file.seekp(0);
    while(!file.eof())
    {
        file.read((char*) &(temp),sizeof(double));
        if (temp>0)
         sum+=temp;
    }
 
    cout<<sum;
}
talis
05.01.2012, 17:24
  #5

Не по теме:

Gepar, а теперь то же самое, но для n = 10'000 Извините, не удержался.

Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,511
05.01.2012, 17:40     бинарные файлы, C++ #6
talis, ну я написал просто для того чтобы автор мог увидеть как это делается, поэтому нет никаких уведомлений, запроса на ввод имени файла, информации об ошибках (exit(1) малоинформативно ведь). Дальше пусть автор правит код сам, а заодно по ходу дела разбирается что и как работает. Для сдачи в виде лабораторной мой код плохо подходит и так и было задумано.
В идеале лучше добавить
C++
1
2
while(cin>>d);
 file.write((const char*) &(d),sizeof(double));
при этом не забывая уведомить пользователя что происходит, что нужно ввести, добавив проверку что поток в хорошем( good) состоянии и очистку его в случае ошибок ... но писать это скучно и не интересно, я оставляю это автору темы )
Yandex
Объявления
05.01.2012, 17:40     бинарные файлы, C++
Ответ Создать тему
Опции темы

Текущее время: 23:58. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru