PDA

View Full Version : چگونگی عملکرد تابع read عضو کلاس fstream



khafan_bat
سه شنبه 12 مرداد 1389, 00:10 صبح
ببینید من چگونگی کار با توابع read و write در جریان ورودی / خروجی فایل در سی پلاس پلاس رو یاد گرفتم ( با کمک دوستان در تاپیک قبل ) اما هنوز با نحوه ی عملکرد دقیق تابع read یه جورایی مشکل دارم .


istream& read ( char* buff, streamsize n );


اطلاعاتی که از فایل خوانده می شوند درbuf قرار میگیرند و n طول اطلاعاتی است که باید خوانده شود.

اگه ما بخوایم یک استراکچر رو به عنوان یک رکورد در فایل ذخیره کنیم با یک Block اطلاعات روبه رو هستیم به طول sizeof اون ساختمان که به ترتیب دارا ی داده های زیر هست :

char name[21];
int hour;
int hp;


اما تابع read این بلاک از اطلاعات رو میخونه و در buff میریزه به صورت استرینگ هست. حالا اگه بافر ما یک ساختمان باشه با داده هایی مثل بالا چطور مقدار صحیح رو از اون بافر تشخیص میده و در بافر که یک ساختمان هست ذخیره میکنه ؟؟

http://www.imagehost.ro/pict/022308124c5725ac3c48e.JPG


خداییش خودم هم نفهمیدم چی پرسیدم !!!






این تابع چطور کار میکنه ؟؟ انتقال بلاک اطلاعات که کشک نیست. هست ؟


http://www.cplusplus.com/reference/iostream/istream/read/

PC2st
سه شنبه 12 مرداد 1389, 12:05 عصر
اما تابع read این بلاک از اطلاعات رو میخونه و در buff میریزه به صورت استرینگ هست.
بصورت string (به معنای واقعی) ذخیره نمی‌شوند، بصورت مجموعه‌ای از بایت‌ها ذخیره می‌شود. ‪char*‬ را بصورت «اشاره‌گری به مجموعه‌ای از بایت‌ها» بخوانید.


حالا اگه بافر ما یک ساختمان باشه با داده هایی مثل بالا چطور مقدار صحیح رو از اون بافر تشخیص میده و در بافر که یک ساختمان هست ذخیره میکنه ؟؟
تشخیص نمی‌دهد، تابع read دقیقا با متغیر emp همانند یک مجموعه از بایت‌ها رفتار می‌کند و اطلاعات را در آن قسمت از حافظه ذخیره می‌کند. پس اگر شما توسط تابع write، اطلاعات را از متغیری از نوع A در فایل ذخیره کنید و سپس توسط تابع read، همان اطلاعات را اینبار از طریق متغیری از نوع B دریافت کنید، اگر انواع A و B مثل هم نباشند، اطلاعات بصورت کاملا غلط برداشته خواهد شد. پس این شما هستید که باید تشخیص دهید اطلاعات بدرستی ذخیره شود، تابع read نمی‌تواند این مورد را بررسی کند.


این تابع چطور کار میکنه ؟؟ انتقال بلاک اطلاعات که کشک نیست. هست ؟
کشک نیست؛ همان جوابی که انتظارش را داشتید :لبخند:.

شما نوع short را در نظر بگیرید، اگر مقداری از حافظه را به این نوع متغیر اختصاص دهید، ۲ بایت از حافظه اختصاص داده می‌شود، پس توسط اشاره‌گری از نوع char می‌توانید به مقادیر بایت اول و بایت دوم آن به ترتیب به صورت جدا دسترسی داشته باشید. این همان رفتاری است که در اینجا توسط تابع read یا write بر روی متغیرها اعمال می‌شود.

khafan_bat
سه شنبه 12 مرداد 1389, 13:26 عصر
خوب در حالتی که با فایل های اسکی کار میکنم ok اما اگه باینری باشه چی ؟ یک بایت از متغیر اینت که به صورت باینری نوشته شده چیزی رو نشون نمیده . . .

یه جورایی می فهمم و درک می کنم ولی نمیفهمم. !! تسلط پیدا نکردم

khafan_bat
سه شنبه 12 مرداد 1389, 13:27 عصر
اگر انواع A و B مثل هم نباشند، اطلاعات بصورت کاملا غلط برداشته خواهد شد.

حتی اگه داده های عضو سختمان ما جابه جا هم بشه داده ها اشتباه خونده میشه ، این رو چک کردم

PC2st
سه شنبه 12 مرداد 1389, 14:35 عصر
خوب در حالتی که با فایل های اسکی کار میکنم ok اما اگه باینری باشه چی ؟ یک بایت از متغیر اینت که به صورت باینری نوشته شده چیزی رو نشون نمیده . . .اگر منظور شما را درست متوجه شده باشم؛ اینطور نیست... اگر نوع int را توسط write در فایل بریزیم (فایلی که بصورت binary باز شده...) و اگر بخواهیم توسط read همان فایل را بخوانیم (باز هم فایل بصورت binary باز شده...)، اطلاعات به درستی گرفته می‌شود و از این لحاظ مشکلی نیست.

در واقع در صورت استفاده از توابع read و write، تقریباً مهم نیست که فایل بصورت باینری باز شده یا بصورت متنی... و در صورت استفاده از تابع write و read، اینکه فایل باینری است یا متنی، تنها در نحوهٔ تشخیص انتهای فایل (EOF) کاربرد دارد، چون مقادیر توسط توابع read و write بصورت قالب‌بندی‌نشده نوشته و خوانده می‌شوند. اگر این برای شما مهم است، از formatted input and output استفاده کنید یعنی عملگرهای << و >> که معادل همان fscanf و fprintf از توابع C هستند. در اینصورت اگر فایل را بصورت متنی باز کرده باشید، اعداد بصورت کاراکتر ذخیره می‌شود و می‌توانید توسط یک ویرایشگر متنی محتویات آنرا مشاهده کنید. اما اگر فایل را بصورت باینری (دودوئی) باز کرده باشید، نمی‌توان اینطور با آن رفتار کرد. در صورت باز کردن فایل بصورت متنی و استفاده از ورودی - خروجی قالب‌بندی‌شده، در حین ذخیره اطلاعات در فایل، باید آنها را با یک فاصله از یکدیگر متمایز کنید.


حتی اگه داده های عضو سختمان ما جابه جا هم بشه داده ها اشتباه خونده میشه ، این رو چک کردم بله دقیقاً...
چونکه با جابجائی اعضای struct، نحوهٔ چیدمان و دسترسی به مقادیر موجود در حافظه متفاوت می‌شود.