PDA

View Full Version : منظور از BUFSIZ چیست؟



hosseinam1370
یک شنبه 02 فروردین 1394, 23:47 عصر
دوستان منظور از BUFSIZ چیست؟و چه بدردی میخوره؟
وقتی که من این کد رو run میکنم ، مقدار 512 رو به من نشون میده.

کد:
#include "stdafx.h"
#include <fstream>
#include<iostream>
#include <string>
#include<stdio.h>
using namespace std;
void main()
{


cout << BUFSIZ;
system("pause");
}


و سوال دیگه اینکه تابع setbuf چیکار میکنه؟

http://www.cplusplus.com/reference/cstdio/setbuf/

مثله اینکه تو ویژال استدیو 2012 دیگه چنان کاربردی نداره ، چون تو کتابخونه msdn تابع معادلش پیدا نشد و خود کامپایلر هم ناامن میزنه این کد رو.
با تشکر.

rahnema1
دوشنبه 03 فروردین 1394, 00:29 صبح
سلام
وقتی یک stream مثل یک فایل یا مثلا ورودی خروجی کنسول بافر نشه به این معنا هست کاراکترهایی که می خونیم تک به تک ظاهر بشن
اما در حالتی که بافر بشن به این معنا هست که کاراکترهایی که خونده میشه به صورت بلاک به بلاک خونده میشه و در بافر ریخته میشه تا وقتی بافر پر شد اون وقت به مقصد منتقل میشه
هر دستور خواندن باعث ایجاد یک system call میشه
مزیت بافر شدن stream اینه که باعث میشه تعداد system call ها کمتر بشه که این کار سرعت را بالا می بره
مثلا سایز فایل 500 باشه و بافر (آرایه کاراکتر) سایزش 100 باشه وقتی که stream بافر نباشه باید 500 تا system call انجام بشه
ولی در حالتی که بافر باشه 5 تا system call انجام میشه
معمولا stream ها به صورت بافر شده هستند که با setbuf میشه این خصوصیت را تغییر داد
توی استاندارد در این مورد توضیح داده
در اینجا (http://stackoverflow.com/questions/2669933/default-input-and-output-buffering-for-fopend-files)هم یه سری توضیح هست

hosseinam1370
دوشنبه 03 فروردین 1394, 10:03 صبح
ممنون دوسته عزیز ،پس اینطور که من فهمیدم ، سیستم من تا 512 باید حافظه بافر داره ، و به طور اتوماتیک وقتی که این 512 تا پر شد ، دیتا در فایل مقصد نوشته میشوند و دوباره 512 تا پر میشه و همین روند ادامه پیدا میکنه، و این اگه ما در یک زمان مشخص بخایم 1024 بایت کاراکتر بنویسیم ، این کار در بافر 2 بار انجام میشه و system call هم 2 بار به صورت اتوماتیک فراخانی میشه.درسته؟!!

و ما چندان نیازی به تابع setbuf و setvbuf نداریم، چون همون 512 بایت برای ما بسه ! درسته ؟!!!


با تشکر.

rahnema1
دوشنبه 03 فروردین 1394, 15:26 عصر
شاید ترجیح بدیم بدون بافر کار انجام بشه یا بافر با سایز بیشتر بدیم یا اصلا با دادن گزینه IOLBF کاری کنیم که فایل را خط به خط بخونه

hosseinam1370
دوشنبه 03 فروردین 1394, 17:00 عصر
اگه لطف کنید منظور این دو ماکرو رو هم بگید ممنون میشl:
_IOFBF : این مد صبر میکنه تا بافر پر بشه و بعد کل دیتا رو به مکان مورد نظر انتقال میده.

IOLBF : این مد همونطور که گفتید خط به خط یا صبر میکنه تا بافر پر شه و دیتا رو انتقال میده.

IONBF : ولی اینو نفهمیدم.

http://www.cplusplus.com/reference/cstdio/setvbuf
/ (http://www.cplusplus.com/reference/cstdio/setvbuf/)

با تشکر.

rahnema1
دوشنبه 03 فروردین 1394, 20:34 عصر
IONBF یعنی بافر نشه