# Native Code > برنامه نویسی با C > برنامه نویسی با زبان C و ++C >  نوشتن در فایل به صورت باینری

## mortez maya

با سلام خدمت دوستان می خواستم بدونم از دوستان اطلاع دارن که چطور میشه در یک فایل کاراکترهایی مثل صفر یا یک رو نوشت به صورتی که هر صفر یا یکی که نوشته می شود فضایی به اندازه 1 bit را اشغال کرده باشد؟ مرسی./

----------


## galaxy.ice

اگه file ی که درست میکنی به صورت باینری باشه همونی میشه که میخوای."b"

----------


## mortez maya

نمیشه دیگه وقتی شما یک کاراکتر توی فایل باینری میریزی اگه بری تو ویندوز و نگاه کنی حجمش یک بیت نمیشه !

----------


## sjj

> اگه file ی که درست میکنی به صورت باینری باشه همونی میشه که میخوای."b"


شما امتحان کردی عزیز ؟

----------


## sjj

یعنی کسی نیست جواب ما رو بده ؟

----------


## galaxy.ice

:) خوب درست .اولا نباید 1 بیت باشه که.2 شما با چه برنامه ای حجم واقعی فایل و نگا میکنین.3 خوبه که یه کوچولو کتاب ذخیره بازیابی بخونین.

----------


## linux

> با سلام خدمت دوستان می خواستم بدونم از دوستان اطلاع دارن که چطور میشه در یک فایل کاراکترهایی مثل صفر یا یک رو نوشت به صورتی که هر صفر یا یکی که نوشته می شود فضایی به اندازه 1 bit را اشغال کرده باشد؟ مرسی./


این سوال شما متناقض هست! کارکتر یک معنی داره بیت هم یک معنی شما هیچ وقت نمی توانید کارکتر 0 یا 1 را در یک بیت جا بدهید   کارکتر 0 برابر 110000 هست. 
اگر شما می خواهید بیت ها را پردازش کنید یک بحث دیگه ای هست

----------


## american_iran2006

شاید منظور دوستمون یک بایت باشه

----------


## sjj

نخیر دوستان منظور همون بیته.اصلا چطور می تونیم با داده ها بیتی کار کنیم ؟

----------


## mortez maya

> :) خوب درست .اولا نباید 1 بیت باشه که.2 شما با چه برنامه ای حجم واقعی فایل و نگا میکنین.3 خوبه که یه کوچولو کتاب ذخیره بازیابی بخونین.


سلام خدمت دوستان عزیز جناب گالاکسی عزیز چرا نباید 1 بیت باشه؟ اصولا با ویندوز میبینیم چون ویندوز تعیین میکنه فایل چقدر از حافظه اشغال کرده در مورد بند سوم هم من یه دو سه ترم پیش ذخیره پاس کردم. اما اینا بحث حاشیه ای هستش نمی دونم چرا دوستان این سوال واضح رو اینقدر برا خودشون غیر واضح و متناقض جلوه می دن باور کنید سوال خیلی ساده است جوابشه که مشکله *ما می خواهیم یک "0" یا هر چیز دیگری که دوستان اسمشو گذاشتند در یک فایل بنویسیم سپس به محیط ویندوز رفته و به اندازه فایل نگاه کنیم و ببینیم آنجا نوشته است 1 bit آیا امکان دارد یا خیر؟* به همین سادگی./

----------


## sh_roohani

سلام،

عزیز دل برادر، اولا شما کمتر از یک بایت رو که با توابعی که من می شناسم نمی تونید ذخیره کنید. ثانیا اگه می خواین بر حسب بیت کار کنین، باید از عملگرهای bitwise استفاده کنین و هر بیتی رو که می خواین ذخیره کنین در یه بایت اعمال کنین و بعد اون بایت رو ذخیره کنین. ثالثا همیشه باید به یه ترتیبی ردی از این مسئله نگه دارین که چند بیت از آخرین بایتتون معتبره. چون ممکنه شما همه 8 بیت رو با 0 و 1 های معتبر پر نکرده باشین. مثلا می تونین قرارداد کنین که بایت یکی مونده به آخر همیشه تعداد بیتهای معتبر بایت آخر رو نشون بده و بدین ترتیب حتی اگه فقط قرار باشه 1 بیت هم ذخیره کنین به دو بایت نیاز دارین. حالا شاید روش encoding خاصی هم باشه که این نیاز رو از بین ببره. بعد هم محدودیتهای سیستم عامل رو در ذخیره فایلها در نظر بگیرین، منظورم کمینه فضایی هست که سیستم عامل برای یک فایل می گیره، مثلا یک سکتور.

----------


## linux

ذخیره کردن در یک سیستم بستگی کامل به فایل سیستم شما دارد مثلا در ntfs با alocation unit size 4096bye
شما اگر یک فایل درست کنید که حجمش 1 بایت باشه وقتی این فایل ذخیره میشه 4096 بایت جا میگیره در حقیقت وقتی می خواهید اندازه یک فایل را نگاه کنید ما 2 تا اندازه داریم یک اندازه واقعی فایل اندازه ای که روی هارد جا می گیرد

----------


## sh_roohani

دقیقا منظورم از "کمینه فضایی که سیستم عامل برای یک فایل می گیره" همین بود که شما فرمودین.

----------


## sjj

ببینید دوستان من یه برنامه فشرده سازی تو C نوشتم که با الگوریتم هافمن کار می کنه.همونطور که مستحضر هستید این الگوریتم برای کاراکتر های تکراری کدهای باینری مختلفی تولید می کنه.این نکته رو هم می دونیم که به طور معمول هر کاراکتر در فایل به یک بایت فضا احتیاج داره.
حالا اگه ما این کد های هافمن هر کاراکتر رو ، طوری ذخیره کنیم که کمتر از یک بایت فضا اشغال کنه طبق الگوریتم هافمن می تونیم بین 20 تا 90 درصد عمل فشرده سازی رو انجام بدیم.
سوال من اینه که چطور کدهایی که تولید کردیم رو توی فایل ذخیره کنیم که کد معادل برای هر کاراکتر فضایی کمتر از یک بایت اشغال کنه؟
با تشکر.

----------


## linux

> ببینید دوستان من یه برنامه فشرده سازی تو C نوشتم که با الگوریتم هافمن کار می کنه.همونطو که مستحضر هستید این الگوریتم برای کاراکتر های تکراری کدهای باینری مختلفی تولید می کنه.این نکته رو هم می دونیم که به طور معمول هر کاراکتر در فایل به یک بایت فضا احتیاج داره.
> حالا اگه ما این کد های هافمن هر کاراکتر رو طوری ذخیره کنیم که کمتر از یک بایت فضا اشغال کنه طبق الگوریتم هافمن می تونیم بین 20 تا 90 درصد عمل فشرده سازی رو انجام بدیم.
> سوال من اینه که چطور کدهایی که تولید کردیم رو توی فایل ذخیره کنیم که کد معادل برای هر فایل فضایی کمتر از یک بایت اشغال کنه؟
> با تشکر.


خوب نمی تونی ما چند روز هست که می گیم نمی تونی!

----------


## mortez maya

جناب لینوکس عزیز غیر ممکنه که نشه! حتما راهی هست باید راهشو پیدا کنیم اگه نمیشد که هافمن این  الگوریتم رو  اختراع نمی کرد!!؟

----------


## sjj

> خوب نمی تونی ما چند روز هست که می گیم نمی تونی!


عزیز دل برادر!نمی تونی یعنی چی ؟ "نشد" که نشد کار!اگه این طوریه پس فشرده ساز ها چطوری کار می کنن؟پس این الگوریتم هافمن با این همه دک و پز کشکه ؟!

----------


## linux

> عزیز دل برادر!نمی تونی یعنی چی ؟ "نشد" که نشد کار!اگه این طوریه پس فشرده ساز ها چطوری کار می کنن؟پس این الگوریتم هافمن با این همه دک و پز کشکه ؟!


نخیر کشک نیست!
توی این الگوریتم ها این بیت هایی که شما می فرمایید کنار هم می چینند ازش بایت درست می کنند و از آن بایت استفاده می کنند.
شما در این آدرس راهنمایی کامل به همراه سورس کد برنامه را پیدا خواهید کرد
http://www.w3.org/Graphics/PNG/RFC-1951

----------


## sh_roohani

سلام،

برادر من، آخر آخرش که شما نمی تونین کمتر از حداقل مجاز سیستم عامل روی دیسک، فایل بسازین (که این حداقل هم حداقل یک سکتوره). الگوریتم های فشرده سازی هم اینکار رو توی حافظه می کنن، تازه اونا هم حداقل با یه بایت کار می کنن.
یا اینکه اگه چیز دیگه ای هست و من بی اطلاعم، لطفا به من هم بگین.

----------


## sjj

> نخیر کشک نیست!
> توی این الگوریتم ها این بیت هایی که شما می فرمایید کنار هم می چینند ازش بایت درست می کنند و از آن بایت استفاده می کنند.
> شما در این آدرس راهنمایی کامل به همراه سورس کد برنامه را پیدا خواهید کرد
> http://www.w3.org/Graphics/PNG/RFC-1951


پس نگید که نمیشه.منظور بنده هم همین بود دیگه.
بسیار ممنون از راهنماییتون.

----------


## galaxy.ice

نه امکان نداره.هرفایلی هدری داره.فایل ها از block  و رکورد ها تشکیل میشن . بین بلاک ها فظاهای waste وجود داره حتی در بهترین حالت ها.تو هدر فایل flag protection یا .... وجود داره.
فایل یه واحد کوچیک ذخیره سازی نیست.
field میتونه 1 بیت باشه اونم شاید!
ok?

----------


## galaxy.ice

یه توضح کوچولوی دیگه بگم . من در باره size واقعی فایل صحبت میکنم روی رسانه ذخیره سازی.
اون حجمی که ویندوز نشون میده واسه فایل های با فرمت مختلف  فرق میکنن.

----------


## mortez maya

لینوکس جان خیلی ممنون از راهنماییت. موفق باشی./

----------

