С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
27 / 19 / 10
Регистрация: 10.02.2016
Сообщений: 236
1

Двоичный вывод в файл

13.03.2016, 17:09. Показов 1823. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Пишу программу для выводы объектов в файл в двоичном виде:

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
// Чтение из файла и запись нескольких объектов
#include <fstream> // для файловых потоков
#include <iostream>
using namespace std;
///////////////////////////////////////////////////////////
class Distance{ // Класс английских расстояний
    private:
        int feet;
        float inches;
    public:
        Distance():feet(0),inches(0.0){} // конструктор (без аргументов)
        Distance(int ft, float in):feet(ft),inches(in){} // конструктор (2 арг.)
        void showdist(){ cout << feet << "\'-" << inches << '"'; } // вывод расстояния
        void getdist(){cout<<"Enter feet: ";cin>>feet;cout<<"Enter inches: ";cin>>inches;} // запросить длину у пользователя
};
///////////////////////////////////////////////////////////
int main(){
    char ch;
    Distance dist; // создать объект person
    fstream file; // создать входной/выходной файл
    // открыть для дозаписи
    file.open("GROUP.DAT", ios::app | ios::out |ios::in | ios::binary);
    do{ // данные от пользователя - в файл
        cout << "\nEnter data:"<<endl;
        dist.getdist(); // получить данные
        file.write(reinterpret_cast<char*>(&dist), sizeof(dist));// записать их в файл
        cout << "Continue (y/n)? ";
        cin >> ch;
    }while(ch == 'y'); // выход по 'n'
    file.seekg(0); // поставить указатель на начало файла
    file.read(reinterpret_cast<char*>(&dist), sizeof(dist));// считать данные
    while(!file.eof()){ // Выход по EOF
        cout << "\nDistance:";// вывести данные
        dist.showdist(); // считать данные о следующем
        file.read(reinterpret_cast<char*>(&dist), sizeof(dist));
    }
    cout << endl;
    return 0;
}
после запуска появляется в той же папке 2 файла: GROUP.DAT и gmon.out, но их содержание сильно отличается от двоичного кода, можете объяснить почему?

Добавлено через 47 минут
Плюс ещё хочу спросить зачем нужен reinterpret_cast?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.03.2016, 17:09
Ответы с готовыми решениями:

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

Текстовый файл перевести в двоичный, а потом полученный двоичный файл перевести обратно в текстовый
Всем привет. Есть такая задачка: &quot;текстовый файл перевести в двоичный, а потом полученный двоичный...

Задан текстовый файл, необходимо по нему сформировать двоичный файл индексов
Нужна помощь! Задача: Задан текстовый файл, необходимо по нему сформировать двоичный файл индексов...

Создать текстовый файл и записать в двоичный файл
В программах необходимо использовать только динамические структуры. 1. Написать первую...

11
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
13.03.2016, 19:47 2
Цитата Сообщение от Joey Black Посмотреть сообщение
file.seekg(0); // поставить указатель на начало файла
После записи, перед переходом к чтению, нужно буфер сбросить (flush()), чтобы записанные данные попали в файл.
Цитата Сообщение от Joey Black Посмотреть сообщение
и gmon.out
Этот-то откуда берётся?
Цитата Сообщение от Joey Black Посмотреть сообщение
но их содержание сильно отличается от двоичного кода
В смысле?
1
Вездепух
Эксперт CЭксперт С++
12794 / 6671 / 1795
Регистрация: 18.10.2014
Сообщений: 16,890
13.03.2016, 19:58 3
Цитата Сообщение от Joey Black Посмотреть сообщение
2 файла: GROUP.DAT и gmon.out, но их содержание сильно отличается от двоичного кода
Что такое "содержание сильно отличается от двоичного кода"? Как по-вашему должен выглядеть файл с "двоичным кодом" внутри и чем ваши файлы отличаются от этого?
1
27 / 19 / 10
Регистрация: 10.02.2016
Сообщений: 236
13.03.2016, 20:03  [ТС] 4
Цитата Сообщение от nd2 Посмотреть сообщение
Сообщение от Joey Black
и gmon.out
Этот-то откуда берётся?
Не знаю откуда, думал подскажете

Цитата Сообщение от nd2 Посмотреть сообщение
Сообщение от Joey Black
но их содержание сильно отличается от двоичного кода
В смысле?
Ну например заношу данные, записываем в файл 2 объекта, пусть будут 1 - 10, одинаковые. во что содержат файлы
GROUP.DAT:  A A
gmot.out: @ ґH zч y d юяяяґю" Ђ|A

