Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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: TRecord


TRecord = 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
2-1144755963
elfebet
2006-04-11 15:46
2006.04.23
Как добавить в exe иконку


15-1143896469
_duk
2006-04-01 17:01
2006.04.23
Защита


1-1142596234
Dust
2006-03-17 14:50
2006.04.23
Скачал Indy 10, не могу установить


2-1144219450
Daimyo
2006-04-05 10:44
2006.04.23
динамическое создание Tstringgrid


1-1142855845
Кашперук Иван
2006-03-20 14:57
2006.04.23
Как обработать клик по заголовку груда?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский