2016-05-10 2 views
1

Сегодня в классе CS 111 мой инструктор закончил «краткий» взгляд на запись структур в двоичные файлы. Я говорю коротко, потому что он просто включил его в какую-то сторону, заявив, что это не будет в финале. Проблема в том, что я не совсем понимаю, что происходит в примере программы, и это беспокоит меня. Надеюсь, кто-то найдет время, чтобы объяснить это мне. Код выглядит следующим образом:Тип приведения указателя при записи в двоичный файл в C++

#include <iostream> 
#include <fstream> 
using namespace std; 

struct PayStub 
{ 
    int id_num; 
    bool overtime; 
    float hourly_rate; 
}; 

int main() 
{ 
    PayStub info = {1234, false, 15.45}; 

    ofstream data_store; 

    data_store.open("test.cs111", ios::binary); 

    char *raw_data = (char*)&info; 
    data_store.write(raw_data, sizeof(PayStub)); 

    data_store.close(); 

    return 0; 

} 

Я не понимаю, что происходит конкретно в заявлении char *raw_data = (char*)&info; и почему это необходимо. Я понимаю, что указатель на char объявляется и инициализируется, но что именно он инициализируется и как это используется в следующей строке? Надеюсь, это не глупый вопрос. Заранее спасибо за вашу помощь.

+0

[address_of] (http://en.cppreference.com/w/c/language/operator_member_access#Address_of) – Drop

+0

Он * считывает * содержимое содержимого в виде байтового массива, что приводит к конкретному значению реализации с заполнением и endianness, представление с плавающей запятой ... – Jarod42

+0

«краткая и не переносная»: p – Alnitak

ответ

2

char *raw_data = (char*)&info; после этой строки raw_data укажет на адрес первого байта info.

С data_store.write(raw_data, sizeof(PayStub)); мы просим data_store записать в архив содержимое в памяти, которое начинается с raw_data и заканчивается на raw_data + sizeof(PayStub)).

В сущности, мы находим начальный адрес и длину PayStub и записываем их на диск.

Это не глупый вопрос. Как только вы начнете читать указатели, все будет иметь смысл.

+0

Это указатель, указывающий на первый символ, начинающийся с адреса info-? – Sinux1

+0

Точно. К первому байту информации. –

+0

Итак, тогда, когда вы пишете в файл, он пишет байт за раз, пока он не достигнет полного размера строгой? Большое спасибо. Я вернусь к чтению на указателях. – Sinux1

0

Подумайте о struct (в простой форме C), чтобы просто быть способом связывания связки object с вместе с «строкой».

int может быть изображена в памяти объемом 4 байт. Структура, состоящая из двух int s, будет 8 байтов, одна int рядом с другой.

В вашем примере кода, &info возвращает указатель на начало объекта в памяти, и (char*)&info просто интерпретирует как указатель на символ вместо этого, так что это можно рассматривать как последовательность двоичных данных. sizeof возвращает количество памяти (в байтах), которое занимает структура, и с этой информацией структура затем записывается непосредственно в файл из памяти.

Имейте в виду, что этот тип хранения данных абсолютно не портативный. Он может отличаться от 32-битного до 64-битного компьютера!

+0

_ "и' (char *) & info' просто интерпретируется как указатель на символ вместо "_ - термин" символ "может вводить в заблуждение новичка C++, особенно в этом контексте бинарных файлов. Следует подчеркнуть, что 'char' является фундаментальным типом C/C++, который представляет собой один байт. Не просто «персонаж». Таким образом, как правило, аргументы в стандартных библиотечных функциях C++, которые относятся к необработанному блоку данных, типично типизируются как 'char *' или 'const char *'. –

+0

@ R.G. Это правда. Я должен был быть более ясным. – Kupiakos

+0

@kupiakos, так он записывает последовательность двоичных данных, один размер символа (байт) за раз? – Sinux1

Смежные вопросы