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

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

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

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

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

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

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

Спасибо, жду ответа.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.05.2011, 00:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Двоичный ввод-вывод (C++):

Заменить в программе, переводящую строку в двоичный код, консольный ввод/вывод на файловый ввод/вывод - C++
Добрый день! Помогите, пожалуйста, с программой. Программа считывает строку с клавиатуры и переводит её в двоичный код. затем наоборот...

Двоичный ввод/вывод в файл - C++
Добрый лень. Программа записывает в файл массив целых чисел. После считывает каждый элемент и если он отрицательный, обратно в этот же файл...

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

Поменять консольный ввод-вывод на файловый ввод-вывод - C++
вот у меня калькулятор как мне сделать что б числа вводились из файла и результат записывался в новый файл ? // ОБРАТНАЯ...

Двоичный вывод в файл - C++
Пишу программу для выводы объектов в файл в двоичном виде: // Чтение из файла и запись нескольких объектов #include <fstream> // для...

Запись выражений, ввод–вывод информацииЗапись выражений, ввод–вывод информации - C++
Задача 2.1. Пользуясь только операцией умножения, вычислить (A в 7-ой степени) за четыре операции. Задача 2.2. Очистить экран,...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 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';
        }
    }
}
1
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, выводит какие-то кракозябли..
не понимаю, что я неправильно делаю
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
25.05.2011, 01:20 #4
an4o, В файл надеюсь не русским пишете?)
1
an4o
16 / 3 / 2
Регистрация: 19.11.2009
Сообщений: 21
25.05.2011, 01:24  [ТС] #5
Нет, конечно, если проверяю с помощью read - выводит все верно.
А по символу - что-то непонятное.
0
accept
4822 / 3243 / 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]$
1
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:...лизация_данных
0
accept
4822 / 3243 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
26.05.2011, 02:19 #8
C++
1
sizeof(mammal)
это не подходит для write(), когда внутри есть указатели
1
an4o
16 / 3 / 2
Регистрация: 19.11.2009
Сообщений: 21
26.05.2011, 03:00  [ТС] #9
а как тогда можно записать? в каком направлении смотреть?
0
accept
4822 / 3243 / 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

это самодельная сериализация
цель - получить такой набор функций, которые будут на любой системе правильно сохранять объекты и правильно их восстанавливать
1
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
26.05.2011, 09:10 #11
Или используй boost::serealization к примеру.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.05.2011, 09:10
Привет! Вот еще темы с ответами:

Файловый ввод-вывод, ввод с клавиатуры и обработка массива структур - C++
Добрый вечер)) У меня небольшой вопрос. Почему первые буквы (в названии книг) не выводит на экран? Само задание: О каждой книге ...

Двоичный вывод (алгоритм Шеннона Фано) - C++
Здравствуйте! У меня вопрос по поводу реализации алгоритма Шеннона Фано. В соответствие с алгоритмом надо построить бинарное...

Реализовать вывод массива объектов типа Student на консоль (файловый ввод/вывод) - C++
Как сделать чтобы список студентов выводился на экран в конце? #include&lt;iostream&gt; #include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; ...

Поиск в массиве структур по заданному полю и вывод в алфавитном порядке (файловый ввод/вывод) - C++
Помогите с функцией void runFile() что бы с файла брал и выводил в алфавитном порядке список товаров, хранящихся больше месяца, стоимость...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
26.05.2011, 09:10
Ответ Создать тему
Опции темы

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