Добавлено через 44 секунды
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Что такое "содержание сильно отличается от двоичного кода"? Как по-вашему должен выглядеть файл с "двоичным кодом" внутри и чем ваши файлы отличаются от этого?
думаю должен выглядеть как набор нулей и единиц
0
Эксперт .NET
6510 / 4086 / 1606
Регистрация: 09.05.2015
Сообщений: 9,553
13.03.2016, 20:08 5
Цитата Сообщение от Joey Black Посмотреть сообщение
думаю должен выглядеть как набор нулей и единиц
Ну это смотря как вы этот файл смотрите. Для компьютера любой файл это набор нулей и единиц, а вот для человека можно этот набор представить различными способами... Судя по всему вы пытаетесь его посмотреть как текстовый файл, соответственно и видите текст...
1
Вездепух
Эксперт CЭксперт С++
12794 / 6671 / 1795
Регистрация: 18.10.2014
Сообщений: 16,890
13.03.2016, 20:14 6
Цитата Сообщение от Joey Black Посмотреть сообщение
думаю должен выглядеть как набор нулей и единиц
Файл не может никак "выглядеть". Файл - это некая запись на некоем носителе. В общем случае на эту запись невозможно "посмотреть".

А смотреть вы можете только на некое визуальное представление фала, сделанное некоей посторонней программой-просмотрщиком. Она покажет вам файл в том виде, в которым вы попросите. Попросите показывать, как набор нулей и единиц - будет показывать набор нулей и единиц. Попросите показывать, как набор шестнадцатеричных значений - будет показывать набор шестнадцатеричных значений. Попросите показывать, как текст - будет показывать как текст.

Вы как попросили?

Вы, очевидно, попросили некую программу-просмотрщик показать вам ваш файл, как текст. Разумеется, вы увидели там некие бессмысленные символы да кракозябры. Перестаньте заниматься ерундой, т.е. пытаться просматривать бинарный файл как текст. Возьмите программу-просмотрщик, которая умеет показывать содержимое файла в бинарном виде - и вы увидите ваши нули и единицы.
1
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
13.03.2016, 20:37 7
Цитата Сообщение от Joey Black Посмотреть сообщение
Не знаю откуда, думал подскажете
Это какой-то левый, не из этого кода.
Так твой файл выглядит в hex-редакторе. Первые четыре байта - int, вторые четыре байта - float, то же самое во второй строке (в файле никаких строк нет, это редактор так выводит). Так как код 0x41 - это код 'A', то, в текстовом редакторе, байт с этим значением будет виден как 'A'.
Миниатюры
Двоичный вывод в файл  
1
27 / 19 / 10
Регистрация: 10.02.2016
Сообщений: 236
13.03.2016, 21:55  [ТС] 8
Спасибо! понял.

Подскажите пожалуйста по поводу reinterpret_cast. Я взял запись из примера. Его нужно использовать просто, чтобы можно было использовать write() и read()?
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
13.03.2016, 22:13 9
Цитата Сообщение от Joey Black Посмотреть сообщение
Его нужно использовать просто, чтобы можно было использовать write() и read()?
Да.

Добавлено через 1 минуту
http://www.cplusplus.com/refer... eam/write/
http://www.cplusplus.com/refer... ream/read/
1
27 / 19 / 10
Регистрация: 10.02.2016
Сообщений: 236
13.03.2016, 22:21  [ТС] 10
Спасибо, я там уже смотрел, я также прочитал, что reinterpret_cast нужно использовать в крайнем случае, почему?
0
nd2
3438 / 2817 / 1249
Регистрация: 29.01.2016
Сообщений: 9,427
13.03.2016, 23:07 11
Цитата Сообщение от Joey Black Посмотреть сообщение
я также прочитал, что reinterpret_cast нужно использовать в крайнем случае, почему?
А, насчёт почему, там, случайно, не написано?
0
27 / 19 / 10
Регистрация: 10.02.2016
Сообщений: 236
14.03.2016, 10:54  [ТС] 12
Цитата Сообщение от nd2 Посмотреть сообщение
А, насчёт почему, там, случайно, не написано?
Якобы он меняет тип данных в памяти имеет это смысл или нет, вообщем-то всё
0
14.03.2016, 10:54
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.03.2016, 10:54
Помогаю со студенческими работами здесь

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

Двоичный ввод-вывод
Здравствуйте! Разбираюсь с вводом-выводом из файла и наткнулась на такую ситуацию. Ввожу объекты...

Двоичный файл
Помогите пожалуйста...задачка попалась...не могу понять как решить... В двоичном файле,...

двоичный файл
помогите пожалуйста! вначале создаю двоичный файл и заполняю его целыми числами примерно так for...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru