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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.90
an4o
16 / 3 / 2
Регистрация: 19.11.2009
Сообщений: 21
#1

Двоичный ввод-вывод - C++

25.05.2011, 00:37. Просмотров 2718. Ответов 10
Метки нет (Все метки)

Здравствуйте!
Разбираюсь с вводом-выводом из файла и наткнулась на такую ситуацию.
Ввожу объекты разных классов в разброс в файл с помощью write, после чего хочу вывести содержимое всего файла. Но нужно знать объект какого класса я вывожу, чтобы использовать read.
Мне нужно проверить первый символ блока данных (то есть объекта) - проверяю с помощью get.
Но оно проверяет что-то не то.

Вопрос: write-read работают с бинарными файлами, то есть get я не могу использовать?
И если я get не могу использовать, то как мне совершить проверку первого символа объекта?

Спасибо, жду ответа.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.05.2011, 00:37     Двоичный ввод-вывод
Посмотрите здесь:

ввод вывод в C++ C++
Запись выражений, ввод–вывод информацииЗапись выражений, ввод–вывод информации C++
ввод n-значного числа, вывод цифр, из которых оно состоит и вывод суммы его цифр. C++
C++ Двоичный вывод (алгоритм Шеннона Фано)
Ввод динамической структуры и занесение её в двоичный файл C++
C++ Поменять консольный ввод-вывод на файловый ввод-вывод
Файловый ввод-вывод, ввод с клавиатуры и обработка массива структур C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
25.05.2011, 01:13     Двоичный ввод-вывод #2
streambuf::sgetc например.

Добавлено через 14 минут
Примерный вариант написанный на коленке.

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
#include <fstream>
#include <iostream>
 
struct integer
{
    char integer_;
    int first;
    int second;
};
 
std::ostream& operator <<(std::ostream& os, const integer& integ)
{
    os << integ.integer_ << ' ' << integ.first << ' ' << integ.second << '\n';
    return os;
}
 
struct doubleger
{
    char doubleger_;
    double first;
    double second;
};
 
std::ostream& operator <<(std::ostream& os, const doubleger& doubleg)
{
    os << doubleg.doubleger_ << ' ' << doubleg.first << ' ' << doubleg.second << '\n';
    return os;
}
 
int main()
{
    std::ofstream ofs("f_name", std::ios::binary);
    if(!ofs)
    {
        return 1;
    }
    integer integ;
    integ.first = 5;
    integ.second = 100;
    integ.integer_ = 'i';
    doubleger doubleg;
    doubleg.first = 5.5;
    doubleg.second = 25.4;
    doubleg.doubleger_ = 'd';
 
    ofs.write((char*)&integ, sizeof(integer));
    ofs.write((char*)&doubleg, sizeof(doubleger));
    ofs.close();
    std::ifstream ifs("f_name", std::ios::binary);
    if(!ifs)
    {
        return 1;
    }
    while(1)
    {
        integer res_integer;
        doubleger res_doubleger;
        std::streambuf* pbuf = ifs.rdbuf();
        int s_int = pbuf->sgetc();
        if(s_int == -1)
            break;
        std::cout << (char)s_int << '\n';
        if(s_int == 'i')
        {
            ifs.read((char*)&res_integer, sizeof(integer));
            std::cout << res_integer << '\n';
        }
        else if(s_int == 'd')
        {
            ifs.read((char*)&res_doubleger, sizeof(doubleger));
            std::cout << res_doubleger << '\n';
        }
    }
}
an4o
16 / 3 / 2
Регистрация: 19.11.2009
Сообщений: 21
25.05.2011, 01:16  [ТС]     Двоичный ввод-вывод #3
C++
1
2
3
4
5
6
7
streambuf * pbuf;
       pbuf = f2.rdbuf();
       while (pbuf->sgetc()!=EOF)
       {
          ch = pbuf->sbumpc();
          cout << ch;
       }
Пробовала вывести, как и в случае с get, выводит какие-то кракозябли..
не понимаю, что я неправильно делаю
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
25.05.2011, 01:20     Двоичный ввод-вывод #4
an4o, В файл надеюсь не русским пишете?)
an4o
16 / 3 / 2
Регистрация: 19.11.2009
Сообщений: 21
25.05.2011, 01:24  [ТС]     Двоичный ввод-вывод #5
Нет, конечно, если проверяю с помощью read - выводит все верно.
А по символу - что-то непонятное.
accept
4819 / 3239 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
25.05.2011, 08:37     Двоичный ввод-вывод #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <fstream>
 
using namespace std;
 
int main()
{
    ifstream in;
    char c;
    
    in.open("file.txt", ios::binary);
 
    while (in.get(c))
        cout << c << " " << (c == 'a') << endl;
    in.close();
    return 0;
}
Код
[guest@localhost tests]$ echo -n abcd > file.txt
[guest@localhost tests]$ ./t
a 1
b 0
c 0
d 0
[guest@localhost tests]$
an4o
16 / 3 / 2
Регистрация: 19.11.2009
Сообщений: 21
26.05.2011, 01:25  [ТС]     Двоичный ввод-вывод #7
Появилась новая проблема. Создаю объект и записываю его в файл через одну функцию:
mammal obj(m_s, t_s, s, vod, r, d, v);
file_mammal.write(reinterpret_cast<char*>(&obj), sizeof(mammal));

После удаляется объект.
Потом из другой функции создаю объект и пытаюсь его считать из файла:

mammal obj(m_s, t_s, s, vod, r, d, v);
file_mammal.read(reinterpret_cast<char*>(&obj), sizeof(mammal));

Ошибка. Может у меня нет связи между этими объектами?
Помогите, кто может.

Добавлено через 4 часа 34 минуты
Может все дело в сериализации?
Кто в этом разбирается, помогите!

http://wiki.shelek.ru/index.php/FAQ:...лизация_данных
accept
4819 / 3239 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
26.05.2011, 02:19     Двоичный ввод-вывод #8
C++
1
sizeof(mammal)
это не подходит для write(), когда внутри есть указатели
an4o
16 / 3 / 2
Регистрация: 19.11.2009
Сообщений: 21
26.05.2011, 03:00  [ТС]     Двоичный ввод-вывод #9
а как тогда можно записать? в каком направлении смотреть?
accept
4819 / 3239 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
26.05.2011, 04:22     Двоичный ввод-вывод #10
берёшь объект передаёшь его в свою функцию, которая выдаёт данные, пригодные для записи
берёшь данные, передаешь их в свою функцию, которая заполняет объект в соответствии с ними

например, в объекте были переменные int a = 1 и double b = 0.5
передаёшь объект в функцию, которая возвращает массив символов "int:1;double:0.5"
сохраняешь в файл этот массив

читаешь данные из файла, получил строку "int:2;double:4.0"
передаёшь строку в функцию, которая в объект записывает obj.a = 2; obj.b=4.0

это самодельная сериализация
цель - получить такой набор функций, которые будут на любой системе правильно сохранять объекты и правильно их восстанавливать
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.05.2011, 09:10     Двоичный ввод-вывод
Еще ссылки по теме:

C++ Заменить в программе, переводящую строку в двоичный код, консольный ввод/вывод на файловый ввод/вывод
C++ Вывод суммы в файл (файловый ввод/вывод)
C++ Поиск в массиве структур по заданному полю и вывод в алфавитном порядке (файловый ввод/вывод)
Двоичный вывод в файл C++
C++ Двоичный ввод/вывод в файл

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
26.05.2011, 09:10     Двоичный ввод-вывод #11
Или используй boost::serealization к примеру.
Yandex
Объявления
26.05.2011, 09:10     Двоичный ввод-вывод
Ответ Создать тему
Опции темы

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