Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.23;
Скачать: CL | DM;

Вниз

Немного C++ a   Найти похожие ветки 

 
XeON ©   (2006-03-23 01:16) [0]

Здравствуте товарищи программисты! У меня тут назреламысль... Всем известен такой тип данных как LongInteger, LongInt или просто Long (в зависимости от языка). Так вот, выяснилось... что этот тип данных занимает в памяти 4 байта. У меня возник такой интересный вопрос: а как бы эти 4 байта запихать в файл на жёстком диске? Все попытки сделать что-то подобное заканчивались следующим: 1. Записывалось отнюдь не 4 байта, а столько байт, сколько знаков в числе. 2. Вместо числа - вписывался его адрес в оперативной памяти... Вобщем получалось всё что угодно, но никак не удвалось загнать его в 4 байта в файл...


 
Джо ©   (2006-03-23 01:21) [1]

Извини, бред какой-то... Еще и C++ приплел, к чему?


 
matt ©   (2006-03-23 01:40) [2]

(с) "отставить пиво! отсыпь мне не много..."


 
XeON ©   (2006-03-23 01:51) [3]

В дельфе есть такая штука как запись. В С++ есть такая штука как Struct. Так вот. При использовании записей в дельфи - 1 LongInt в файле занимает 7 байт, хотя для LongInt - может увеличиваться до 10 и более знаков. НО! LongInt любой длины - занимает в записи всего 7 байт. Так вот мне и хотелось бы узнать, раз в C++ он занимает всего 4, может быть можно запихать в файл 4 байта, а не 10? Поясню ещё проще: 123456790 - 10и значное число. В записи-дельфи оно занимает 7 байт. В C++ оно занимает 4. Может кто-нибудь подскажет, как в C++ сделать что-то подобное "записи", как в Delphi? Что бы можно было её читать и писать. Вобщем кто совсем не понял - объясню ещё проще, берём литературу по Delphi и читаем раздел: "типы данных определяемые программистом". Как в C++ определить свой тип данных, так же как в Delphi? Надеюсь теперь мой вопрос всем придельно ясен?


 
Piter ©   (2006-03-23 02:13) [4]

Да-а-а... вот человек травку то нашел ядреную какую...

Уважаемый XeON! Если вы не умеете писать на Delphi - то каким образом курение запрещенных препаратов поможет в этом?


 
Труп Васи Доброго ©   (2006-03-23 03:06) [5]

XeON ©   (23.03.06 1:16)
"Безвредные говоришь... Ну тогда дай мне вот этих со звёздочкой на пол часа..." (с) Магазинчик Бо, Супер Драг.
Ты тоже у зайца отоварился? Никак не отпустит?


 
Джо ©   (2006-03-23 03:10) [6]

> Надеюсь теперь мой вопрос всем придельно ясен?

Нет, он только добавил сомнений. Как согласуется фраза "Как в C++ определить свой тип данных, так же как в Delphi?" со всем остальным, так многословно тобою изложенным? ;>


 
TUser ©   (2006-03-23 06:31) [7]

Подозреваю, что тут вопрос в различиях record и packed record. В Д по умолчанию поля в записях выравнены, поэтому добавляются лишние байты.


 
MBo ©   (2006-03-23 06:34) [8]

Прочитай здесь, как писать в текстовые и бинарные файлы:
http://www.delphikingdom.ru/lyceum/seminar.asp?ID=2


 
Ketmar ©   (2006-03-23 06:35) [9]

неа. тут, всё-таки, вопрос в "марке" травы. ну не ровняют эльфы записи по границе 7 (прописью: семи) байтиков. нет там такого секретного ключа.


 
TUser ©   (2006-03-23 06:42) [10]


> неа. тут, всё-таки, вопрос в "марке" травы. ну не ровняют
> эльфы записи по границе 7 (прописью: семи) байтиков. нет
> там такого секретного ключа.

