Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.84/25: Рейтинг темы: голосов - 25, средняя оценка - 4.84
 Аватар для an4o
16 / 3 / 0
Регистрация: 19.11.2009
Сообщений: 21

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

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

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

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

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

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

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

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

10
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
25.05.2011, 01:13
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 / 0
Регистрация: 19.11.2009
Сообщений: 21
25.05.2011, 01:16  [ТС]
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
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
25.05.2011, 01:20
an4o, В файл надеюсь не русским пишете?)
1
 Аватар для an4o
16 / 3 / 0
Регистрация: 19.11.2009
Сообщений: 21
25.05.2011, 01:24  [ТС]
Нет, конечно, если проверяю с помощью read - выводит все верно.
А по символу - что-то непонятное.
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
25.05.2011, 08:37
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;
}
Code
1
2
3
4
5
6
7
[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 / 0
Регистрация: 19.11.2009
Сообщений: 21
26.05.2011, 01:25  [ТС]
Появилась новая проблема. Создаю объект и записываю его в файл через одну функцию:
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.ph... ция_данных
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
26.05.2011, 02:19
C++
1
sizeof(mammal)
это не подходит для write(), когда внутри есть указатели
1
 Аватар для an4o
16 / 3 / 0
Регистрация: 19.11.2009
Сообщений: 21
26.05.2011, 03:00  [ТС]
а как тогда можно записать? в каком направлении смотреть?
0
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
26.05.2011, 04:22
берёшь объект передаёшь его в свою функцию, которая выдаёт данные, пригодные для записи
берёшь данные, передаешь их в свою функцию, которая заполняет объект в соответствии с ними

например, в объекте были переменные 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
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
26.05.2011, 09:10
Или используй boost::serealization к примеру.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.05.2011, 09:10
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru