Форум: "Прочее";
Текущий архив: 2006.04.23;
Скачать: [xml.tar.bz2];
ВнизНемного 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++?
← →
ArtemESC © (2006-04-01 22:22) [41]>>XeON © (01.04.06 22:19) [40]
Упакованная?
← →
XeON © (2006-04-02 22:09) [42]Ну я не знаю. Наверное не упакованная. Обычная запись.
Rec: TRecord;
и т.д...
← →
jack128 © (2006-04-02 22:18) [43]XeON © (02.04.06 22:09) [42]
и т.д...
хотлось бы видить это самое >>т.д.<<
← →
Piter © (2006-04-02 22:18) [44]XeON © (02.04.06 22:09) [42]
Rec: TRecordTRecord = packed record
...
вот если есть packed - значит, упакованная.
← →
XeON © (2006-04-02 22:22) [45]Нет, packed нету! Просто запись, не пакованная.
← →
марсианин © (2006-04-02 23:14) [46]наверное то, что нужно
http://rsdn.ru/Forum/Info.aspx?name=FAQ.cpp.struct2file
← →
XeON © (2006-04-03 00:32) [47]марсианин, спасибо. Это реальная документация. Надеюсь, что код - работает! Пойду проверять...
← →
XeON © (2006-04-03 01:05) [48]марсианин, БОЛЬШОЕ ТЕБЕ ЧЕЛОВЕЧЕСКОЕ СПАСИБО! Я долго бился над записями... Благодаря тебе "отбился" наконец! А так же я хочу выразить большую благодарность всем, кто пытался помочь или просто заглунл в эту тему (не поленился). Спасибо вам всем!
Админы, тема закрыта.
Страницы: 1 2 вся ветка
Форум: "Прочее";
Текущий архив: 2006.04.23;
Скачать: [xml.tar.bz2];
Память: 0.57 MB
Время: 0.014 c