Зато эльфы ровняют на границу двойного слова
a: record
i: byte
j: integer;
end;
будет байт, потом три байта мусора, потом - интегер. Итого 7 байт получается, из которых три лишних. Как и описано.


 
Ketmar ©   (2006-03-23 06:46) [11]

1+3+4 -- 8. integer -- 4 байта. может, вы просто ещё не выпались? %-)


 
TUser ©   (2006-03-23 06:52) [12]

3 + 4 = 7. Так человек и пишет - 7 вместо 4. А на плюсах 4 выходит, т.к. struct - он всегда packed.


 
Ketmar ©   (2006-03-23 06:57) [13]

неа. 1+3+4 (для выравнивания по двойному слову). или 1+4 (для пакованых). а вот Ваш способ вычисления мне совершенно непонятен. эти самые три байтика неадресуемы по имени. или вы намекаете на то, что из размера записи вычитаем размер первого поля и получаем ту самую мистическую семёрку?


 
TUser ©   (2006-03-23 07:21) [14]

> размера записи вычитаем размер первого поля и получаем ту самую мистическую семёрку?

Вполне возможно, что автор так и поступил. Хотя - пусть он уж сам расскажет.


 
SkyRanger ©   (2006-03-23 07:27) [15]

Мдяяя.. Похоже кто то пошутил и в Скитлс подсыпал ЛСД... :)

LOL он случайно не так записывал?

WriteLn(f, 1234);

??? %))))


 
Ketmar ©   (2006-03-23 07:33) [16]

а чего такого криминального в этом WriteLn, если f, конечно, file of integer?


 
Думкин ©   (2006-03-23 08:08) [17]

> Ketmar ©   (23.03.06 07:33) [16]

Тем, что WriteLN к такому типу файла не допускается?
:о)


 
Ketmar ©   (2006-03-23 08:45) [18]

да. пардон. ошибся. давненько не пользуюсь файлами, тем более типизированными. всё больше потоками или API... %-)


 
Lamer@fools.ua ©   (2006-03-23 08:57) [19]

>А на плюсах 4 выходит, т.к. struct - он всегда packed.

Не всегда.


 
TUser ©   (2006-03-23 09:14) [20]


> Не всегда.

Я на плюсах почти не работал. Там можно сделать выровненную "запись"?


 
Ketmar ©   (2006-03-23 09:37) [21]

да, конечно.


 
REA   (2006-03-23 09:39) [22]

>хотя для LongInt - может увеличиваться до 10 и более знаков

только в военное время


 
Anatoly Podgoretsky ©   (2006-03-23 09:47) [23]

Интересно, откуда люди берут такую классную траву.


 
icWasya ©   (2006-03-23 09:56) [24]

>XeON ©  
Как говорится - Код в студию!!


 
Lamer@fools.ua ©   (2006-03-23 11:11) [25]

>Я на плюсах почти не работал. Там можно сделать выровненную "запись"?

Да. В Майкрософтовском компиляторе #pragma pack, если мне не изменяет склероз.


 
Плохиш ©   (2006-03-23 11:25) [26]

Дайте мне тоже этой травки, я тоже хочу какую-нибуть идею родить.


 
wicked ©   (2006-03-23 11:36) [27]

> Lamer@fools.ua ©   (23.03.06 11:11) [25]

> Да. В Майкрософтовском компиляторе #pragma pack, если мне
> не изменяет склероз.

не только.... это "не-стандарт", который стал стандартом de facto во многих компиляторах си....


 
Romkin ©   (2006-03-23 11:52) [28]

А орешник еще работает? :)))


 
Piter ©   (2006-03-23 16:49) [29]

icWasya ©   (23.03.06 9:56) [24]
Как говорится - Код в студию!!


не-е-е-е, код нафиг... А вот травку - можно и в студию...


 
XeON ©   (2006-03-24 02:48) [30]

Как тема хорошо оживилась-то! Прям самая живая на форуме. Поясняю вопрос: я думаю некоторые из вас точно знают как работать с типизированными файлами. Вопрос: можно ли сделать подобную реализацию в С++ и если можно, то как? В delphi это реализуется в с помощью записи (Record), а в C++ вроде как с помощью typedef struct. Надеюсь теперь вопрос ясен и понятен?


 
Джо ©   (2006-03-24 04:28) [31]

> [30] XeON ©   (24.03.06 02:48)

Вы точно убеждены в том, что в Делфи работа с типизированными файлами "реализуется с помощью записи (Record)" или это шутка?


 
antonn ©   (2006-03-24 08:09) [32]

Джо ©   (24.03.06 4:28) [31]
может ему нужнем пример, как сохранить "сишный рекорд" по аналогии с дельфи?..
вообще, странное заявление про "В delphi это реализуется в с помощью записи (Record)"...


 
sniknik ©   (2006-03-24 09:04) [33]

> Прям самая живая на форуме.
флейм всегда более оживлен, чем серьезное обсуждение, но только по делу тут ничего не будет если продолжать в том же духе.

> В delphi это реализуется в с помощью записи (Record)
ага, значит если у меня файл типа байт, чар, доубле, етс. то то не типизированный...(???) волшебного слова Record не хватает. ;о))

> Надеюсь теперь вопрос ясен и понятен?
лучше один раз код увидеть, чем сто раз его косноязычное описание услышать...


 
XeON ©   (2006-03-24 11:07) [34]

Вобщем покащываю на пальцах:
type
 TRec=record
 L:LongInt;
 C:Char;
end;


После чего можно эту запись использовать:
var
F:File of TRec;


А потом - можно эту запись читать и писать! Думаю, что как это делаеся Вы сами знаете.

Так вот в чём вопрос: КАК РЕАЛИЗОВАТЬ ТО ЖЕ САМОЕ В С++? Надеюсь теперь всем всё ясно и понятно?


 
sniknik ©   (2006-03-24 11:35) [35]

> Так вот в чём вопрос: КАК РЕАЛИЗОВАТЬ ТО ЖЕ САМОЕ В С++?
описываеш структуру, определяеш ее размер, и пишеш/читаеш в файл определенное количество байт со ссылки/в ссылку на данные структуры.
> Думаю, что как это делаеся Вы сами знаете.


 
ivb2001 ©   (2006-03-24 11:53) [36]

struct
{
int h,nitems;
} MyStruct;

int fh;
MyStruct *myStructVar;

fh=open(имя_файла,O_CREAT|O_WRONLY|O_BINARY,0000200);
myStructVar = calloc(sizeof(MyStruct));
write(fh,myStructVar,sizeof(MyStruct));


 
XeON ©   (2006-03-26 01:34) [37]

ivb2001, слухай. Что-то данный тобой код не хочет компилироваться!


 
SPeller ©   (2006-03-26 06:24) [38]

XeON ©   (26.03.06 1:34) [37]
Что-то данный тобой код не хочет компилироваться


fh=open(имя_файла,O_CREAT|O_WRONLY|O_BINARY,0000200);

Выделенное необходимо заменить на имя файла.


 
XeON ©   (2006-03-27 02:40) [39]

Я понял, что выделенное надо заменить на имя файла, но. Dev C++ (MinGW) не хочет компилировать данный код. :( Выдаёт кучу ошибок.


 
XeON ©   (2006-04-01 22:19) [40]

Ладно, поставлю вопрос немного подругому. На Delphi создана запись, как её прочитать из C++?



Страницы: 1 2 вся ветка

Текущий архив: 2006.04.23;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.159 c
3-1141100337
Vladimir M
2006-02-28 07:18
2006.04.23
Как передать массив данных в параметр SQL запроса


5-1130329597
Priest
2005-10-26 16:26
2006.04.23
Перехват Notification для коллекции


15-1144042450
Ega23
2006-04-03 09:34
2006.04.23
С Днём рождения! 2 апреля


6-1136735022
Цукор5
2006-01-08 18:43
2006.04.23
WSACleanup


1-1142524876
oleg_
2006-03-16 19:01
2006.04.23
Если parent у checkboxa не форма а stringgrid, то он не кликается