Не могу понять первый аргумент write () - PullRequest
0 голосов
/ 29 июня 2011

Я сталкивался с утверждением:

outbal.write( (char*) &acc , sizeof( struct status ) );

outbal - это объект ofstream, а status - это тип.

Следовательно:

struct status {
  // code
};

status acc;

Говоря о второй строке, я не понимаю первый аргумент, который является (char*) &acc.Что мы делаем и как?

Ответы [ 4 ]

2 голосов
/ 29 июня 2011

(char*)&acc если адрес переменной acc, привести к указателю на символ, чтобы быть совместимым с ostream::write(). Именно эта переменная записывается в поток outbal на длину sizeof(struct status).

ostream::write принимает адрес и длину памяти и выводит эту память в указанный поток. Другими словами, вы просто выводите все содержимое памяти переменной acc.

Ваш код похож на:

struct xyz {int a; float b; void *c};

ostream os("myfile.dat");

struct xyz abc; // 'struct' not technically needed in C++

os.write (  (char *)abc,      sizeof (struct xyz));
//        <<-memory addr->>   <<-----size----->>
1 голос
/ 29 июня 2011

Вы берете адрес acc и приводите его к char*, чего ожидает функция-член ostream::write.

Короче говоря, вы пишете представление в памятиstruct as-is для потока.

0 голосов
/ 29 июня 2011

Это просто взятие адреса acc и приведение его к указателю на char.

Скорее всего, метод .write() предназначен для слепой записи заданного количества байтов как есть.char - это удобный тип для этого, поскольку (на большинстве платформ) его размер составляет ровно один байт.Таким образом, вы передаете ему указатель на данные, которые вы хотите записать, говоря: «Представьте, что это указатель на char».

0 голосов
/ 29 июня 2011

(char*) &acc берет адрес структуры acc (то есть указатель на acc) и затем преобразует его в указатель на char.

...