ویکیکتاب
fawikibooks
https://fa.wikibooks.org/wiki/%D8%B5%D9%81%D8%AD%D9%87%D9%94_%D8%A7%D8%B5%D9%84%DB%8C
MediaWiki 1.47.0-wmf.20
first-letter
مدیا
ویژه
بحث
کاربر
بحث کاربر
ویکیکتاب
بحث ویکیکتاب
پرونده
بحث پرونده
مدیاویکی
بحث مدیاویکی
الگو
بحث الگو
راهنما
بحث راهنما
رده
بحث رده
کتابآشپزی
بحث کتابآشپزی
ویکیکودک
بحث ویکیکودک
موضوع
بحث موضوع
TimedText
TimedText talk
پودمان
بحث پودمان
Event
Event talk
ویکیکتاب:درخواستهای مدیر شدن
4
8
135066
134953
2026-09-19T23:16:04Z
Vivairan2
28134
/* درخواست مدیر شدن، vivairan */ پاسخ
135066
wikitext
text/x-wiki
{{ویکیکتاب:درخواستهای مدیر شدن/الگوی بایگانی}}
در این صفحه '''درخواستهای مدیر شدن''' مطرح میشوند. مدیر کاربریست که اختیارات بیشتری برای ادارهٔ وبگاه دارد. در صورتی که تقاضای ارتقای دسترسی دارید، در بخش '''تقاضای نامزدی برای مدیریت''' امضای کاربری خود را وارد کنید.
* مدیران پیشین:
# [[کاربر:Kaveh|کاوه]]
# [[کاربر:مجید~fawikibooks|مجید]]
# [[کاربر:komeil_4life|کمیل]]
<span style="color: red;">توجه</span> داشته باشید که آدرس ایمیل شما بایستی در ترجیحات یا در صفحهٔ کاربری وارد شده باشد. در صورتی که در دیگر پروژههای ویکیمدیا فعالیت داشتهاید به صفحه کاربری خود در آن پروژه پیوندی قرار دهید و در نهایت با ذکر دلیل در خواست خود را مطرح کرده و آن را امضا کنید.
==درخواست مدیر شدن، دوستدار ایران بزرگ(۵)==
<div class="boilerplate" style="background-color: #efe; margin: 2em 0 0 0; padding: 0 10px 0 10px; border: 1px dotted #aaa;">
تا کنون برای گسترش محتوای ویکیکتاب تلاش زیادی کردهام. در دنیای مجازی وبگاههای تجاری و تبلیغاتی بسیاری وجود دارند که در هنگام گوگلیابی برای محتوای آموزشی ممکن است با آنها روبرو شوید، حال آنکه به دنبال محتوای آموزشی رایگان میگردید. هدف ما در ویکیکتاب فراهم کردن چنین محتوایی است و برای نیل به این هدف والا از شما درخواست میکنم به بنده رای موافق بدهید تا بتوانم به عنوان مدیر در کنار شما در این ویکی به فعالیتهای خویش ادامه دهم. --[[کاربر:Doostdar|دوستدار ایران بزرگ]] [[بحث کاربر:Doostdar|☎]] ۱۷ ژانویهٔ ۲۰۱۶، ساعت ۱۷:۱۴ (UTC)
* {{موافق}} با توجه به نیاز شدید ویکیکتاب به یک مدیر فعال (همچون جناب دوستدار) و نبودن گزینهی بهتری جز ایشان، با مدیریت ایشان موافقم. امیدوارم دیگر دوستان نیز با بنده هم نظر باشند. [[کاربر:7ramin7|<span style="color: #ff0000">7</span><span style="color: #f43a7c">RA</span><span style="color: #ff00f0">MI</span><span style="color: #9000ff">N</span><span style="color: #0c00ff">7</span>]] ۱۷ ژانویهٔ ۲۰۱۶، ساعت ۲۲:۲۲ (UTC)
{{چپچین}}
::Granted for 6 months from meta. [[کاربر:Ajraddatz|Ajraddatz]] ([[بحث کاربر:Ajraddatz|بحث]]) ۶ فوریهٔ ۲۰۱۶، ساعت ۲۱:۲۶ (UTC)
:::Thanks a lot. --[[کاربر:Doostdar|دوستدار ایران بزرگ]] [[بحث کاربر:Doostdar|☎]] ۷ فوریهٔ ۲۰۱۶، ساعت ۰۵:۵۶ (UTC)
{{پایان چپچین}}
</div>
==درخواست مدیر شدن، دوستدار ایران بزرگ(۶)==
<div class="boilerplate" style="background-color: #efe; margin: 2em 0 0 0; padding: 0 10px 0 10px; border: 1px dotted #aaa;">
بنده چندین سال است که در ویکیکتاب فارسی به طور پیوسته فعال هستم و در این مدت صفحات، الگوها، ردهها، راهنماها، ... بسیاری ایجاده کردهام. سعی کردهام کاربران تازهکار را به بهترین نحو برای ویرایش در این پروژه راهنمایی کنم. امیدوارم نظرتان نسبت به بنده مثبت باشد و به بنده اجازه دریافت دسترسی مدیریت دائم این پروژه را بدهید. --[[کاربر:Doostdar|دوستدار ایران بزرگ]] [[بحث کاربر:Doostdar|☎]] ۲۸ مهٔ ۲۰۱۷، ساعت ۰۶:۴۵ (UTC)
* {{موافق}}یادمه ژوئیه سال 2015 وقتی در ویکی کتاب ثبت نام کردم به دلیل عدم تجربه کافی و خامی خیلی به دنبال مدیریت بودم اما بعدها فهمیدم که این کار مسئولیت بسیار سنگینی دارد و معدود افرادی از این مسئولیت سربلند بیرون می آیند جناب دوستدار یکی از آن معدود افرادی بود که به حق مثل پدری دلسوز برای این ویکی زحمت کشیدند و نگذاشتند ویکی کتاب مثل ویکی خبر نابود شود و از بین رود ایشان همچون راهنمایی برا من بودند و مثل معلمی به من بسیاری از منش های ویکیایی رو یاد دادند بنده خود شاهد آن بودم که ایشون چقدر مشتاق گسترده شدن ویکی هستند حال دسترسی مدیریت دائمی نه تنها برازنده ایشان هست بلکه به حق واقعا نیاز است تا یک نظر دائم همیشه وجود داشته باشد مخصوصا حال که مقداری ویکی کتاب جان گرفته و در حال رشد است و تعدادی کاربر فعال اضافه شده است.بنده با وجود مشغله بسیار که در این روزها دارم اما وقتی این نظرخواهی دیدم حتما ملزم دانستم که بیایم و نظر خود را گفته و رای خود را بدهم.[[کاربر:دوستی بزرگ|دوستی بزرگ]] ([[بحث کاربر:دوستی بزرگ|بحث]]) ۲۸ مهٔ ۲۰۱۷، ساعت ۱۳:۲۱ (UTC)
* {{موافق}} ۱۰۰ درصد. بیش از [https://meta.wikimedia.org/w/index.php?title=Special%3ACentralAuth&target=Doostdar ۱۶ هزار ویرایش] در ویکیکتاب دارند. تداوم ویرایش در ویکیهای کوچک سخت است و این نشان از همت ایشان دارد. [[کاربر:4nn1l2|4nn1l2]] ([[بحث کاربر:4nn1l2|بحث]]) ۲۹ مهٔ ۲۰۱۷، ساعت ۲۲:۲۵ (UTC)
* {{موافق}} جناب دوستدار چند سالی است که این پروژه را اداره می کنن و کمک زیادی به آن کردند --[[کاربر:AFlorence|AFlorence]] ([[بحث کاربر:AFlorence|بحث]]) ۳۰ مهٔ ۲۰۱۷، ساعت ۱۳:۵۷ (UTC)
* {{موافق}} من ویکیکتاب را با کاربر:دوستی بزرگ میشناسنم. --[[کاربر:Chyah|Chyah]] ([[بحث کاربر:Chyah|بحث]]) ۲۱ ژوئن ۲۰۱۷، ساعت ۱۰:۴۰ (UTC)
::{{پب|Chyah}} البته من و جناب دوستی بزرگ دو کاربر متفاوت هستیم هر چند هر دوی ما با همفکری در ویکیکتاب همکاری میکنیم. --[[کاربر:Doostdar|دوستدار ایران بزرگ]] [[بحث کاربر:Doostdar|☎]] ۲۱ ژوئن ۲۰۱۷، ساعت ۱۰:۴۹ (UTC)
* {{موافق}} متاسفانه بنده فعالیتی در ویکیکتاب، دستکم تاکنون نداشتهام (همین قبل از شرکت در نظرسنجی حساب کاربریام را ایجاد کردم!)؛ اما این موضوع دلیل بر عدم شناخت من از تلاشهای دوستدار بزرگ ایران نمیشود. فعالیتهای ایشان در بسیاری از مقالات کشورها، ویکیسفر، درگاهها و .. قابل توجه است و جای تشکر دارد. امیدوارم موفق باشند--[[کاربر:کامران اورفه|کامران اورفه]] ([[بحث کاربر:کامران اورفه|بحث]]) ۲۳ ژوئن ۲۰۱۷، ساعت ۰۷:۳۹ (UTC)
* {{موافق}} ایشون همیشه در گسترش این پروژه و پروژه های خواهر فعال بودن[[User:Freshman404|<font color="red">'''Freshman404'''</font>]]<sup>[[User talk:Freshman404|<font color="green">'''''Talk'''''</font>]]</sup> ۲۴ ژوئن ۲۰۱۷، ساعت ۰۹:۵۲ (UTC)
</div>
==درخواست مدیر شدن، دوستدار ایران بزرگ(۷)==
<div class="boilerplate" style="background-color: #efe; margin: 2em 0 0 0; padding: 0 10px 0 10px; border: 1px dotted #aaa;">
با درود. بنده در مدتی که در این ویکی مدیر بودم بسیار در بهبود پروژه از نظر کمی و کیفی کوشیدم و علاوه بر ایجاد صفحات و کتابهای جدید موفق شدم با کمک کاربران راهنماها، ردهها، الگوها، ... جدید در این ویکی ایجاد کنم. برای بهبود وضع این ویکی دوباره درخواست مدیریت میدهم. از جمله کتابهایی که من نوشتم یا گسترش دادم [[غلبه بر سستی]]، [[ریاضی پایه]]، [[نانولولههای کربنی]]، [[آموزش کار با گودریدز]] هستند.--[[کاربر:Doostdar|دوستدار ایران بزرگ]] [[بحث کاربر:Doostdar|☎]] ۱۰ ژوئیهٔ ۲۰۱۸، ساعت ۱۹:۴۴ (UTC)
* {{موافق}} نظر خاصی ندارم فقط می دونم که فعالیت جناب دوستدار برای این ویکی مفیده.[[کاربر:Arkidie|Arkidie]] ([[بحث کاربر:Arkidie|بحث]]) ۱۰ ژوئیهٔ ۲۰۱۸، ساعت ۱۹:۵۴ (UTC)
:درود بر شما برای مدریت موقت نیاز به رایگیری دیگری نیست و به نظر شما شایستگی این را دارید که یک سال دیگر مدیر باشید. ممنون بابت زحمتاتان '''<font face="verdana">[[User:Mardetanha|<font color="#084C9E">م</font><font color="#4682b4">رد</font><font color="#6495ED">تن</font><font color="#4682b4">ه</font><font color="#084C9E">ا</font>]]</font>''' ۱۰ ژوئیهٔ ۲۰۱۸، ساعت ۲۱:۳۹ (UTC)
* {{موافق}} با مدیریت دائم کاربر:Doostdar در ویکیکتاب فارسی. [[کاربر:4nn1l2|4nn1l2]] ([[بحث کاربر:4nn1l2|بحث]]) ۱۱ ژوئیهٔ ۲۰۱۸، ساعت ۰۱:۴۸ (UTC)
* {{موافق}} بنظرم شیوه مدیریت موقت خصوصا در ویکی های کوچک که کاربران فعال قابل توجهی نداره و باید مدیرانش رو حفظ کنه نه اینکه درگیر یک سیستم دیوانسالارانه کنه منطق موجهی نداره و منم با مدیریت دائم کاربر:Doostdar در ویکیکتاب فارسی موافقم.[[کاربر:فرهنگ2016|فرهنگ2016]] ([[بحث کاربر:فرهنگ2016|بحث]]) ۱۱ ژوئیهٔ ۲۰۱۸، ساعت ۰۷:۲۳ (UTC)
::ویکیخبر فارسی یک مدیر داشت که رباترانی میکرد و بسیار به این دسترسی نیاز داشت پس از اینکه در فراویکی برای برداشتن این قانون (مدیریت موقت) درخواست داد با نظرش موافقت نشد و او برای همیشه ویکینویسی رو کنار گذاشت. --[[کاربر:Doostdar|دوستدار ایران بزرگ]] [[بحث کاربر:Doostdar|☎]] ۱۱ ژوئیهٔ ۲۰۱۸، ساعت ۱۴:۱۱ (UTC)
:::دوستدارجان باید نظرخواهی مدیریت دائم ایجاد میکرد. الان جناب فلورانس هم در ویکی سفر و هم ویکی واژه مدیر دائم هست.[[کاربر:فرهنگ2016|فرهنگ2016]] ([[بحث کاربر:فرهنگ2016|بحث]]) ۱۲ ژوئیهٔ ۲۰۱۸، ساعت ۰۵:۳۳ (UTC)
* {{موافق}} جناب دوستدار زحمات زیادی برای این ویکی کشیدهاند. با مدیریت دائم ایشان موافقم. [[کاربر:Mehran1370|مهران]] ([[بحث کاربر:Mehran1370|بحث]]) ۱۲ ژوئیهٔ ۲۰۱۸، ساعت ۰۹:۴۲ (UTC)
* {{موافق}} بسیار مناسب برای این دسترسی <span style="font-family:arial;color:#060; text-shadow: 0px 0px 0.11em #F00; font-size:14.1pt">[[User:fatemi|ح.فاطمی]]</span> ۱۲ ژوئیهٔ ۲۰۱۸، ساعت ۱۴:۲۰ (UTC)
</div>
==درخواست مدیر شدن، دوستدار ایران بزرگ(۸)==
<div class="boilerplate" style="background-color: #efe; margin: 2em 0 0 0; padding: 0 10px 0 10px; border: 1px dotted #aaa;">
بنده از سال ۱۳۹۳ به طور ناپیوسته در این ویکی مدیر بودم و در این مدت صفحات، الگوها، ردهها، راهنماها، ... بسیاری ایجاده کردهام. علاوه بر این به ساماندهی محتوای وبگاه و رفع مشکلات فنی آن پرداختهام. اکنون تمدید مدیریت خود را اعلام مینمایم. --[[کاربر:Doostdar|دوستدار ایران بزرگ]] [[بحث کاربر:Doostdar|☎]] شنبه،۲۶ مرداد ۱۳۹۸، ساعت ۰۷:۲۲ (ایران) ۱۷ اوت ۲۰۱۹، ساعت ۰۲:۵۲ (UTC)
</div>
==درخواست مدیر شدن، دوستدار ایران بزرگ(۹)==
<div class="boilerplate" style="background-color: #efe; margin: 2em 0 0 0; padding: 0 10px 0 10px; border: 1px dotted #aaa;">
در چند سال گذشته ویکیکتاب فارسی رشد چشمگیری داشته و برای ادامه رشد این پروژه و مبارزه با خرابکاریها بنده آمادگی خود را اعلام مینمایم تا به روال سالهای گذشته مدیر باشم. --[[کاربر:Doostdar|دوستدار ایران بزرگ]] [[بحث کاربر:Doostdar|☎]] جمعه،۲۲ بهمن ۱۴۰۰، ساعت ۱۴:۵۸ (ایران) ۱۱ فوریهٔ ۲۰۲۲، ساعت ۱۱:۲۸ (UTC)
*{{مخالف}} کاربری که درک درستی از پروژه ندارند نباید مدیر باشد '''<font face="verdana">[[User:Mardetanha|<font color="#084C9E">م</font><font color="#4682b4">رد</font><font color="#6495ED">تن</font><font color="#4682b4">ه</font><font color="#084C9E">ا</font>]]</font>''' ۱۱ فوریهٔ ۲۰۲۲، ساعت ۱۸:۱۵ (UTC)
* {{موافق}} صد در صد. آنی که غیرفعال است نباید مدیر باشد. Doostdar فعال است و پروژه را زنده نگه داشته است. [[کاربر:4nn1l2|4nn1l2]] ([[بحث کاربر:4nn1l2|بحث]]) ۱۵ فوریهٔ ۲۰۲۲، ساعت ۱۴:۵۸ (UTC)
* {{موافق}} با جناب فور موافقم، پروژه ویکیکتاب فارسی به واسطه ایشان زنده است و ایشان این پروژه را نگه داشتند وگرنه سرنوشت این پروژه هم به ویکیواژه فارسی دچار میشد. اعطای دسترسی مدیریت به کاربران فعال در پروژههایی که کاربران فعال کمی دارد برای آن پروژه مفید است.[[کاربر:Parsa 2au|Parsa 2au]] ([[بحث کاربر:Parsa 2au|بحث]]) ۱۵ فوریهٔ ۲۰۲۲، ساعت ۱۵:۵۵ (UTC)
* {{موافق}} اگرچه با رویهی ایشان در استفادهی سیاسی از [[ویکیکتاب:میز تحریر|میز تحریر]] موافق نیستم ولی همانطور که سایر کاربران گفتند، زحمات ارزندهی ایشان است که ویکیکتاب را سرپا نگاه داشته است. هماکنون صفحات زیادی هستند که برچسب حذف دارند ولی توسط مدیران فعلی حذف نمیشوند. قطعا ایشان که فعالیت بالایی دارند بایست مدیر شوند و احتمال قوی میدهم که زحمات خوبی در این زمینه خواهند کشید. اینکه درک درستی از پروژه ندارند هم موافق نیستم اگر منظور همین انتقاد اول من است که به نظرم با حجم بزرگ فعالیت ایشان قابل اغماض است و شخص ارجحتر از ایشان نداریم. --[[کاربر:Niyumard|Niyumard]] ([[بحث کاربر:Niyumard|بحث]]) ۱۵ فوریهٔ ۲۰۲۲، ساعت ۱۸:۳۶ (UTC)
*:پیامهای نامربوط و بیربط (اکثراً سیاسی) ایشان را از میز تحریر [https://fa.wikibooks.org/w/index.php?title=%D9%88%DB%8C%DA%A9%DB%8C%E2%80%8C%DA%A9%D8%AA%D8%A7%D8%A8%3A%D9%85%DB%8C%D8%B2_%D8%AA%D8%AD%D8%B1%DB%8C%D8%B1&type=revision&diff=115539&oldid=115493 پاک کردم]. شما هم اگر دیدید دوباره از این دست پیامها گذاشتند بیمعطلی حذفشان کنید. اگر به هر دلیل نخواستید خودتان درگیر شوید، مرا پینگ کنید. چند تا پیام نوروزی و یلدایی و جشن سده و کریسمس و از این دست فستیوالها هم هست که ربطی به پروژه ندارند و بهتر است در میز تحریر نباشند ولی شاید بهتر باشد زیاد سخت نگیریم تا احساس دلزدگی ایجاد نشوند. ایشان هم بهتر است پیامهای تبریکشان را به فستیوالهای مهمتر (مثلاً فقط نوروز) محدود کنند و دست از سر یلدا و سده و کریسمس[!] بردارند. [[کاربر:4nn1l2|4nn1l2]] ([[بحث کاربر:4nn1l2|بحث]]) ۱۵ فوریهٔ ۲۰۲۲، ساعت ۱۸:۴۹ (UTC)
* {{موافق}} راهنمایی های مفیدی دارندو علاقه مند به توسعه ویکی هستند
[[کاربر:Cultural sec|Cultural sec]] ([[بحث کاربر:Cultural sec|بحث]]) ۱۶ فوریهٔ ۲۰۲۲، ساعت ۰۰:۰۰ (UTC)
</div>
==درخواست مدیر شدن، دوستدار ایران بزرگ(۱۰)==
<div class="boilerplate" style="background-color: #efe; margin: 2em 0 0 0; padding: 0 10px 0 10px; border: 1px dotted #aaa;">
بنده چندین سال است که در ویکیکتاب فارسی به طور پیوسته فعال هستم و در این مدت کتابها، الگوها، ردهها، راهنماها، ... را بسیار گسترش دادهام. بنده در مدتی که در این ویکی مدیر بودم بسیار در بهبود پروژه از نظر کمی و کیفی کوشیدم و ویترینی از کتابهای خوبیده و برگزیده در صفحه اصلی ایجاد کردم. اکنون جهت پیشرفت سریعتر این وبگاه، بدین طریق درخواست مدیریت مینمایم. --[[کاربر:Doostdar|دوستدار ایران بزرگ]] [[بحث کاربر:Doostdar|☎]] سهشنبه،۱۷ بهمن ۱۴۰۲، ساعت ۲۳:۰۵ (ایران) ۶ فوریهٔ ۲۰۲۴، ساعت ۱۹:۳۵ (UTC)
*{{موافق}} فکر کنم ایشان تنها کاربر فعال اینجا باشد. [[کاربر:W7070|W7070]] ([[بحث کاربر:W7070|بحث]]) ۲۰ فوریهٔ ۲۰۲۴، ساعت ۲۰:۳۱ (UTC)
:*{{موافق}} بهترین مدیر برای ویکی نسک (کتاب).
:فعال ترین | دادن دسترسی درست به کاربران درست | زنده نگه داشتن پروژه ویکی نسک||. [[کاربر:Fwldom|Fwldom]] ([[بحث کاربر:Fwldom|بحث]]) ۲۴ فوریهٔ ۲۰۲۴، ساعت ۱۹:۳۲ (UTC)
</div>
== درخواست مدیر شدن، Fwldom ==
<div class="boilerplate" style="background-color: pink; margin: 2em 0 0 0; padding: 0 10px 0 10px; border: 1px dotted #aaa;"><!-- Template:RM top --> ''بحث زیر پایان یافته است، لطفا در آن تغییری ایجاد نکنید. به دلیل داشتن تنها حدود ۴۰۰ ویرایش، عملکرد ضعیف در نوشتن کتابها و استفاده نکردن از دسترسیهای کنونی خود شامل گشتزنی، کاربر مورد نظر شایستگی درخواست دادن برای مدیریت را ندارد. این عمل وی خرابکاری تلقی شده و به مدت ۴۸ ساعت قطع دسترسی میگردد.'' --[[کاربر:Doostdar|دوستدار ایران بزرگ]] [[بحث کاربر:Doostdar|☎]] چهارشنبه،۲۴ مرداد ۱۴۰۳، ساعت ۰۲:۳۶ (ایران) ۱۳ اوت ۲۰۲۴، ساعت ۲۲:۰۶ (UTC)
---------
درود، بنده از کاربران تقاضا دارم برای مدیر شدن بنده رای بدهند.<br>
تا الان 4 تا کتاب در ویکی کتاب نوشتم که یکدونه از آن کامل و برگزیده و خوبیده شده است.<br>
3 تا کتاب دیگه 50 درصد کامل شدند.<br>
امیدوارم بتونم به ارتقاء کیفیت ویکیکتاب کمک کنم.<br>
باسپاس فراوان<br>
[[کاربر:Fwldom|Fwldom]] ([[بحث کاربر:Fwldom|بحث]]) ۱۲ اوت ۲۰۲۴، ساعت ۲۲:۱۶ (UTC)
</div>
==درخواست مدیر شدن، vivairan==
درود. با توجه به فعالیتهایی که برای گسترش محتوای ویکیکتاب انجام دادهام و همان طور که میدانید فعالترین کاربر ویکیکتاب بودهام برای دریافت دسترسی مدیریت این پروژه درخواست میدهم. بنده در بهبود پروژه از نظر کمی و کیفی بسیار کوشیدهام و علاوه بر ایجاد صفحات و کتابهای جدید توانستهام راهنماها، ردهها، الگوها، ... را ویرایش کنم. از این رو برای بهبود محتوای ویکیکتاب و مبارزه با خرابکاریها درخواست مدیریت میدهم. --[[کاربر:Vivairan2|Vivairan2]] ([[بحث کاربر:Vivairan2|بحث]]) ۹ سپتامبر ۲۰۲۶، ساعت ۱۱:۲۵ (UTC)
:* {{مخالف}} درود، به علت تعداد ویرایش کم و مدت زمان کم ایجاد حساب کاربری بنده مخالف هستم.
:[[کاربر:Fwldom|Fwldom]] ([[بحث کاربر:Fwldom|بحث]]) ۱۶ سپتامبر ۲۰۲۶، ساعت ۱۱:۵۳ (UTC)
::نظر شما اشتباه است، بنده بسیار ویرایش کردهام در این ویکی و در توضیحات این درخواست نوشته ام بنده در بهبود پروژه از نظر کمی و کیفی بسیار کوشیدهام. کاربرانی که اینجا میآیند نظر بدهند میتوانند مشاهده کنند بنده چقدر فعال هستم. [[کاربر:Vivairan2|Vivairan2]] ([[بحث کاربر:Vivairan2|بحث]]) ۱۹ سپتامبر ۲۰۲۶، ساعت ۲۳:۱۶ (UTC)
==درخواست مدیر شدن، Fwldom==
درود، گویا ویکیکتاب مدیر فعال ندارد و دارد به انقراض میرود.
با توجه به فعالیتها و مشارکتهایی که در ویکیکتاب فارسی داشتهام، برای دریافت دسترسی مدیریت این پروژه اعلام آمادگی میکنم.
هدف من از درخواست این دسترسی، کمک به نگهداری و توسعهٔ ویکیکتاب، رسیدگی به خرابکاریها، ساماندهی صفحات و انجام کارهایی است که به دسترسی مدیریتی نیاز دارند.
در صورت اعطای دسترسی، تلاش خواهم کرد از ابزارهای مدیریتی با دقت و مطابق سیاستها و اجماع جامعه استفاده کنم و در مواردی که نیاز به تصمیمگیری جمعی باشد، نظر کاربران را در نظر بگیرم.
سوابق ویرایشی و فعالیتهای من برای بررسی در دسترس است و در صورت نیاز آمادهام دربارهٔ سوابق، اهداف و نحوهٔ استفاده از دسترسی مدیریت توضیح بیشتری ارائه کنم. [[کاربر:Fwldom/آمار]]
از کاربران ویکیکتاب درخواست میکنم سوابق و فعالیتهای مرا بررسی کرده و نظر خود را دربارهٔ این درخواست اعلام کنند.
با احترام، --[[کاربر:Fwldom|Fwldom]] ([[بحث کاربر:Fwldom|بحث]]) ۱۶ سپتامبر ۲۰۲۶، ساعت ۱۳:۳۸ (UTC)
opxmr719rrcmbir9s5ki5iybfceadum
ویکیکتاب:وقایع کنونی
4
1476
135049
134421
2026-09-19T17:12:09Z
Vivairan2
28134
135049
wikitext
text/x-wiki
[[پرونده:Ward Cunningham in San Francisco.jpg|بندانگشتی|چپ|وارد کانینگهام، خالق ویکی]]
* اگرچه '''ویکیکتاب''' در سال ۱۳۸۳ آغاز به کار کرد ولی تا سالها بعد فعالیت چندانی نداشت.
* در شهریور ۱۳۸۷ ویکینسک دارای ۹۷۶ کاربر، ۵۵۴ نوشتار، ۱۵۳ پرونده (فایل رسانهای)، ۴ مدیر و ۱ دیوان سالار بود.
* در سال ۱۳۸۸ کاربر [[کاربر:Nojannik|نوژن]] صفحه اصلی ویکیکتاب را طراحی نمود.
* در سال ۱۳۹۰، کتابساز ویکیکتاب ساخته شد.
* به دلیل بیمحتوا و خالی بودن بسیاری از صفحات، مدیران اقدام به حذف چنین صفحاتی کردند.
* در سال ۱۳۹۲، راهنماها و سیاستهای مربوط به ویکیکتاب نوشته شد تا مورد استقبال کاربران قرار گیرد.
* بخش نظرخواهی ویکیکتاب راهاندازی شد تا کاربران بتوانند در تصمیمگیریهای راهبردی مشارکت کنند.
* برگهدان کتابها به ترتیب الفبایی مرتب شد.
* در آذر ۱۳۹۲ [[بحث کاربر:Roozitaa|کاربر Roozitaa]] تمامی صفحهها و کتابها و کتابچههای تا آن زمان ویکیکتاب را ردهبندی نمود.
* در آذر ۱۳۹۲ کاربر vogone از ویکیپدیای آلمانی نزدیک به ۴۰۰ صفحه را که کاربران به آن برچسب حذف زده بودند، حذف کرد. در نتیجه حذف صفحات خرابکاری شده، بی محتوا و بیمعنی، ویکیکتاب یک شبه از جایگاه ۲۴ به جایگاه ۳۴ سقوط کرد.
[[رده:ویکیکتاب]]
* در آذر ۱۳۹۲، [[کاربر:Doostdar]] درخواست مدیریت داد ولی با دو رای مخالف کاربران، با مدیریت او موافقت نشد.
* فهرستبندی موضوعی کتابهای ویکیکتاب انجام گرفت.
* در آغاز بهمن ۱۳۹۲ با گسترش کتاب آشپزی در ویکیکتاب، رتبه آن به بیست و هفتمین ویکیبوک ارتقا یافت.
* در بهمن ۱۳۹۲ با گسترش ویکیکتاب برگهدان الفبایی حذف شده، و برگهدان موضوعی گستردهتر گردید.
* در ۸ بهمن ۱۳۹۲، ویکیکتاب به جایگاه ۲۴ بازگشت و به این ترتیب به جمع ویکیکتابهای بیشتر از ۱۰۰۰ صفحه پیوست.
* در ۱۲ بهمن ۱۳۹۲ ابرابزار در ویکیکتاب فعال شد.
* در ۱۸ بهمن ۱۳۹۲ [[کاربر:Ladsgroup|کاربر Ladsgroup]] توسط کاربران برای مدیریت ویکیکتاب برگزیده شد.
* در ۱۹ بهمن نزدیک به ۷۰ پرونده تصویری که مشکلاتی همچون عدم رعایت حق تکثیر، بی کیفیتی، تکراری بودن داشتند حذف شدند. بدین ترتیب ویکیکتاب فارسی با دارا بودن ۸۱۳ تصویر در شمار ۱۲ ویکیکتاب مصور جهان قرار گرفت.
* در اسفند ۱۳۹۲ ویکیکتاب فارسی، بیستم شد.
* در ۲۰ اسفند ۱۳۹۲ فارسی به منوی جستجوی صفحه اصلی [http://www.wikibooks.org/ ویکیبوک] افزوده شد.
* در شروع سال ۱۳۹۳، ویکیکتاب فارسی ۱۸امین ویکیکتاب جهان است.
* در مرداد ۱۳۹۳ در آستانه دهسالگی ویکیکتاب، [[کاربر:Doostdar]] مدیر شد.
* با ده ساله شدن ویکیکتاب، کاربران صفحه اول و نشانواره ویکیکتاب را تغییر دادند.
* در شهریور ۱۳۹۳ [[کاربر:Doostdar|مدیر Doostdar]] به چند کتاب در ویکیکتاب نشانهای خوبیده و برگزیده داد.
* در هفته کتاب در آبان ماه ۹۳ کاربران کتابهای جدیدشان را به ویکیکتاب هدیه نمودند.
* در آذر ۱۳۹۳، ویکیکتاب فارسی با جا ماندن از ویکیکتاب چکی، به مقام ۱۹ام نزول کرد.
* از ۲۰ اسفند ۱۳۹۳ آمار ویکیکتاب توسط [[کاربر:Mjbmrbot|ربات Mjbmrbot]] به صورت روزانه ثبت گردید.
* در فروردین ۱۳۹۴، ویکیکتاب فارسی ۱۸امین ویکیکتاب جهان است.
* در خرداد ۹۴، تعداد نوشتارها در ویکیکتاب به ۲٬۰۰۰ رسید.
* در خرداد ۹۴، ویکیکتاب فارسی ۱۷امین ویکیکتاب جهان است.
* در شهریور ۹۴، دسترسیهای «گشتزن»، «گشتزن خودکار» و «واگردانی» در ویکیکتاب ایجاد شد. [[کاربر:دوستی بزرگ|کاربر دوستی بزرگ]] اولین کاربر ویکیکتاب بود که دسترسیهای جدید به او اعطا شد.
* در اواخر شهریور ۹۴، صفحات زیرپروژه ویکیسفر پس از اجماع کاربران ویکیکتاب، از ویکیکتاب به پروژه ویکیسفر انتقال یافت.
* در ۱۱ آبان ۹۴، ویکیکتاب فارسی [https://www.wikibooks.org/ روی کره رفت]، اما پس از یک هفته پایین آورده شد.
* در دی ۹۴، تعداد نوشتارها در ویکیکتاب به ۲٬۴۰۰ رسید.
* در اسفند ۹۴، کتابهای برگزیده ویکیکتاب [[ویکیکتاب:کتابهای برگزیده|معرفی شدند]].
* در آذر ۱۳۹۵، ویکیکتاب فارسی همچنان ۱۷امین ویکیکتاب جهان است.
* در اسفند ۱۳۹۵ [[کاربر:Doostdar|مدیر Doostdar]] [[ویکیکتاب:الگوها|الگوهای]] جدیدی در ویکیکتاب ایجاد کرد.
* در فروردین ۱۳۹۶، تعداد نوشتارها در ویکیکتاب به ۲٬۵۰۰ رسید.
* در آبان ۱۳۹۶، تعداد نوشتارها در ویکیکتاب به ۲٬۸۰۰ رسید.
* در دی ۱۳۹۶، ویکیکتاب فارسی ۱۸امین ویکیکتاب جهان است.
* در بهمن ۱۳۹۶ ویکینسک دارای ۱۳٬۸۶۷ کاربر، ۲٬۸۴۳ نوشتار، ۸۴۲ پرونده و ۲ مدیر است.
* در بهمن ۱۳۹۶، به دلایل نامعلومی دو ویکیکتاب کاتالان و ویتنامی، افت جایگاه پیدا کردند و ویکیکتاب فارسی توانست به جایگاه ۱۶ام برسد.
* در مهر ۱۳۹۷، ویکیکتاب فارسی ۱۶امین ویکیکتاب جهان است.
* در ۱۱ دی ۱۳۹۷، ویکیکتاب فارسی [https://www.wikibooks.org/ روی کره رفت]، اما پس از چند ماه پایین آورده شد.
* در فروردین ۱۳۹۸، ویکیکتاب فارسی با جا ماندن از ویکیکتاب آذری، به مقام ۱۷ام نزول کرد.
* در اردیبهشت ۱۳۹۹، تعداد نوشتارها در ویکیکتاب به ۳٬۰۰۰ رسید.
* در مرداد ۱۳۹۹، ویکیکتاب فارسی همچنان ۱۷امین ویکیکتاب جهان است.
* در تیر ۱۴۰۰، تعداد نوشتارها در ویکیکتاب به ۳٬۱۰۰ رسید.
* در مرداد ۱۴۰۰، ویکیکتاب فارسی با جا ماندن از ویکیکتاب ویتنامی، به مقام ۱۸ام نزول کرد.
* در آذر ۱۴۰۰، ویکیکتاب فارسی همچنان ۱۸امین ویکیکتاب جهان است.
* در شهریور ۱۴۰۱، با مدیریت [[کاربر:Doostdar|Doostdar]]، تعداد نوشتارها در ویکیکتاب به ۳٬۲۰۰ رسید.
* در آذر ۱۴۰۱، با مدیریت [[کاربر:Doostdar|Doostdar]]، ویکیکتاب فارسی ۱۶امین ویکیکتاب جهان شد.
* در دی ۱۴۰۲، با مدیریت [[کاربر:Doostdar|Doostdar]]، تعداد نوشتارها در ویکیکتاب به ۳٬۴۰۰ رسید.
* در تیر ۱۴۰۳، ویکیکتاب فارسی همچنان ۱۶امین ویکیکتاب جهان است.
* در مهر ۱۴۰۳، ویکیکتاب فارسی با جا ماندن از ویکیکتاب روسی، به مقام ۱۷ام نزول کرد.
* در اردیبهشت ۱۴۰۴، با مدیریت [[کاربر:Doostdar|Doostdar]]، تعداد نوشتارها در ویکیکتاب به ۳٬۵۰۰ رسید.
* در بهمن ۱۴۰۴، ویکیکتاب فارسی ۱۷امین ویکیکتاب جهان است.
th7j2v0s5jua0o6jvyyd2br2gcc7qx4
135050
135049
2026-09-19T17:15:53Z
Vivairan2
28134
135050
wikitext
text/x-wiki
[[پرونده:Ward Cunningham in San Francisco.jpg|بندانگشتی|چپ|وارد کانینگهام، خالق ویکی]]
* اگرچه '''ویکیکتاب''' در سال ۱۳۸۳ آغاز به کار کرد ولی تا سالها بعد فعالیت چندانی نداشت.
* در شهریور ۱۳۸۷ ویکینسک دارای ۹۷۶ کاربر، ۵۵۴ نوشتار، ۱۵۳ پرونده (فایل رسانهای)، ۴ مدیر و ۱ دیوان سالار بود.
* در سال ۱۳۸۸ کاربر [[کاربر:Nojannik|نوژن]] صفحه اصلی ویکیکتاب را طراحی نمود.
* در سال ۱۳۹۰، کتابساز ویکیکتاب ساخته شد.
* به دلیل بیمحتوا و خالی بودن بسیاری از صفحات، مدیران اقدام به حذف چنین صفحاتی کردند.
* در سال ۱۳۹۲، راهنماها و سیاستهای مربوط به ویکیکتاب نوشته شد تا مورد استقبال کاربران قرار گیرد.
* بخش نظرخواهی ویکیکتاب راهاندازی شد تا کاربران بتوانند در تصمیمگیریهای راهبردی مشارکت کنند.
* برگهدان کتابها به ترتیب الفبایی مرتب شد.
* در آذر ۱۳۹۲ [[بحث کاربر:Roozitaa|کاربر Roozitaa]] تمامی صفحهها و کتابها و کتابچههای تا آن زمان ویکیکتاب را ردهبندی نمود.
* در آذر ۱۳۹۲ کاربر vogone از ویکیپدیای آلمانی نزدیک به ۴۰۰ صفحه را که کاربران به آن برچسب حذف زده بودند، حذف کرد. در نتیجه حذف صفحات خرابکاری شده، بی محتوا و بیمعنی، ویکیکتاب یک شبه از جایگاه ۲۴ به جایگاه ۳۴ سقوط کرد.
[[رده:ویکیکتاب]]
* در آذر ۱۳۹۲، [[کاربر:Doostdar]] درخواست مدیریت داد ولی با دو رای مخالف کاربران، با مدیریت او موافقت نشد.
* فهرستبندی موضوعی کتابهای ویکیکتاب انجام گرفت.
* در آغاز بهمن ۱۳۹۲ با گسترش کتاب آشپزی در ویکیکتاب، رتبه آن به بیست و هفتمین ویکیبوک ارتقا یافت.
* در بهمن ۱۳۹۲ با گسترش ویکیکتاب برگهدان الفبایی حذف شده، و برگهدان موضوعی گستردهتر گردید.
* در ۸ بهمن ۱۳۹۲، ویکیکتاب به جایگاه ۲۴ بازگشت و به این ترتیب به جمع ویکیکتابهای بیشتر از ۱۰۰۰ صفحه پیوست.
* در ۱۲ بهمن ۱۳۹۲ ابرابزار در ویکیکتاب فعال شد.
* در ۱۸ بهمن ۱۳۹۲ [[کاربر:Ladsgroup|کاربر Ladsgroup]] توسط کاربران برای مدیریت ویکیکتاب برگزیده شد.
* در ۱۹ بهمن نزدیک به ۷۰ پرونده تصویری که مشکلاتی همچون عدم رعایت حق تکثیر، بی کیفیتی، تکراری بودن داشتند حذف شدند. بدین ترتیب ویکیکتاب فارسی با دارا بودن ۸۱۳ تصویر در شمار ۱۲ ویکیکتاب مصور جهان قرار گرفت.
* در اسفند ۱۳۹۲ ویکیکتاب فارسی، ۲۰امین ویکیکتاب جهان است.
* در ۲۰ اسفند ۱۳۹۲ فارسی به منوی جستجوی صفحه اصلی [http://www.wikibooks.org/ ویکیبوک] افزوده شد.
* در شروع سال ۱۳۹۳، ویکیکتاب فارسی ۱۸امین ویکیکتاب جهان است.
* در مرداد ۱۳۹۳ در آستانه دهسالگی ویکیکتاب، [[کاربر:Doostdar]] مدیر شد.
* با ده ساله شدن ویکیکتاب، کاربران صفحه اول و نشانواره ویکیکتاب را تغییر دادند.
* در شهریور ۱۳۹۳ [[کاربر:Doostdar|مدیر Doostdar]] به چند کتاب در ویکیکتاب نشانهای خوبیده و برگزیده داد.
* در هفته کتاب در آبان ماه ۹۳ کاربران کتابهای جدیدشان را به ویکیکتاب هدیه نمودند.
* در آذر ۱۳۹۳، ویکیکتاب فارسی با جا ماندن از ویکیکتاب چکی، به مقام ۱۹ام نزول کرد.
* از ۲۰ اسفند ۱۳۹۳ آمار ویکیکتاب توسط [[کاربر:Mjbmrbot|ربات Mjbmrbot]] به صورت روزانه ثبت گردید.
* در فروردین ۱۳۹۴، ویکیکتاب فارسی ۱۸امین ویکیکتاب جهان است.
* در خرداد ۹۴، تعداد نوشتارها در ویکیکتاب به ۲٬۰۰۰ رسید.
* در خرداد ۹۴، ویکیکتاب فارسی ۱۷امین ویکیکتاب جهان است.
* در شهریور ۹۴، دسترسیهای «گشتزن»، «گشتزن خودکار» و «واگردانی» در ویکیکتاب ایجاد شد. [[کاربر:دوستی بزرگ|کاربر دوستی بزرگ]] اولین کاربر ویکیکتاب بود که دسترسیهای جدید به او اعطا شد.
* در اواخر شهریور ۹۴، صفحات زیرپروژه ویکیسفر پس از اجماع کاربران ویکیکتاب، از ویکیکتاب به پروژه ویکیسفر انتقال یافت.
* در ۱۱ آبان ۹۴، ویکیکتاب فارسی [https://www.wikibooks.org/ روی کره رفت]، اما پس از یک هفته پایین آورده شد.
* در دی ۹۴، تعداد نوشتارها در ویکیکتاب به ۲٬۴۰۰ رسید.
* در اسفند ۹۴، کتابهای برگزیده ویکیکتاب [[ویکیکتاب:کتابهای برگزیده|معرفی شدند]].
* در آذر ۱۳۹۵، ویکیکتاب فارسی همچنان ۱۷امین ویکیکتاب جهان است.
* در اسفند ۱۳۹۵ [[کاربر:Doostdar|مدیر Doostdar]] [[ویکیکتاب:الگوها|الگوهای]] جدیدی در ویکیکتاب ایجاد کرد.
* در فروردین ۱۳۹۶، تعداد نوشتارها در ویکیکتاب به ۲٬۵۰۰ رسید.
* در آبان ۱۳۹۶، تعداد نوشتارها در ویکیکتاب به ۲٬۸۰۰ رسید.
* در دی ۱۳۹۶، ویکیکتاب فارسی ۱۸امین ویکیکتاب جهان است.
* در بهمن ۱۳۹۶ ویکینسک دارای ۱۳٬۸۶۷ کاربر، ۲٬۸۴۳ نوشتار، ۸۴۲ پرونده و ۲ مدیر است.
* در بهمن ۱۳۹۶، به دلایل نامعلومی دو ویکیکتاب کاتالان و ویتنامی، افت جایگاه پیدا کردند و ویکیکتاب فارسی توانست به جایگاه ۱۶ام برسد.
* در مهر ۱۳۹۷، ویکیکتاب فارسی ۱۶امین ویکیکتاب جهان است.
* در ۱۱ دی ۱۳۹۷، ویکیکتاب فارسی [https://www.wikibooks.org/ روی کره رفت]، اما پس از چند ماه پایین آورده شد.
* در فروردین ۱۳۹۸، ویکیکتاب فارسی با جا ماندن از ویکیکتاب آذری، به مقام ۱۷ام نزول کرد.
* در اردیبهشت ۱۳۹۹، تعداد نوشتارها در ویکیکتاب به ۳٬۰۰۰ رسید.
* در مرداد ۱۳۹۹، ویکیکتاب فارسی همچنان ۱۷امین ویکیکتاب جهان است.
* در تیر ۱۴۰۰، تعداد نوشتارها در ویکیکتاب به ۳٬۱۰۰ رسید.
* در مرداد ۱۴۰۰، ویکیکتاب فارسی با جا ماندن از ویکیکتاب ویتنامی، به مقام ۱۸ام نزول کرد.
* در آذر ۱۴۰۰، ویکیکتاب فارسی همچنان ۱۸امین ویکیکتاب جهان است.
* در شهریور ۱۴۰۱، با مدیریت [[کاربر:Doostdar|Doostdar]]، تعداد نوشتارها در ویکیکتاب به ۳٬۲۰۰ رسید.
* در آذر ۱۴۰۱، با مدیریت [[کاربر:Doostdar|Doostdar]]، ویکیکتاب فارسی ۱۶امین ویکیکتاب جهان شد.
* در دی ۱۴۰۲، با مدیریت [[کاربر:Doostdar|Doostdar]]، تعداد نوشتارها در ویکیکتاب به ۳٬۴۰۰ رسید.
* در تیر ۱۴۰۳، ویکیکتاب فارسی همچنان ۱۶امین ویکیکتاب جهان است.
* در مهر ۱۴۰۳، ویکیکتاب فارسی با جا ماندن از ویکیکتاب روسی، به مقام ۱۷ام نزول کرد.
* در اردیبهشت ۱۴۰۴، با مدیریت [[کاربر:Doostdar|Doostdar]]، تعداد نوشتارها در ویکیکتاب به ۳٬۵۰۰ رسید.
* در بهمن ۱۴۰۴، ویکیکتاب فارسی ۱۷امین ویکیکتاب جهان است.
pgsog8e32wzmvaugzh2wp6c6zxu23rc
ویکیکتاب:گشتزنان
4
17298
135069
128774
2026-09-20T07:05:55Z
Vivairan2
28134
/* گشتزنی مقالههای تازه */
135069
wikitext
text/x-wiki
== کاربرد ==
مهمترین کاربرد آن جلوگیری از دوبارهکاری است و بازبینی مقالات و صفحهها است.
=== گشتزنی مقالههای تازه ===
{{تصویر چندگانه|align=left|direction=vertical|width=275|image1=ExamplePatrol.JPG|alt1=|caption1=یک مثال برای امکانی که کاربرانِ دارای دسترسی گشتزن در اختیار دارند.|image2=The new pages need patrolle.png|alt2=|caption2=[[ویژه:صفحههای تازه]] که در صفحات گشت نخورده به رنگ زرد نمایش مییابند.}}
اولویت اول گشتزنان، شناسایی صفحههای دارای مشکلات جدی محتوایی از جمله [[ویکیپدیا:صفحه حمله|صفحات حمله]]، ناقض [[ویکیکتاب:حقوق نسخه برداری|حق تکثیر]] و [[ویکیکتاب:خرابکاری|خرابکاری]] و علامتگذاری آنها برای [[ویکیپدیا:معیارهای حذف سریع|حذف سریع]] است. فراتر از آن، گشتزنان باید بررسی کنند که آیا مقالات مطابق با رهنمودها و [[ویکیپدیا:شیوهنامه|شیوهنامه]] هستند یا خیر. مقالاتی که نامناسب تشخیص داده میشوند باید بسته به شرایطشان، برای حذف سریع یا [[ویکیکتاب:سیاست حذف|زماندار]] نامزد یا در [[ویکیپدیا:سیاست حذف#آمایشگاه|شرایط خاص]]، برای بهبود به [[ویکیپدیا:پیشنویسها|فضای نام پیشنویس]] منتقل شوند. بهجز در موارد جدی محتوایی، نیاز به اقدام سریع در قبال مقالهها وجود ندارد و قبل از انجام اقدامات بیشتر، نیاز است که به ایجادکننده برای بهبود مقاله فرصت داده شود. مشکلات موجود در مقاله باید بهوسیله اعلان یا برچسبهای تعمیر و نگهداری به کاربر سازنده اطلاع داده شوند و اگر بهبودی در مقاله صورت نگرفت، انتقال مقاله به فضای پیشنویس [[ویکیپدیا:سیاست حذف#آمایشگاه|در مواردی]] ممکن است مفید باشد. با این حال باید توجه کرد که انتقال به «پیشنویس» جایگزینی برای فرایند حذف نیست.
اگر مقالهای بهتازگی ایجاد شود، در پایین آن چیزی مشابه زیر دیده خواهد شد (فقط کاربران دارای دسترسی گشتزن میتوانند آن را در صفحات جدید ببینند):<div class="patrollink"><nowiki>[</nowiki> <span class="plainlinks">[{{SERVER}}{{localurl:ویکیپدیاگشت|action=markpatrolled}} به این صفحه برچسب گشت بزن]</span> <nowiki>]</nowiki></div>
در صورتی که کاربرانِ دارای دسترسی گشتزن مقالههای گشت نخوردهٔ موجود در [[ویژه:NewPages|فهرست صفحات جدید]] را گشت بزنند رنگ این مقالهها از زرد، به سفید تغییر میکند. همچنین [//fa.wikipedia.org/w/index.php?title=ویژه:صفحههای_تازه&hidepatrolled=1 پالایه صفحههای گشت نخورده جدید] برای بررسی سادهتر این صفحات وجود دارد.
=== گشتزنی ویرایشها ===
دسترسی گشتزن، راهی برای فهمیدن اینکه ویرایشی صحیح بوده یا خیر و مبارزه با خرابکاری و فیلتر کردن اسپمهاست. ویرایشهای گشت نخورده در [[ویژه:تغییرات اخیر|تغییرات اخیر]] با علامت <span class="unpatrolled">!</span> مشخص شدهاند؛ اگر ویرایشی صحیح و مناسب بود، میتوان آن را به «گشت خورده»<sup>patrolled</sup> علامت زد، این عمل باعث میشود آن ویرایش به حالت بدون علامت <span class="unpatrolled">!</span> تغییر کند. در این حالت، دیگران متوجه صحیح بودن آن ویرایش خواهند شد.
بهطور معمول ویرایشهایی گشت میخورند که با سیاستها و رهنمودها مطابقت داشته یا مصداق کامل خرابکاری نباشد. در صفحهٔ تغییرات اخیر، یک ویرایش بازبینینشده شبیه این است:[[پرونده:Patrolled Unpatrolled.PNG|thumb|305x305px|ویرایشهای جدید گشتخورده سفید و ویرایشهای جدید گشتنخورده و مشکوک نارنجی دیده میشوند.]]
* (<span class="plainlinks">[{{SERVER}}{{localurl:Help:Patrolled edit|curid=۱۷۰۰۰|diff=۰|oldid=۰}} تفاوت]</span>) (<span class="plainlinks">[{{SERVER}}{{localurl:Help:Patrolled edit|curid=۴|action=history}} تاریخچه]</span>).. <span class="unpatrolled">!</span> [[راهنما:ویرایش گشتنخورده]]؛ ۲۳:۲۸ .. [[کاربر:فلانی|فلانی]] ([[بحث کاربر:فلانی|بحث]])
:در حالی که بازبینیشده بدین صورت خواهد بود:
* (<span class="plainlinks">[{{SERVER}}{{localurl:Help:Patrolled edit|curid=۱۷۰۰۰|diff=۰|oldid=۰}} تفاوت]</span>) (<span class="plainlinks">[{{SERVER}}{{localurl:Help:Patrolled edit|curid=۴|action=history}} تاریخچه]</span>).. [[راهنما:ویرایش گشتخورده]]: ۲۳:۲۸ .. [[کاربر:فلانی|فلانی]] ([[بحث کاربر:فلانی|بحث]])
== نکات دیگر ==
* فهرست کاربران دارای دسترسی گشت را در میتوانید ببنید.
* فعالیتهای گشت زنی را در [[ویژه:Log/patrol|اینجا]] میتوانید ببنید.
* صفحات ایجاد شده توسط مدیران و رباتها و همچنین کاربران دارای دسترسی گشت خودکار، به طور خودکار حالت بازبینی شده میگیرند.
* افراد دارای دسترسی گشت توانایی بازبینی کردن صفحاتی که خودشان ایجاد کردهاند ندارند.
* افراد دارای دسترسی گشت میتوانند ویرایشهای بازبینی شده را از نظر خودشان در [[ویژه:RecentChanges|تغییرات اخیر]] پنهان کنند.
* برای درخواست این دسترسی، از مدیران ویکیکتاب درخواست کنید.
=== بازپسگیری دسترسی گشتزن ===
در صورتی که کاربر دسترسی گشت خودکار را از دست داد دسترسی گشتزن نیز از وی گرفته شود.
=== چه صفحههایی باید برچسب گشتزن بخورند ===
* تمام صفحههایی که برچسب {{الگو|حذف سریع}} خوردهاند باید برچسب گشتزن بخورند، تا وقت گشت زنهای دیگر برای بازبینی گرفته نشود.
* صفحههایی که برای ویکیپدیا مناسب هستند یعنی استانداردهای مقالهنویسی را دارا هستند.
=== چه صفحههایی نباید برچسب گشتزن بخورند ===
* صفحههایی که در مورد وضعیت آنها مطمئن نیستید و نیازمند به نظر دیگر کاربرها هست.
* صفحههایی که دارای برچسب حذف سریع نیستند ولی موضوع آنها مهم است.
[[رده:دسترسیهای کاربری ویکی کتاب]]
ilp260hk5hpu7jjfodoamn3wwni29nn
135070
135069
2026-09-20T07:07:15Z
Vivairan2
28134
/* گشتزنی مقالههای تازه */
135070
wikitext
text/x-wiki
== کاربرد ==
مهمترین کاربرد آن جلوگیری از دوبارهکاری است و بازبینی مقالات و صفحهها است.
=== گشتزنی مقالههای تازه ===
{{تصویر چندگانه|align=left|direction=vertical|width=275|image1=ExamplePatrol.JPG|alt1=|caption1=یک مثال برای امکانی که کاربرانِ دارای دسترسی گشتزن در اختیار دارند.|image2=The new pages need patrolle.png|alt2=|caption2=[[ویژه:صفحههای تازه]] که در صفحات گشت نخورده به رنگ زرد نمایش مییابند.}}
اولویت اول گشتزنان، شناسایی صفحههای دارای مشکلات جدی محتوایی از جمله [[ویکیپدیا:صفحه حمله|صفحات حمله]]، ناقض [[ویکیکتاب:حقوق نسخه برداری|حق تکثیر]] و [[ویکیکتاب:خرابکاری|خرابکاری]] و علامتگذاری آنها برای [[ویکیکتاب:معیارهای حذف سریع|حذف سریع]] است. فراتر از آن، گشتزنان باید بررسی کنند که آیا مقالات مطابق با رهنمودها و [[ویکیپدیا:شیوهنامه|شیوهنامه]] هستند یا خیر. مقالاتی که نامناسب تشخیص داده میشوند باید بسته به شرایطشان، برای حذف سریع یا [[ویکیکتاب:سیاست حذف|زماندار]] نامزد یا در [[ویکیپدیا:سیاست حذف#آمایشگاه|شرایط خاص]]، برای بهبود به [[ویکیپدیا:پیشنویسها|فضای نام پیشنویس]] منتقل شوند. بهجز در موارد جدی محتوایی، نیاز به اقدام سریع در قبال مقالهها وجود ندارد و قبل از انجام اقدامات بیشتر، نیاز است که به ایجادکننده برای بهبود مقاله فرصت داده شود. مشکلات موجود در مقاله باید بهوسیله اعلان یا برچسبهای تعمیر و نگهداری به کاربر سازنده اطلاع داده شوند و اگر بهبودی در مقاله صورت نگرفت، انتقال مقاله به فضای پیشنویس [[ویکیپدیا:سیاست حذف#آمایشگاه|در مواردی]] ممکن است مفید باشد. با این حال باید توجه کرد که انتقال به «پیشنویس» جایگزینی برای فرایند حذف نیست.
اگر مقالهای بهتازگی ایجاد شود، در پایین آن چیزی مشابه زیر دیده خواهد شد (فقط کاربران دارای دسترسی گشتزن میتوانند آن را در صفحات جدید ببینند):<div class="patrollink"><nowiki>[</nowiki> <span class="plainlinks">[{{SERVER}}{{localurl:ویکیپدیاگشت|action=markpatrolled}} به این صفحه برچسب گشت بزن]</span> <nowiki>]</nowiki></div>
در صورتی که کاربرانِ دارای دسترسی گشتزن مقالههای گشت نخوردهٔ موجود در [[ویژه:NewPages|فهرست صفحات جدید]] را گشت بزنند رنگ این مقالهها از زرد، به سفید تغییر میکند. همچنین [//fa.wikipedia.org/w/index.php?title=ویژه:صفحههای_تازه&hidepatrolled=1 پالایه صفحههای گشت نخورده جدید] برای بررسی سادهتر این صفحات وجود دارد.
=== گشتزنی ویرایشها ===
دسترسی گشتزن، راهی برای فهمیدن اینکه ویرایشی صحیح بوده یا خیر و مبارزه با خرابکاری و فیلتر کردن اسپمهاست. ویرایشهای گشت نخورده در [[ویژه:تغییرات اخیر|تغییرات اخیر]] با علامت <span class="unpatrolled">!</span> مشخص شدهاند؛ اگر ویرایشی صحیح و مناسب بود، میتوان آن را به «گشت خورده»<sup>patrolled</sup> علامت زد، این عمل باعث میشود آن ویرایش به حالت بدون علامت <span class="unpatrolled">!</span> تغییر کند. در این حالت، دیگران متوجه صحیح بودن آن ویرایش خواهند شد.
بهطور معمول ویرایشهایی گشت میخورند که با سیاستها و رهنمودها مطابقت داشته یا مصداق کامل خرابکاری نباشد. در صفحهٔ تغییرات اخیر، یک ویرایش بازبینینشده شبیه این است:[[پرونده:Patrolled Unpatrolled.PNG|thumb|305x305px|ویرایشهای جدید گشتخورده سفید و ویرایشهای جدید گشتنخورده و مشکوک نارنجی دیده میشوند.]]
* (<span class="plainlinks">[{{SERVER}}{{localurl:Help:Patrolled edit|curid=۱۷۰۰۰|diff=۰|oldid=۰}} تفاوت]</span>) (<span class="plainlinks">[{{SERVER}}{{localurl:Help:Patrolled edit|curid=۴|action=history}} تاریخچه]</span>).. <span class="unpatrolled">!</span> [[راهنما:ویرایش گشتنخورده]]؛ ۲۳:۲۸ .. [[کاربر:فلانی|فلانی]] ([[بحث کاربر:فلانی|بحث]])
:در حالی که بازبینیشده بدین صورت خواهد بود:
* (<span class="plainlinks">[{{SERVER}}{{localurl:Help:Patrolled edit|curid=۱۷۰۰۰|diff=۰|oldid=۰}} تفاوت]</span>) (<span class="plainlinks">[{{SERVER}}{{localurl:Help:Patrolled edit|curid=۴|action=history}} تاریخچه]</span>).. [[راهنما:ویرایش گشتخورده]]: ۲۳:۲۸ .. [[کاربر:فلانی|فلانی]] ([[بحث کاربر:فلانی|بحث]])
== نکات دیگر ==
* فهرست کاربران دارای دسترسی گشت را در میتوانید ببنید.
* فعالیتهای گشت زنی را در [[ویژه:Log/patrol|اینجا]] میتوانید ببنید.
* صفحات ایجاد شده توسط مدیران و رباتها و همچنین کاربران دارای دسترسی گشت خودکار، به طور خودکار حالت بازبینی شده میگیرند.
* افراد دارای دسترسی گشت توانایی بازبینی کردن صفحاتی که خودشان ایجاد کردهاند ندارند.
* افراد دارای دسترسی گشت میتوانند ویرایشهای بازبینی شده را از نظر خودشان در [[ویژه:RecentChanges|تغییرات اخیر]] پنهان کنند.
* برای درخواست این دسترسی، از مدیران ویکیکتاب درخواست کنید.
=== بازپسگیری دسترسی گشتزن ===
در صورتی که کاربر دسترسی گشت خودکار را از دست داد دسترسی گشتزن نیز از وی گرفته شود.
=== چه صفحههایی باید برچسب گشتزن بخورند ===
* تمام صفحههایی که برچسب {{الگو|حذف سریع}} خوردهاند باید برچسب گشتزن بخورند، تا وقت گشت زنهای دیگر برای بازبینی گرفته نشود.
* صفحههایی که برای ویکیپدیا مناسب هستند یعنی استانداردهای مقالهنویسی را دارا هستند.
=== چه صفحههایی نباید برچسب گشتزن بخورند ===
* صفحههایی که در مورد وضعیت آنها مطمئن نیستید و نیازمند به نظر دیگر کاربرها هست.
* صفحههایی که دارای برچسب حذف سریع نیستند ولی موضوع آنها مهم است.
[[رده:دسترسیهای کاربری ویکی کتاب]]
ibx75lssdjvcq5wygy4jvc08u1dn4q2
135071
135070
2026-09-20T07:08:58Z
Vivairan2
28134
/* گشتزنی مقالههای تازه */
135071
wikitext
text/x-wiki
== کاربرد ==
مهمترین کاربرد آن جلوگیری از دوبارهکاری است و بازبینی مقالات و صفحهها است.
=== گشتزنی مقالههای تازه ===
{{تصویر چندگانه|align=left|direction=vertical|width=275|image1=ExamplePatrol.JPG|alt1=|caption1=یک مثال برای امکانی که کاربرانِ دارای دسترسی گشتزن در اختیار دارند.|image2=The new pages need patrolle.png|alt2=|caption2=[[ویژه:صفحههای تازه]] که در صفحات گشت نخورده به رنگ زرد نمایش مییابند.}}
اولویت اول گشتزنان، شناسایی صفحههای دارای مشکلات جدی محتوایی از جمله [[ویکیپدیا:صفحه حمله|صفحات حمله]]، ناقض [[ویکیکتاب:حقوق نسخه برداری|حق تکثیر]] و [[ویکیکتاب:خرابکاری|خرابکاری]] و علامتگذاری آنها برای [[ویکیکتاب:معیارهای حذف سریع|حذف سریع]] است. فراتر از آن، گشتزنان باید بررسی کنند که آیا مقالات مطابق با رهنمودها و [[ویکیپدیا:شیوهنامه|شیوهنامه]] هستند یا خیر. مقالاتی که نامناسب تشخیص داده میشوند باید بسته به شرایطشان، برای حذف سریع یا [[ویکیکتاب:سیاست حذف|زماندار]] نامزد یا در [[ویکیکتاب:سیاست حذف|شرایط خاص]]، برای بهبود به [[ویکیپدیا:پیشنویسها|فضای نام پیشنویس]] منتقل شوند. بهجز در موارد جدی محتوایی، نیاز به اقدام سریع در قبال مقالهها وجود ندارد و قبل از انجام اقدامات بیشتر، نیاز است که به ایجادکننده برای بهبود مقاله فرصت داده شود. مشکلات موجود در مقاله باید بهوسیله اعلان یا برچسبهای تعمیر و نگهداری به کاربر سازنده اطلاع داده شوند و اگر بهبودی در مقاله صورت نگرفت، انتقال مقاله به فضای پیشنویس [[ویکیکتاب:سیاست حذف|در مواردی]] ممکن است مفید باشد. با این حال باید توجه کرد که انتقال به «پیشنویس» جایگزینی برای فرایند حذف نیست.
اگر مقالهای بهتازگی ایجاد شود، در پایین آن چیزی مشابه زیر دیده خواهد شد (فقط کاربران دارای دسترسی گشتزن میتوانند آن را در صفحات جدید ببینند):<div class="patrollink"><nowiki>[</nowiki> <span class="plainlinks">[{{SERVER}}{{localurl:ویکیپدیاگشت|action=markpatrolled}} به این صفحه برچسب گشت بزن]</span> <nowiki>]</nowiki></div>
در صورتی که کاربرانِ دارای دسترسی گشتزن مقالههای گشت نخوردهٔ موجود در [[ویژه:NewPages|فهرست صفحات جدید]] را گشت بزنند رنگ این مقالهها از زرد، به سفید تغییر میکند. همچنین [//fa.wikipedia.org/w/index.php?title=ویژه:صفحههای_تازه&hidepatrolled=1 پالایه صفحههای گشت نخورده جدید] برای بررسی سادهتر این صفحات وجود دارد.
=== گشتزنی ویرایشها ===
دسترسی گشتزن، راهی برای فهمیدن اینکه ویرایشی صحیح بوده یا خیر و مبارزه با خرابکاری و فیلتر کردن اسپمهاست. ویرایشهای گشت نخورده در [[ویژه:تغییرات اخیر|تغییرات اخیر]] با علامت <span class="unpatrolled">!</span> مشخص شدهاند؛ اگر ویرایشی صحیح و مناسب بود، میتوان آن را به «گشت خورده»<sup>patrolled</sup> علامت زد، این عمل باعث میشود آن ویرایش به حالت بدون علامت <span class="unpatrolled">!</span> تغییر کند. در این حالت، دیگران متوجه صحیح بودن آن ویرایش خواهند شد.
بهطور معمول ویرایشهایی گشت میخورند که با سیاستها و رهنمودها مطابقت داشته یا مصداق کامل خرابکاری نباشد. در صفحهٔ تغییرات اخیر، یک ویرایش بازبینینشده شبیه این است:[[پرونده:Patrolled Unpatrolled.PNG|thumb|305x305px|ویرایشهای جدید گشتخورده سفید و ویرایشهای جدید گشتنخورده و مشکوک نارنجی دیده میشوند.]]
* (<span class="plainlinks">[{{SERVER}}{{localurl:Help:Patrolled edit|curid=۱۷۰۰۰|diff=۰|oldid=۰}} تفاوت]</span>) (<span class="plainlinks">[{{SERVER}}{{localurl:Help:Patrolled edit|curid=۴|action=history}} تاریخچه]</span>).. <span class="unpatrolled">!</span> [[راهنما:ویرایش گشتنخورده]]؛ ۲۳:۲۸ .. [[کاربر:فلانی|فلانی]] ([[بحث کاربر:فلانی|بحث]])
:در حالی که بازبینیشده بدین صورت خواهد بود:
* (<span class="plainlinks">[{{SERVER}}{{localurl:Help:Patrolled edit|curid=۱۷۰۰۰|diff=۰|oldid=۰}} تفاوت]</span>) (<span class="plainlinks">[{{SERVER}}{{localurl:Help:Patrolled edit|curid=۴|action=history}} تاریخچه]</span>).. [[راهنما:ویرایش گشتخورده]]: ۲۳:۲۸ .. [[کاربر:فلانی|فلانی]] ([[بحث کاربر:فلانی|بحث]])
== نکات دیگر ==
* فهرست کاربران دارای دسترسی گشت را در میتوانید ببنید.
* فعالیتهای گشت زنی را در [[ویژه:Log/patrol|اینجا]] میتوانید ببنید.
* صفحات ایجاد شده توسط مدیران و رباتها و همچنین کاربران دارای دسترسی گشت خودکار، به طور خودکار حالت بازبینی شده میگیرند.
* افراد دارای دسترسی گشت توانایی بازبینی کردن صفحاتی که خودشان ایجاد کردهاند ندارند.
* افراد دارای دسترسی گشت میتوانند ویرایشهای بازبینی شده را از نظر خودشان در [[ویژه:RecentChanges|تغییرات اخیر]] پنهان کنند.
* برای درخواست این دسترسی، از مدیران ویکیکتاب درخواست کنید.
=== بازپسگیری دسترسی گشتزن ===
در صورتی که کاربر دسترسی گشت خودکار را از دست داد دسترسی گشتزن نیز از وی گرفته شود.
=== چه صفحههایی باید برچسب گشتزن بخورند ===
* تمام صفحههایی که برچسب {{الگو|حذف سریع}} خوردهاند باید برچسب گشتزن بخورند، تا وقت گشت زنهای دیگر برای بازبینی گرفته نشود.
* صفحههایی که برای ویکیپدیا مناسب هستند یعنی استانداردهای مقالهنویسی را دارا هستند.
=== چه صفحههایی نباید برچسب گشتزن بخورند ===
* صفحههایی که در مورد وضعیت آنها مطمئن نیستید و نیازمند به نظر دیگر کاربرها هست.
* صفحههایی که دارای برچسب حذف سریع نیستند ولی موضوع آنها مهم است.
[[رده:دسترسیهای کاربری ویکی کتاب]]
2he2rtopct8qi06p3jiur1guuagtyu6
135072
135071
2026-09-20T07:10:05Z
Vivairan2
28134
/* گشتزنی مقالههای تازه */
135072
wikitext
text/x-wiki
== کاربرد ==
مهمترین کاربرد آن جلوگیری از دوبارهکاری است و بازبینی مقالات و صفحهها است.
=== گشتزنی مقالههای تازه ===
{{تصویر چندگانه|align=left|direction=vertical|width=275|image1=ExamplePatrol.JPG|alt1=|caption1=یک مثال برای امکانی که کاربرانِ دارای دسترسی گشتزن در اختیار دارند.|image2=The new pages need patrolle.png|alt2=|caption2=[[ویژه:صفحههای تازه]] که در صفحات گشت نخورده به رنگ زرد نمایش مییابند.}}
اولویت اول گشتزنان، شناسایی صفحههای دارای مشکلات جدی محتوایی از جمله [[ویکیپدیا:صفحه حمله|صفحات حمله]]، ناقض [[ویکیکتاب:حقوق نسخه برداری|حق تکثیر]] و [[ویکیکتاب:خرابکاری|خرابکاری]] و علامتگذاری آنها برای [[ویکیکتاب:معیارهای حذف سریع|حذف سریع]] است. فراتر از آن، گشتزنان باید بررسی کنند که آیا مقالات مطابق با رهنمودها و [[ویکیکتاب:شیوهنامه|شیوهنامه]] هستند یا خیر. مقالاتی که نامناسب تشخیص داده میشوند باید بسته به شرایطشان، برای حذف سریع یا [[ویکیکتاب:سیاست حذف|زماندار]] نامزد یا در [[ویکیکتاب:سیاست حذف|شرایط خاص]]، برای بهبود به [[ویکیپدیا:پیشنویسها|فضای نام پیشنویس]] منتقل شوند. بهجز در موارد جدی محتوایی، نیاز به اقدام سریع در قبال مقالهها وجود ندارد و قبل از انجام اقدامات بیشتر، نیاز است که به ایجادکننده برای بهبود مقاله فرصت داده شود. مشکلات موجود در مقاله باید بهوسیله اعلان یا برچسبهای تعمیر و نگهداری به کاربر سازنده اطلاع داده شوند و اگر بهبودی در مقاله صورت نگرفت، انتقال مقاله به فضای پیشنویس [[ویکیکتاب:سیاست حذف|در مواردی]] ممکن است مفید باشد. با این حال باید توجه کرد که انتقال به «پیشنویس» جایگزینی برای فرایند حذف نیست.
اگر مقالهای بهتازگی ایجاد شود، در پایین آن چیزی مشابه زیر دیده خواهد شد (فقط کاربران دارای دسترسی گشتزن میتوانند آن را در صفحات جدید ببینند):<div class="patrollink"><nowiki>[</nowiki> <span class="plainlinks">[{{SERVER}}{{localurl:ویکیپدیاگشت|action=markpatrolled}} به این صفحه برچسب گشت بزن]</span> <nowiki>]</nowiki></div>
در صورتی که کاربرانِ دارای دسترسی گشتزن مقالههای گشت نخوردهٔ موجود در [[ویژه:NewPages|فهرست صفحات جدید]] را گشت بزنند رنگ این مقالهها از زرد، به سفید تغییر میکند. همچنین [//fa.wikipedia.org/w/index.php?title=ویژه:صفحههای_تازه&hidepatrolled=1 پالایه صفحههای گشت نخورده جدید] برای بررسی سادهتر این صفحات وجود دارد.
=== گشتزنی ویرایشها ===
دسترسی گشتزن، راهی برای فهمیدن اینکه ویرایشی صحیح بوده یا خیر و مبارزه با خرابکاری و فیلتر کردن اسپمهاست. ویرایشهای گشت نخورده در [[ویژه:تغییرات اخیر|تغییرات اخیر]] با علامت <span class="unpatrolled">!</span> مشخص شدهاند؛ اگر ویرایشی صحیح و مناسب بود، میتوان آن را به «گشت خورده»<sup>patrolled</sup> علامت زد، این عمل باعث میشود آن ویرایش به حالت بدون علامت <span class="unpatrolled">!</span> تغییر کند. در این حالت، دیگران متوجه صحیح بودن آن ویرایش خواهند شد.
بهطور معمول ویرایشهایی گشت میخورند که با سیاستها و رهنمودها مطابقت داشته یا مصداق کامل خرابکاری نباشد. در صفحهٔ تغییرات اخیر، یک ویرایش بازبینینشده شبیه این است:[[پرونده:Patrolled Unpatrolled.PNG|thumb|305x305px|ویرایشهای جدید گشتخورده سفید و ویرایشهای جدید گشتنخورده و مشکوک نارنجی دیده میشوند.]]
* (<span class="plainlinks">[{{SERVER}}{{localurl:Help:Patrolled edit|curid=۱۷۰۰۰|diff=۰|oldid=۰}} تفاوت]</span>) (<span class="plainlinks">[{{SERVER}}{{localurl:Help:Patrolled edit|curid=۴|action=history}} تاریخچه]</span>).. <span class="unpatrolled">!</span> [[راهنما:ویرایش گشتنخورده]]؛ ۲۳:۲۸ .. [[کاربر:فلانی|فلانی]] ([[بحث کاربر:فلانی|بحث]])
:در حالی که بازبینیشده بدین صورت خواهد بود:
* (<span class="plainlinks">[{{SERVER}}{{localurl:Help:Patrolled edit|curid=۱۷۰۰۰|diff=۰|oldid=۰}} تفاوت]</span>) (<span class="plainlinks">[{{SERVER}}{{localurl:Help:Patrolled edit|curid=۴|action=history}} تاریخچه]</span>).. [[راهنما:ویرایش گشتخورده]]: ۲۳:۲۸ .. [[کاربر:فلانی|فلانی]] ([[بحث کاربر:فلانی|بحث]])
== نکات دیگر ==
* فهرست کاربران دارای دسترسی گشت را در میتوانید ببنید.
* فعالیتهای گشت زنی را در [[ویژه:Log/patrol|اینجا]] میتوانید ببنید.
* صفحات ایجاد شده توسط مدیران و رباتها و همچنین کاربران دارای دسترسی گشت خودکار، به طور خودکار حالت بازبینی شده میگیرند.
* افراد دارای دسترسی گشت توانایی بازبینی کردن صفحاتی که خودشان ایجاد کردهاند ندارند.
* افراد دارای دسترسی گشت میتوانند ویرایشهای بازبینی شده را از نظر خودشان در [[ویژه:RecentChanges|تغییرات اخیر]] پنهان کنند.
* برای درخواست این دسترسی، از مدیران ویکیکتاب درخواست کنید.
=== بازپسگیری دسترسی گشتزن ===
در صورتی که کاربر دسترسی گشت خودکار را از دست داد دسترسی گشتزن نیز از وی گرفته شود.
=== چه صفحههایی باید برچسب گشتزن بخورند ===
* تمام صفحههایی که برچسب {{الگو|حذف سریع}} خوردهاند باید برچسب گشتزن بخورند، تا وقت گشت زنهای دیگر برای بازبینی گرفته نشود.
* صفحههایی که برای ویکیپدیا مناسب هستند یعنی استانداردهای مقالهنویسی را دارا هستند.
=== چه صفحههایی نباید برچسب گشتزن بخورند ===
* صفحههایی که در مورد وضعیت آنها مطمئن نیستید و نیازمند به نظر دیگر کاربرها هست.
* صفحههایی که دارای برچسب حذف سریع نیستند ولی موضوع آنها مهم است.
[[رده:دسترسیهای کاربری ویکی کتاب]]
02xl0iqg89q6fgcbre52qzu66piifpu
135076
135072
2026-09-20T07:22:33Z
Vivairan2
28134
/* گشتزنی مقالههای تازه */
135076
wikitext
text/x-wiki
== کاربرد ==
مهمترین کاربرد آن جلوگیری از دوبارهکاری است و بازبینی مقالات و صفحهها است.
=== گشتزنی مقالههای تازه ===
{{تصویر چندگانه|align=left|direction=vertical|width=275|image1=ExamplePatrol.JPG|alt1=|caption1=یک مثال برای امکانی که کاربرانِ دارای دسترسی گشتزن در اختیار دارند.|image2=The new pages need patrolle.png|alt2=|caption2=[[ویژه:صفحههای تازه]] که در صفحات گشت نخورده به رنگ زرد نمایش مییابند.}}
اولویت اول گشتزنان، شناسایی صفحههای دارای مشکلات جدی محتوایی از جمله [[ویکیکتاب:صفحه حمله|صفحات حمله]]، ناقض [[ویکیکتاب:حقوق نسخه برداری|حق تکثیر]] و [[ویکیکتاب:خرابکاری|خرابکاری]] و علامتگذاری آنها برای [[ویکیکتاب:معیارهای حذف سریع|حذف سریع]] است. فراتر از آن، گشتزنان باید بررسی کنند که آیا مقالات مطابق با رهنمودها و [[ویکیکتاب:شیوهنامه|شیوهنامه]] هستند یا خیر. مقالاتی که نامناسب تشخیص داده میشوند باید بسته به شرایطشان، برای حذف سریع یا [[ویکیکتاب:سیاست حذف|زماندار]] نامزد یا در [[ویکیکتاب:سیاست حذف|شرایط خاص]]، برای بهبود به [[ویکیپدیا:پیشنویسها|فضای نام پیشنویس]] منتقل شوند. بهجز در موارد جدی محتوایی، نیاز به اقدام سریع در قبال مقالهها وجود ندارد و قبل از انجام اقدامات بیشتر، نیاز است که به ایجادکننده برای بهبود مقاله فرصت داده شود. مشکلات موجود در مقاله باید بهوسیله اعلان یا برچسبهای تعمیر و نگهداری به کاربر سازنده اطلاع داده شوند و اگر بهبودی در مقاله صورت نگرفت، انتقال مقاله به فضای پیشنویس [[ویکیکتاب:سیاست حذف|در مواردی]] ممکن است مفید باشد. با این حال باید توجه کرد که انتقال به «پیشنویس» جایگزینی برای فرایند حذف نیست.
اگر مقالهای بهتازگی ایجاد شود، در پایین آن چیزی مشابه زیر دیده خواهد شد (فقط کاربران دارای دسترسی گشتزن میتوانند آن را در صفحات جدید ببینند):<div class="patrollink"><nowiki>[</nowiki> <span class="plainlinks">[{{SERVER}}{{localurl:ویکیپدیاگشت|action=markpatrolled}} به این صفحه برچسب گشت بزن]</span> <nowiki>]</nowiki></div>
در صورتی که کاربرانِ دارای دسترسی گشتزن مقالههای گشت نخوردهٔ موجود در [[ویژه:NewPages|فهرست صفحات جدید]] را گشت بزنند رنگ این مقالهها از زرد، به سفید تغییر میکند. همچنین [//fa.wikipedia.org/w/index.php?title=ویژه:صفحههای_تازه&hidepatrolled=1 پالایه صفحههای گشت نخورده جدید] برای بررسی سادهتر این صفحات وجود دارد.
=== گشتزنی ویرایشها ===
دسترسی گشتزن، راهی برای فهمیدن اینکه ویرایشی صحیح بوده یا خیر و مبارزه با خرابکاری و فیلتر کردن اسپمهاست. ویرایشهای گشت نخورده در [[ویژه:تغییرات اخیر|تغییرات اخیر]] با علامت <span class="unpatrolled">!</span> مشخص شدهاند؛ اگر ویرایشی صحیح و مناسب بود، میتوان آن را به «گشت خورده»<sup>patrolled</sup> علامت زد، این عمل باعث میشود آن ویرایش به حالت بدون علامت <span class="unpatrolled">!</span> تغییر کند. در این حالت، دیگران متوجه صحیح بودن آن ویرایش خواهند شد.
بهطور معمول ویرایشهایی گشت میخورند که با سیاستها و رهنمودها مطابقت داشته یا مصداق کامل خرابکاری نباشد. در صفحهٔ تغییرات اخیر، یک ویرایش بازبینینشده شبیه این است:[[پرونده:Patrolled Unpatrolled.PNG|thumb|305x305px|ویرایشهای جدید گشتخورده سفید و ویرایشهای جدید گشتنخورده و مشکوک نارنجی دیده میشوند.]]
* (<span class="plainlinks">[{{SERVER}}{{localurl:Help:Patrolled edit|curid=۱۷۰۰۰|diff=۰|oldid=۰}} تفاوت]</span>) (<span class="plainlinks">[{{SERVER}}{{localurl:Help:Patrolled edit|curid=۴|action=history}} تاریخچه]</span>).. <span class="unpatrolled">!</span> [[راهنما:ویرایش گشتنخورده]]؛ ۲۳:۲۸ .. [[کاربر:فلانی|فلانی]] ([[بحث کاربر:فلانی|بحث]])
:در حالی که بازبینیشده بدین صورت خواهد بود:
* (<span class="plainlinks">[{{SERVER}}{{localurl:Help:Patrolled edit|curid=۱۷۰۰۰|diff=۰|oldid=۰}} تفاوت]</span>) (<span class="plainlinks">[{{SERVER}}{{localurl:Help:Patrolled edit|curid=۴|action=history}} تاریخچه]</span>).. [[راهنما:ویرایش گشتخورده]]: ۲۳:۲۸ .. [[کاربر:فلانی|فلانی]] ([[بحث کاربر:فلانی|بحث]])
== نکات دیگر ==
* فهرست کاربران دارای دسترسی گشت را در میتوانید ببنید.
* فعالیتهای گشت زنی را در [[ویژه:Log/patrol|اینجا]] میتوانید ببنید.
* صفحات ایجاد شده توسط مدیران و رباتها و همچنین کاربران دارای دسترسی گشت خودکار، به طور خودکار حالت بازبینی شده میگیرند.
* افراد دارای دسترسی گشت توانایی بازبینی کردن صفحاتی که خودشان ایجاد کردهاند ندارند.
* افراد دارای دسترسی گشت میتوانند ویرایشهای بازبینی شده را از نظر خودشان در [[ویژه:RecentChanges|تغییرات اخیر]] پنهان کنند.
* برای درخواست این دسترسی، از مدیران ویکیکتاب درخواست کنید.
=== بازپسگیری دسترسی گشتزن ===
در صورتی که کاربر دسترسی گشت خودکار را از دست داد دسترسی گشتزن نیز از وی گرفته شود.
=== چه صفحههایی باید برچسب گشتزن بخورند ===
* تمام صفحههایی که برچسب {{الگو|حذف سریع}} خوردهاند باید برچسب گشتزن بخورند، تا وقت گشت زنهای دیگر برای بازبینی گرفته نشود.
* صفحههایی که برای ویکیپدیا مناسب هستند یعنی استانداردهای مقالهنویسی را دارا هستند.
=== چه صفحههایی نباید برچسب گشتزن بخورند ===
* صفحههایی که در مورد وضعیت آنها مطمئن نیستید و نیازمند به نظر دیگر کاربرها هست.
* صفحههایی که دارای برچسب حذف سریع نیستند ولی موضوع آنها مهم است.
[[رده:دسترسیهای کاربری ویکی کتاب]]
1egormardesdcvo1zdtj612dsztk3uf
135104
135076
2026-09-20T08:32:00Z
Vivairan2
28134
/* گشتزنی مقالههای تازه */
135104
wikitext
text/x-wiki
== کاربرد ==
مهمترین کاربرد آن جلوگیری از دوبارهکاری است و بازبینی مقالات و صفحهها است.
=== گشتزنی مقالههای تازه ===
{{تصویر چندگانه|align=left|direction=vertical|width=275|image1=ExamplePatrol.JPG|alt1=|caption1=یک مثال برای امکانی که کاربرانِ دارای دسترسی گشتزن در اختیار دارند.|image2=The new pages need patrolle.png|alt2=|caption2=[[ویژه:صفحههای تازه]] که در صفحات گشت نخورده به رنگ زرد نمایش مییابند.}}
اولویت اول گشتزنان، شناسایی صفحههای دارای مشکلات جدی محتوایی از جمله [[ویکیکتاب:صفحه حمله|صفحات حمله]]، ناقض [[ویکیکتاب:حقوق نسخه برداری|حق تکثیر]] و [[ویکیکتاب:خرابکاری|خرابکاری]] و علامتگذاری آنها برای [[ویکیکتاب:معیارهای حذف سریع|حذف سریع]] است. فراتر از آن، گشتزنان باید بررسی کنند که آیا مقالات مطابق با رهنمودها و [[ویکیکتاب:شیوهنامه|شیوهنامه]] هستند یا خیر. مقالاتی که نامناسب تشخیص داده میشوند باید بسته به شرایطشان، برای حذف سریع یا [[ویکیکتاب:سیاست حذف|زماندار]] نامزد یا در [[ویکیکتاب:سیاست حذف|شرایط خاص]]، برای بهبود با زدن برچسب معین شوند. بهجز در موارد جدی محتوایی، نیاز به اقدام سریع در قبال مقالهها وجود ندارد و قبل از انجام اقدامات بیشتر، نیاز است که به ایجادکننده برای بهبود مقاله فرصت داده شود. مشکلات موجود در مقاله باید بهوسیله اعلان یا برچسبهای تعمیر و نگهداری به کاربر سازنده اطلاع داده شوند و اگر بهبودی در مقاله صورت نگرفت، انتقال مقاله به فضای پیشنویس [[ویکیکتاب:سیاست حذف|در مواردی]] ممکن است مفید باشد. با این حال باید توجه کرد که انتقال به «پیشنویس» جایگزینی برای فرایند حذف نیست.
اگر مقالهای بهتازگی ایجاد شود، در پایین آن چیزی مشابه زیر دیده خواهد شد (فقط کاربران دارای دسترسی گشتزن میتوانند آن را در صفحات جدید ببینند):<div class="patrollink"><nowiki>[</nowiki> <span class="plainlinks">[{{SERVER}}{{localurl:ویکیپدیاگشت|action=markpatrolled}} به این صفحه برچسب گشت بزن]</span> <nowiki>]</nowiki></div>
در صورتی که کاربرانِ دارای دسترسی گشتزن مقالههای گشت نخوردهٔ موجود در [[ویژه:NewPages|فهرست صفحات جدید]] را گشت بزنند رنگ این مقالهها از زرد، به سفید تغییر میکند. همچنین [//fa.wikipedia.org/w/index.php?title=ویژه:صفحههای_تازه&hidepatrolled=1 پالایه صفحههای گشت نخورده جدید] برای بررسی سادهتر این صفحات وجود دارد.
=== گشتزنی ویرایشها ===
دسترسی گشتزن، راهی برای فهمیدن اینکه ویرایشی صحیح بوده یا خیر و مبارزه با خرابکاری و فیلتر کردن اسپمهاست. ویرایشهای گشت نخورده در [[ویژه:تغییرات اخیر|تغییرات اخیر]] با علامت <span class="unpatrolled">!</span> مشخص شدهاند؛ اگر ویرایشی صحیح و مناسب بود، میتوان آن را به «گشت خورده»<sup>patrolled</sup> علامت زد، این عمل باعث میشود آن ویرایش به حالت بدون علامت <span class="unpatrolled">!</span> تغییر کند. در این حالت، دیگران متوجه صحیح بودن آن ویرایش خواهند شد.
بهطور معمول ویرایشهایی گشت میخورند که با سیاستها و رهنمودها مطابقت داشته یا مصداق کامل خرابکاری نباشد. در صفحهٔ تغییرات اخیر، یک ویرایش بازبینینشده شبیه این است:[[پرونده:Patrolled Unpatrolled.PNG|thumb|305x305px|ویرایشهای جدید گشتخورده سفید و ویرایشهای جدید گشتنخورده و مشکوک نارنجی دیده میشوند.]]
* (<span class="plainlinks">[{{SERVER}}{{localurl:Help:Patrolled edit|curid=۱۷۰۰۰|diff=۰|oldid=۰}} تفاوت]</span>) (<span class="plainlinks">[{{SERVER}}{{localurl:Help:Patrolled edit|curid=۴|action=history}} تاریخچه]</span>).. <span class="unpatrolled">!</span> [[راهنما:ویرایش گشتنخورده]]؛ ۲۳:۲۸ .. [[کاربر:فلانی|فلانی]] ([[بحث کاربر:فلانی|بحث]])
:در حالی که بازبینیشده بدین صورت خواهد بود:
* (<span class="plainlinks">[{{SERVER}}{{localurl:Help:Patrolled edit|curid=۱۷۰۰۰|diff=۰|oldid=۰}} تفاوت]</span>) (<span class="plainlinks">[{{SERVER}}{{localurl:Help:Patrolled edit|curid=۴|action=history}} تاریخچه]</span>).. [[راهنما:ویرایش گشتخورده]]: ۲۳:۲۸ .. [[کاربر:فلانی|فلانی]] ([[بحث کاربر:فلانی|بحث]])
== نکات دیگر ==
* فهرست کاربران دارای دسترسی گشت را در میتوانید ببنید.
* فعالیتهای گشت زنی را در [[ویژه:Log/patrol|اینجا]] میتوانید ببنید.
* صفحات ایجاد شده توسط مدیران و رباتها و همچنین کاربران دارای دسترسی گشت خودکار، به طور خودکار حالت بازبینی شده میگیرند.
* افراد دارای دسترسی گشت توانایی بازبینی کردن صفحاتی که خودشان ایجاد کردهاند ندارند.
* افراد دارای دسترسی گشت میتوانند ویرایشهای بازبینی شده را از نظر خودشان در [[ویژه:RecentChanges|تغییرات اخیر]] پنهان کنند.
* برای درخواست این دسترسی، از مدیران ویکیکتاب درخواست کنید.
=== بازپسگیری دسترسی گشتزن ===
در صورتی که کاربر دسترسی گشت خودکار را از دست داد دسترسی گشتزن نیز از وی گرفته شود.
=== چه صفحههایی باید برچسب گشتزن بخورند ===
* تمام صفحههایی که برچسب {{الگو|حذف سریع}} خوردهاند باید برچسب گشتزن بخورند، تا وقت گشت زنهای دیگر برای بازبینی گرفته نشود.
* صفحههایی که برای ویکیپدیا مناسب هستند یعنی استانداردهای مقالهنویسی را دارا هستند.
=== چه صفحههایی نباید برچسب گشتزن بخورند ===
* صفحههایی که در مورد وضعیت آنها مطمئن نیستید و نیازمند به نظر دیگر کاربرها هست.
* صفحههایی که دارای برچسب حذف سریع نیستند ولی موضوع آنها مهم است.
[[رده:دسترسیهای کاربری ویکی کتاب]]
a5wfan6so4cik112pbyeygg16ufjb8r
135105
135104
2026-09-20T08:34:37Z
Vivairan2
28134
/* گشتزنی مقالههای تازه */
135105
wikitext
text/x-wiki
== کاربرد ==
مهمترین کاربرد آن جلوگیری از دوبارهکاری است و بازبینی مقالات و صفحهها است.
=== گشتزنی مقالههای تازه ===
{{تصویر چندگانه|align=left|direction=vertical|width=275|image1=ExamplePatrol.JPG|alt1=|caption1=یک مثال برای امکانی که کاربرانِ دارای دسترسی گشتزن در اختیار دارند.|image2=The new pages need patrolle.png|alt2=|caption2=[[ویژه:صفحههای تازه]] که در صفحات گشت نخورده به رنگ زرد نمایش مییابند.}}
اولویت اول گشتزنان، شناسایی صفحههای دارای مشکلات جدی محتوایی از جمله [[ویکیکتاب:صفحه حمله|صفحات حمله]]، ناقض [[ویکیکتاب:حقوق نسخه برداری|حق تکثیر]] و [[ویکیکتاب:خرابکاری|خرابکاری]] و علامتگذاری آنها برای [[ویکیکتاب:معیارهای حذف سریع|حذف سریع]] است. فراتر از آن، گشتزنان باید بررسی کنند که آیا مقالات مطابق با رهنمودها و [[ویکیکتاب:شیوهنامه|شیوهنامه]] هستند یا خیر. مقالاتی که نامناسب تشخیص داده میشوند باید بسته به شرایطشان، برای حذف سریع یا [[ویکیکتاب:سیاست حذف|زماندار]] نامزد یا در [[ویکیکتاب:سیاست حذف|شرایط خاص]]، برای بهبود با زدن برچسب معین شوند. بهجز در موارد جدی محتوایی، نیاز به اقدام سریع در قبال مقالهها وجود ندارد و قبل از انجام اقدامات بیشتر، نیاز است که به ایجادکننده برای بهبود مقاله فرصت داده شود. مشکلات موجود در مقاله باید بهوسیله اعلان یا برچسبهای تعمیر و نگهداری به کاربر سازنده اطلاع داده شوند و اگر بهبودی در مقاله صورت نگرفت، حذف انجام شود.
اگر مقالهای بهتازگی ایجاد شود، در پایین آن چیزی مشابه زیر دیده خواهد شد (فقط کاربران دارای دسترسی گشتزن میتوانند آن را در صفحات جدید ببینند):<div class="patrollink"><nowiki>[</nowiki> <span class="plainlinks">[{{SERVER}}{{localurl:ویکیپدیاگشت|action=markpatrolled}} به این صفحه برچسب گشت بزن]</span> <nowiki>]</nowiki></div>
در صورتی که کاربرانِ دارای دسترسی گشتزن مقالههای گشت نخوردهٔ موجود در [[ویژه:NewPages|فهرست صفحات جدید]] را گشت بزنند رنگ این مقالهها از زرد، به سفید تغییر میکند. همچنین [//fa.wikipedia.org/w/index.php?title=ویژه:صفحههای_تازه&hidepatrolled=1 پالایه صفحههای گشت نخورده جدید] برای بررسی سادهتر این صفحات وجود دارد.
=== گشتزنی ویرایشها ===
دسترسی گشتزن، راهی برای فهمیدن اینکه ویرایشی صحیح بوده یا خیر و مبارزه با خرابکاری و فیلتر کردن اسپمهاست. ویرایشهای گشت نخورده در [[ویژه:تغییرات اخیر|تغییرات اخیر]] با علامت <span class="unpatrolled">!</span> مشخص شدهاند؛ اگر ویرایشی صحیح و مناسب بود، میتوان آن را به «گشت خورده»<sup>patrolled</sup> علامت زد، این عمل باعث میشود آن ویرایش به حالت بدون علامت <span class="unpatrolled">!</span> تغییر کند. در این حالت، دیگران متوجه صحیح بودن آن ویرایش خواهند شد.
بهطور معمول ویرایشهایی گشت میخورند که با سیاستها و رهنمودها مطابقت داشته یا مصداق کامل خرابکاری نباشد. در صفحهٔ تغییرات اخیر، یک ویرایش بازبینینشده شبیه این است:[[پرونده:Patrolled Unpatrolled.PNG|thumb|305x305px|ویرایشهای جدید گشتخورده سفید و ویرایشهای جدید گشتنخورده و مشکوک نارنجی دیده میشوند.]]
* (<span class="plainlinks">[{{SERVER}}{{localurl:Help:Patrolled edit|curid=۱۷۰۰۰|diff=۰|oldid=۰}} تفاوت]</span>) (<span class="plainlinks">[{{SERVER}}{{localurl:Help:Patrolled edit|curid=۴|action=history}} تاریخچه]</span>).. <span class="unpatrolled">!</span> [[راهنما:ویرایش گشتنخورده]]؛ ۲۳:۲۸ .. [[کاربر:فلانی|فلانی]] ([[بحث کاربر:فلانی|بحث]])
:در حالی که بازبینیشده بدین صورت خواهد بود:
* (<span class="plainlinks">[{{SERVER}}{{localurl:Help:Patrolled edit|curid=۱۷۰۰۰|diff=۰|oldid=۰}} تفاوت]</span>) (<span class="plainlinks">[{{SERVER}}{{localurl:Help:Patrolled edit|curid=۴|action=history}} تاریخچه]</span>).. [[راهنما:ویرایش گشتخورده]]: ۲۳:۲۸ .. [[کاربر:فلانی|فلانی]] ([[بحث کاربر:فلانی|بحث]])
== نکات دیگر ==
* فهرست کاربران دارای دسترسی گشت را در میتوانید ببنید.
* فعالیتهای گشت زنی را در [[ویژه:Log/patrol|اینجا]] میتوانید ببنید.
* صفحات ایجاد شده توسط مدیران و رباتها و همچنین کاربران دارای دسترسی گشت خودکار، به طور خودکار حالت بازبینی شده میگیرند.
* افراد دارای دسترسی گشت توانایی بازبینی کردن صفحاتی که خودشان ایجاد کردهاند ندارند.
* افراد دارای دسترسی گشت میتوانند ویرایشهای بازبینی شده را از نظر خودشان در [[ویژه:RecentChanges|تغییرات اخیر]] پنهان کنند.
* برای درخواست این دسترسی، از مدیران ویکیکتاب درخواست کنید.
=== بازپسگیری دسترسی گشتزن ===
در صورتی که کاربر دسترسی گشت خودکار را از دست داد دسترسی گشتزن نیز از وی گرفته شود.
=== چه صفحههایی باید برچسب گشتزن بخورند ===
* تمام صفحههایی که برچسب {{الگو|حذف سریع}} خوردهاند باید برچسب گشتزن بخورند، تا وقت گشت زنهای دیگر برای بازبینی گرفته نشود.
* صفحههایی که برای ویکیپدیا مناسب هستند یعنی استانداردهای مقالهنویسی را دارا هستند.
=== چه صفحههایی نباید برچسب گشتزن بخورند ===
* صفحههایی که در مورد وضعیت آنها مطمئن نیستید و نیازمند به نظر دیگر کاربرها هست.
* صفحههایی که دارای برچسب حذف سریع نیستند ولی موضوع آنها مهم است.
[[رده:دسترسیهای کاربری ویکی کتاب]]
p3jds9reesk71t4zutrffmp0lmp8usb
ویکیکتاب:ایبوکها بر حسب وضعیت تکمیلشدگی
4
24328
135042
134996
2026-09-19T15:49:54Z
Vivairan2
28134
/* آثاری که با همکاری کاربران تکمیل میشود 20px */
135042
wikitext
text/x-wiki
[[پرونده:Couverture-wikimedia.jpg|بیقاب|چپ]]
{{امروز- تاریخ - به وقت تهران}}{{سخ}}
اگر کتاب جدیدی ایجاد کردهاید و قصد دارید به زودی آن را تکمیل کنید نام آن را به فهرست زیر بیفزایید. تعداد زیرصفحههای کتابی که ایجاد کردهاید در ابتدا بهتر است دست کم ۵ باشد. اگر محتوای کافی به کتاب اضافه نکنید ممکن است به زودی حذف شود. افزودن کتاب به فهرست زیر الزاما به این معنی نیست که سایر کاربران در آن مشارکت خواهند کرد اما اگر فکر میکنید میتوانید در تکمیل یکی از کتاب های زیر کمک کنید پس از مشارکت در آن (با هماهنگی نویسندگان قبلی) نام/نام کاربری خود را در بخش مشارکت کنندگان در فهرست زیر بنویسید.
نام تعدادی از کتابها در رده [[:رده:کتابهای ویکیکتاب بر حسب وضعیت تکمیل شدگی|کتابهای ویکیکتاب بر حسب وضعیت تکمیل شدگی]] مشخص شده است. تعدادی از کتابها به طور ۱۰۰٪ تکمیل شدهاند و ممکن است نسخه چاپی/پیدیاف/ایپاب هم داشته باشند اما اگر کتابی را یافتید که هنوز تکمیل نشده است میتوانید در صورت داشتن اطلاعات کافی و آشنایی به موضوع، در آن مشارکت کنید.
در فهرست زیر نام کتابهایی که هنوز تکمیل نشدهاند به همراه تعداد صفحه، میزان تکمیلشدگی، موضوع، وضعیت ویرایش و نام مشارکتکنندگان (پیشین و کنونی) مشخص شده است. در صورتی که تعداد زیرصفحههای یک کتاب زیاد باشد و مدت زمان طولانی دست نخورده بماند احتمالاً به زودی حذف خواهد شد.
پیش از مشارکت در یک کتاب حتما راهنمای ویکیکتاب یا [[ویکیکتاب:خودآموز|خودآموز ویکیکتاب]] را مطالعه کنید و پس از آشنایی با [[ویکیکتاب:سیاستها و رهنمودها|سیاستها و رهنمودها]] دست به ویرایش بزنید. بدون اجازه مدیران ویکیکتاب اجازه ادغام کتابها با یکدیگر را ندارید.
اگر قصد دارید عنوان کتابی را که اخیراً ایجاد کردهاید به این صفحه بیفزایید، ابتدا مطمئن شوید فهرست، چارچوب کلی کتاب، ... را به درستی تکمیل کردهاید سپس نام آن (عنوان کتاب) را به این فهرست بیفزایید و سایر مشخصات را به دقت پر کنید.
::''برای مشاهده کتابهای در حال تکمیل در [[ویکیکودک]]، به [[ویکیکودک:کتابهای در حال تکمیل ویکیکتاب]] مراجعه کنید.''
::''برای مشاهده کتابهای در حال تکمیل در [[ویکیراهنما]]، به [[ویکیکتاب:کتابهای در حال تکمیل ویکیراهنما]] مراجعه کنید.''
==آثاری که با همکاری کاربران تکمیل میشود [[پرونده:Wikibooks-logo-fa2.svg|20px]] ==
{{جعبه هشدار|به دلیل نداشتن تعریف دقیقی از سرشناسی در ویکیکتاب، از مرداد ۱۴۰۳ تا اطلاع ثانوی به کتابهایی که در حوزه سیاسی و اجتماعی و مسائل روز باشند اجازه انتشار داده نخواهد شد. }}
ایبوکهای زیر ایبوکهایی هستند در ویکیکتاب که هنوز کامل نشدهاند. در حال حاضر ۵۳ کتاب در این فهرست جای گرفتهاند که بسیار بیشتر از تعداد معمول است (نباید بیش از ۲۰ کتاب در این فهرست باشد). وضعیت تکمیل همه این ایبوکها به صورت درصد تقریبی نشان داده شده است زیرا [[راهنما:مراحل توسعه|میزان پیشرفت]] یک ایبوک توسط نویسنده مشخص میشود و دقیق نیست.
معمولا فهرست هر کدام از این کتابها توسط نویسنده اصلیاش کامل شده است تا با داشتن ساختاری مشخص و از پیش تعیین شده دیگران هم بتوانند کمک کنند. شما هم میتوانید در کتاب های زیر مشارکت کنید:
{| class="wikitable" style="font-size: 95%"
!'''نام ایبوک'''||'''تعداد زیرصفحه'''||'''میزان توسعه'''||'''موضوع'''||'''وضعیت'''||'''مشارکت کنندگان'''
|-
||''[[آشنایی با چندوجهیها]]''||۱۲ ||۱۰٪|| ریاضی||{{در حال انجام}}||[[کاربر:هيربد فودازى٢]]
|-
||''[[آشنایی با هواشناسی]]''||۱۰ ||۶۵٪|| فیزیک||{{در حال انجام}}||[[کاربر:Hldv ugd psdk]]، آیپی
|-
||''[[آموزش زبان اسپانیایی]]''||۶ ||۴۵٪|| زبان||{{در حال انجام}}||[[کاربر:روح الله بهسودی]]
|-
||''[[آموزش زبان چینی]]''||۲ ||۱۵٪|| زبان||{{در حال انجام}}||[[کاربر:Amir.Vector]]
|-
||''[[آموزش زبان روسی]]''||۱۲ ||۵۰٪|| زبان||{{در حال انجام}}||[[کاربر:Amir.Vector]]
|-
||''[[آموزش زبان عربی]]''||۲ ||۱۵٪|| زبان||{{در حال انجام}}||[[کاربر:Amir.Vector]]
|-
||''[[آموزش زبان کردی]]''||۲ ||۱۰٪|| زبان||{{در حال انجام}}||[[کاربر:Amir.Vector]]، [[کاربر:Calak]]
|-
||''[[آموزش زبان فرانسوی]]''||۵ ||۲۰٪|| زبان||{{در حال انجام}}||[[کاربر:Amir.Vector]]، [[کاربر:Sinafe]]
|-
||''[[آموزش کار با دیسکورد]]''||۳ ||۱۰٪|| رایانه||{{در حال انجام}}||[[کاربر:Doostdar]]
|-
||''[[اجزای رابط گرافیکی کاربران اینترنتی]]''||۱۲ ||۳۰٪|| رایانه||{{در حال انجام}}||[[کاربر:Doostdar]]
|-
||''[[استفاده از فناوری اطلاعات در آموزش]]''||۹ ||۵۰٪|| رایانه||{{در حال انجام}}||[[کاربر:Doostdar]]
|-
||''[[اسناد نام خلیج فارس، میراثی کهن و جاودان]]''||۱۱ ||۵۰٪ (نیازمند نسخهخوانی و ویرایش)|| تاریخ||{{در حال انجام}}||[[کاربر:Cultural sec]]
|-
||''[[اقتصاد خرد ۱]]''||۲ ||۱۰٪|| اقتصاد||{{در حال انجام}}||[[کاربر:Niyumard]]
|-
||''[[امور مالی شخصی]]''||۲ ||۵۰٪|| اقتصاد||{{در حال انجام}}||[[کاربر:God's spirit]]
|-
||''[[بررسی موردهایی از اخلاق حرفهای]]''||۶۳ ||۶۰٪|| کارورزی||{{در حال انجام}}||[[کاربر:Doostdar]]
|-
||''[[برنامهنویسی دلفی]]''||۲ ||۱۰٪|| رایانه||{{در حال انجام}}||آیپی
|-
||''[[پروتکل اس اس ال]]''||۱ ||۱۰٪|| رایانه||{{در حال انجام}}||[[کاربر:Abolfazlgoodarzi]]
|-
||''[[پندنامه ویکی]]''||۸ ||۶۰٪|| علوم اجتماعی||{{در حال انجام}}||[[کاربر:مجید~fawikibooks]]، [[کاربر:Reza1615]]
|-
||''[[تفکر رندانه برای نسل شورشی]]''||۸ ||۷۰٪|| علوم اجتماعی||{{در حال انجام}}||[[کاربر:GoldenJDM]]
|-
||''[[آموزش رانندگی]]''||۱۸ ||۴۰٪|| دفترچه راهنما||{{در حال انجام}}||[[کاربر:Parsa 2au]]
|-
||''[[توابع مثلثاتی]]''||۱۴ ||۱۰٪|| ریاضی||{{در حال انجام}}||[[کاربر:Doostdar]]، [[کاربر:Nightdevil]]
|-
||''[[ثروت ملل]]''||۴ ||۶۰٪|| اقتصاد||{{در حال انجام}}||[[کاربر:2nd Socrates]]
|-
||''[[جاوا اسکریپت]]''||۵ ||۲۵٪|| رایانه||{{در حال انجام}}||[[کاربر:Amir.Vector]]
|-
||''[[خودآموز اوبونتو]]''||۲۵ ||۵۰٪||رایانه||{{در حال انجام}}||[[کاربر:Erghezi]]، [[کاربر:AFlorence]]، [[کاربر:Ebrahim]]
|-
||''[[دیوار سه بعدی]]''||۳ ||۵۰٪||مهندسی||{{در حال انجام}}|| آیپی
|-
||''[[راهنمای شبکهٔ اجتماعی ماستودون]]''||۱ ||۴۰٪|| رایانه||{{در حال انجام}}||[[کاربر:Alirezahayati]]، [[کاربر:Be4zad]]، [[کاربر:Ehsan0921]]
|-
||''[[رمزنگاری]]''||۲ ||۱۰٪|| ریاضی||{{در حال انجام}}||[[کاربر:Crypto~fawikibooks]]، [[کاربر:Doostdar]]، [[کاربر:Editor-1]]
|-
||''[[راهنمای مطالعه اولیس اثر تنیسون]]''||۲ ||۱۰٪|| ادبیات||{{در حال انجام}}||[[کاربر:Nightdevil]]
|-
||''[[ریاضی پایه]]''||۲۰ ||۷۰٪||ریاضی||{{در حال انجام}}||[[کاربر:Ebrahim]]، [[کاربر:Afshin sultani123]]، [[کاربر:Doostdar]]
|-
||''[[ریاضیات برای اقتصاد]]''||۶ ||۲۰٪||ریاضی||{{در حال انجام}}||[[کاربر:Niyumard]]
|-
||''[[ریاضی برای شیمی]]''||۹ ||۲۰٪||ریاضی و شیمی||{{در حال انجام}}||آی پی
|-
||''[[راهنمای برگزاری کنفرانسهای بینالمللی در ایران]]''||۱۵ ||۴۰٪|| دفترچه راهنما||{{در حال انجام}}||[[کاربر:Doostdar]]
|-
||''[[زبان برنامه نویسی سی]]''||۴۰ ||۶۰٪|| رایانه||{{در حال انجام}}||[[کاربر:Hard Backrest]]، [[کاربر:Amir.Vector]]، [[کاربر:HadiLovelorn]]
|-
||''[[زبان برنامهنویسی گو]]''||۲۱ ||۲۵٪|| رایانه||{{در حال انجام}}||[[کاربر:Fwldom]]
|-
||''[[سیستم عامل]]''||۷ ||۴۰٪|| رایانه||{{در حال انجام}}||[[کاربر:IamRezaMousavi]]، [[کاربر:Silverman2009]]، [[کاربر:Mohammad Mahdavi]]
|-
||''[[سیستمعامل تحقیقاتی آروس]]''||۱۱ ||۳۰٪|| رایانه||{{در حال انجام}}||[[کاربر:Doostdar]]
|-
||''[[سیشارپ]]''||۶ ||۴۰٪|| رایانه||{{در حال انجام}}||آیپی
|-
||''[[غلبه بر سستی]]''||۷ ||۷۵٪|| خودیاری||{{در حال انجام}}||[[کاربر:Doostdar]]
|-
||''[[فرمولهای فیزیک]]''||۸ ||۵۰٪|| فیزیک||{{در حال انجام}}||[[کاربر:Komeil 4life]]، [[کاربر:Kaveh]]، [[کاربر:Ubeyde in]]
|-
||''[[فرمولهای ریاضی]]''||۳ || ۱۰٪|| ریاضی||{{در حال انجام}}||آیپی
|-
||''[[فرهنگ افغانی]]''||۶ ||۴۰٪|| علوم اجتماعی||{{در حال انجام}}||[[کاربر:راشد عبیدی]]، [[کاربر:پاسدار]]
|-
||''[[فرهنگ ایرانی]]''||۴ ||۲۰٪|| علوم اجتماعی||{{در حال انجام}}||[[کاربر:Gire 3pich2005]]، [[کاربر:Doostdar]]
|-
||''[[فروشگاه نرمافزاری افدروید]]''||۴ ||۲۰٪|| رایانه||{{در حال انجام}}||[[کاربر:BehDev]]
|-
||''[[فیزیک مدرن]]''||۴ ||۵۰٪|| فیزیک||{{در حال انجام}}||[[کاربر:Xpluto]]
|-
||''[[کالبدشناسی انسان]]''||۴ ||۱۰٪|| پزشکی||{{در حال انجام}}||[[کاربر:Sprazizi]]، [[کاربر:گلبول سیاه]]
|-
||''[[کتاب عصر پایتون]]''||۸ ||۵۰٪|| رایانه||{{در حال انجام}}||[[کاربر:Reza1615]]، [[کاربر:IamRezaMousavi]]
|-
||''[[کوهنوردی]]''||۳ || ۱۰٪|| ورزش ||{{در حال انجام}}||[[کاربر:Doostdar]]
|-
||''[[لاتک]]''||۸ || ۵۰٪|| رایانه||{{در حال انجام}}||[[کاربر:Ab.diyanat]]
|-
||''[[مدل ذهنی]]''||۳ ||۵۰٪|| فلسفه||{{در حال انجام}}||[[کاربر:Tarahikhodro]]
|-
||''[[مدرک لینوکس LPI]]'' ||۳ || رایانه||۵۰٪|| {{در حال انجام}}||[[کاربر:Doostdar]]، [[کاربر:Sajjad.r]]
|-
||''[[نگاهی به ریاضیات پیشرفته]]''||۹۰ ||۷۵٪||ریاضی||{{در حال انجام}}||[[کاربر:HEJJWJDEJDNSGWTG]]، [[کاربر:FDVDBFNDBSW2552]]
|-
||''[[هک]]''||۷ || ۹۰٪|| رایانه||{{در حال انجام}}||[[کاربر:Doostdar]]، [[کاربر:7ramin7]]
|-
||''[[یادگیری نرم افزار متلب]]''||۳ || ۵۰٪|| رایانه|| {{در حال انجام}}||[[کاربر:Key1nike]]، [[کاربر:Doostdar]]
|}
{{-}}
::''اگر علاقهمند به مشارکت در یکی از ایبوکهای بالا هستید با هماهنگی مشارکتکنندگان فعلی، میتوانید در پیشرفت کتاب کمک کنید.''
::''اگر فکر میکنید یکی از کتابهای بالا دارای مشکلاتی همچون نقض حق تکثیر است یا دارای سایر شرایط حذف است، آن را در [[وک:نبح|نظرخواهی برای حذف]] نامزد حذف کنید.''
==آثاری که به تازگی تکمیل شدهاند [[پرونده:Wikibooks-logo-fa2.svg|20px]] ==
در حال حاضر ۱۱ کتاب به ترتیب زمانی (از جدیدترین به قدیمیترین) در این فهرست جای گرفتهاند (که همه آنها در ۵ سال گذشته ایجاد شدهاند).
{| class="wikitable" style="font-size: 95%"
!'''نام ایبوک'''||'''تاریخ تکمیل'''||'''وضعیت'''||'''موضوع'''||'''وضعیت'''||'''مشارکت کنندگان'''
|-
||''[[سیاساس]]''||مرداد ۱۴۰۴ ||{{کامل شد}}|| رایانه||تکمیل||[[کاربر:Fwldom]]
|-
||''[[دورهمی طرح و حل مساله ریاضی]]''||اسفند ۱۴۰۳ ||{{کامل شد}}||ریاضی||تکمیل||[[کاربر:Abstractionist]]، [[کاربر:Tara.dalaei]]، [[کاربر:Mhrezanezhad]]، [[کاربر:Behnoosh.j]]، [[کاربر:AFarazF]]، [[کاربر:امید]]
|-
||''[[برنامه نویسی PSP]]''||شهریور ۱۴۰۳ ||{{کامل شد}}||رایانه||تکمیل||[[کاربر:Fwldom]]
|-
||''[[مبانی شبکههای کامپیوتری و سختافزار]]''||شهریور ۱۴۰۳ ||{{کامل شد}}||رایانه||تکمیل||[[کاربر:Fwldom]]
|-
||''[[پیاچپی]]''||شهریور ۱۴۰۳ ||{{کامل شد}}|| رایانه||تکمیل||[[کاربر:Sh-gholipour]]، [[کاربر:Editor-1]]، [[کاربر:Komeil 4life]] , [[کاربر:Fwldom]]
|-
||''[[آموزش کامل خط فرمان ویندوز]]''||فروردین ۱۴۰۳ || {{کامل شد}}||رایانه||تکمیل||[[کاربر:Fwldom]]
|-
||''[[مسیریابی وسایل نقلیه]]''|| دی ۱۴۰۲|| {{کامل شد}}||مدیریت||تکمیل||[[کاربر:Mehrdad1250]]
|-
||''[[آموزش کار با گودریدز]]''|| فروردین ۱۴۰۲|| {{کامل شد}}||رایانه||تکمیل||[[کاربر:Doostdar]]
|-
||''[[مقطع مخروطی]]''|| شهریور ۱۴۰۱|| {{کامل شد}}|| ریاضی||تکمیل||[[کاربر:FDVDBFNDBSW2552]]
|-
||''[[راهنمای شیوهنامه پیامرسانی ماتریکس]]''|| آبان ۱۴۰۱|| {{کامل شد}}|| رایانه||تکمیل||[[کاربر:BehDev]]
|-
||''[[سفرنامه ایران از اولیا چلبی]]''|| ۱۴۰۰|| {{کامل شد}}|| تاریخ||تکمیل||[[کاربر:ماسرا]]
|}
[[رده:ویکیکتاب]]
[[رده:فهرست کتابهای در حال تکمیل]]
cpxl6qwz2witkw1xr5shmselwl73g5o
رده:فرهنگ کوچک زبان پهلوی
14
32331
135107
108416
2026-09-20T08:44:56Z
Vivairan2
28134
135107
wikitext
text/x-wiki
{{جذف سریع}}
[[رده:زبانها]]
4uloe2mvbk60t6g92vv8l9nsrg1qb7b
135108
135107
2026-09-20T08:45:09Z
Vivairan2
28134
135108
wikitext
text/x-wiki
{{حذف سریع}}
[[رده:زبانها]]
9lromn5p0k4ug4n6ctwn2730jtezdwf
زبان برنامه نویسی سی/stdio
0
33083
135067
134784
2026-09-20T00:06:49Z
HadiLovelorn
23337
135067
wikitext
text/x-wiki
{{سرص|زبان برنامه نویسی سی/مقدمهای بر فایلهای سرآیند|زبان برنامه نویسی سی/stdlib}}
با این فایل سرآیند تا حدودی آشنایی دارید و در طول کتاب بارها به آن اشاره شده است . stdio.h یک فایل سرآیند ( Header ) استاندارد زبان سی می باشد که مخفف Standard Input/Output یا Standard Input & Output است به معنی ورودیها و خروجیهای استاندارد . ما از تابع printf و scanf به وفور در کتاب استفاده نمودهایم که در فایل سرآیند stdio تعریف شدهاند اما پیش از نوشتن توابع بهتر است با تعیینکنندههای فرمت در این توابع استاندارد آشنا شوید.
حتماً به یاد دارید که در کتاب وقتی می نوشتیم ;printf("This is a %s", str) و اگر str یک رشته می بود که داخل آن وارد می کردیم string در خروجی خطدستوری با جمله This is a string مواجه می شدیم. تعیین کنندههای فرمت ، متغیرهایی هستند که داخل دو دابل کوت نوشته می شوند تا بعداً توسط آرگومانهای فرستاده شده ( پاس داده شده ) جایگزین گردند.
{{چپچین}}
%[parameter][flags][width][.precision][length]type
{{پایان چپچین}}
<br><br>
ابتدا پارامتر تعیین کننده نوشته می شود ، سپس پرچمها و سپس عرض و پهنا و سپس میزان دقت و بعد طول و در نهایت نوع داده آرگومان
==انواع داده آرگومان==
انواع داده آرگومان عبارتند از :
{{چپچین}}
d, i
{{پایان چپچین}}
که اعداد دهدهی هستند با این تفاوت که در تابع scanf تعیین کننده نوع i اگر در ابتدای آرگومان نوشته شود 0x آن را هگزادسیمال ( شانزدهشانزدهی ) دریافت می کند و اگر در ابتدای آرگومان نوشته شود 0 آن را اوکتال ( هشتهشتی ) دریافت خواهد نمود
{{چپچین}}
u
{{پایان چپچین}}
که اعداد دهدهی بدون علامت را تعیین می کند unsigned decimal که همان unsigned int می باشد
{{چپچین}}
ld , li
{{پایان چپچین}}
که اعداد صحیح بلند را تعیین می کند long int
{{چپچین}}
lld , lli
{{پایان چپچین}}
که اعداد صحیح خیلی بلند را تعیین می کند long long int
{{چپچین}}
lu
{{پایان چپچین}}
که اعداد صحیح بلند بدون علامت را تعیین می کند unsigned long
{{چپچین}}
llu
{{پایان چپچین}}
که اعداد صحیح خیلی بلند بدون علامت را تعیین می کند unsigned long long int
{{چپچین}}
f, F
{{پایان چپچین}}
برای اعداد اعشاری با این تفاوت که f برای بینهایت inf یا infininty و برای تعریفنشدهها nan را باز می گرداند و F برای بینهایت INF یا INFINITY و برای تعریفنشدهها NAN را باز می گرداند
{{چپچین}}
lf
{{پایان چپچین}}
که اعداد اعشاری با دقت دو برابر را تعیین می کند double
{{چپچین}}
Lf
{{پایان چپچین}}
برای تعیین اعداد اعشاری با دقت بسیار زیاد به کار می رود long double
{{چپچین}}
e, E
{{پایان چپچین}}
برای اعداد اعشاری به صورت توان برای ۱۰ که به صورت d.ddde±dd مقدار را می فرستد یا دریافت می کند که شامل مقدار صحیح است و یک نقطه و مقادیر اعشاری و علامت E برای E و e برای e و سپس نما و توان که دست کم دو رقم هستند . دقت کنید که در ویندوز ارقام توان به صورت پیش فرض سه تا هستند . مثال : 1.5e03 یعنی ۱٫۵ ضربدر ۱۰ به توان ۳
{{چپچین}}
g, G
{{پایان چپچین}}
برای اعداد که اگر کامل ( صحیح ) باشند شامل نقطه و ممیز نخواهد شد و اگر اعشاری باشند ممکن است آن را به صورت معمولی بنویسد یا به صورت توان ۱۰ که همان e و E می باشند که البته می تواند دریافت نیز بکند ( مثلاً در تابع scanf ) و خود کامپایلر تشخیص می دهد که کدام بهتر است و با این تفاوت که پشت سر نما 0 نمی گذارد . مثال : 21.965 یا 2.5e4
{{چپچین}}
x, X
{{پایان چپچین}}
برای اعداد هگزادسیمال که صحیح بدون علامت هستند که x برای حروف کوچک است مثل x5f و X برای حروف بزرگ مثل X5F
{{چپچین}}
o
{{پایان چپچین}}
برای اعداد اوکتال که صحیح بدون علامت هستند
{{چپچین}}
s
{{پایان چپچین}}
برای رشتههایی که با NULL پایان می یابند ( اگر به یاد داشته باشید ، رشته ، مجموعهای از کاراکترهاست ) مثل رشتههایی که با آرایه می سازیم و ذخیره می نمائیم یعنی رشتهای مثل : monkeys are cute
{{چپچین}}
c
{{پایان چپچین}}
برای یک کاراکتر که به خروجی فرستاده می شود یا از ورودی دریافت می شود
{{چپچین}}
p
{{پایان چپچین}}
برای اشارهگرها که آدرسشان به رابط خطدستوری فرستاده شود یا از آنجا دریافت شود . طبق استاندارد می تواند و باید از نوع پوچ باشد void ولی این مورد یعنی برای p وابسته به نویسنده پیادهساز می باشد و هر کامپایلر به دلخواه خود عمل می کند ( مراجعه کنید به راهنمای کامپایلر خود )
{{چپچین}}
a, A
{{پایان چپچین}}
برای اعداد اعشاری با دقت دو برابر ( double ) که در مبنای شانزده ( هگزادسیمال ) نوشته می شود و 0x و بقیه ارقام و حروف ( کوچک ) برای a و 0X و بقیه ارقام و حروف ( بزرگ ) برای A ( دقت کنید که این استاندارد است ولی هر کامپایلر به دلخواه خود قابلیتهای آن را ممکن است افزایش داده باشد )
{{چپچین}}
n
{{پایان چپچین}}
مقداری را در خروجی خطدستوری چاپ نمی کند اما به آرگومان اشارهگر متناظر خود ، تعداد کاراکترهای داخل تابع خود را باز می گرداند
<br><br>
همچنین با استفاده از ماکروی wchar_t که در فایل سرآیند wchar.h تعریف شده است ما می توانیم کاراکترهای اضافهتر از ازکی را که در UTF-8 و UTF-16 و UTF-32 تعریف شدهاند در تابع printf یا scanf و بقیه توابع این فایل سرآیند به عنوان تعیین کننده نوع آرگومان تعیین کنیم تا کاراکترهای مذکور را در رابط خطدستوری چاپ نمائیم یا دریافت کنیم که این تعیین کنندهها شامل :
{{چپچین}}
lc or C
{{پایان چپچین}}
lc و یا C ( بزرگ ) برای یک کاراکتر UTF و
{{چپچین}}
ls or S
{{پایان چپچین}}
ls یا S ( بزرگ ) برای یک رشته انکدینگ UTF
می شود . اما کاراکترهای UTF-8 را می توان در سیستم عاملهای روز ( مادرن Modern ) که چند زبانه هستند در متن منبع نیز نوشت و آن را در خروجی خطدستوری چاپ نمود . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
printf("ญ");
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
که پس از کامپایل و اجرا ، در خروجی کاراکتر ญ از حروف زبان تایلندی را مشاهده خواهید نمود . اما برای کار با حروف یونیکد Unicode مثل UTF-8 باید از توابع و ماکروهای فایل سرآیند wchar.h استفاده نمائید که در مبحث مربوطه نوشته خواهد شد
{{چپچین}}
zu
{{پایان چپچین}}
برای تعیین نوع فرمت داده از نوع size_t که هنوز به آن نرسیدهایم و در ادامه خواهم نوشت اما فقط برای استانداردهای جدید تعریف شده است و در استانداردهای قدیمی مثل C89 همان ul% را می نویسیم
'''پارامترِ تعیین کننده شماره آرگومان''' : جزء استاندارد سی نیست و فقط در پازیکس ( POSIX رابط کاربری قابل حمل برای سیستم عاملهای محیطهای پنجرهای ایکس ) تعریف شده است که یک عدد را می نویسیم و در مقابل آن یک علامت دلار یا همان پسو $ را می گذاریم . با این کار ، تعیین میکنیم که ابتدا چندمین آرگومان دریافت و یا فرستاده شود و سپس چندمین و الی آخر . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main()
{
int a = 15, b = 17;
printf("%2$d %1$d", a, b);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
با اینکه ابتدا آرگومان a و سپس b فرستاده شدهاند ، اما چون شماره تعیین کننده اول ، 2 و شماره تعیین کننده دوم ، 1 می باشد ابتدا b و سپس a چاپ می شود
'''نکته :''' در صورتی که بخواهید علامت درصد % را در خروجی خط دستوری چاپ کنید باید دو بار آن را بنویسید یعنی بدین شکل %%
'''و پرچمها عبارتند از :'''
{{چپچین}}
-
{{پایان چپچین}}
این پرچم متن خروجی خطدستوری را در تعیینکننده فرمت خود چپچین می کند . به صورت پیشفرض تمام متون چپچین هستند اما اگر پیش از تعیین کننده نوع آرگومان عددی را بنویسید ( که کمی جلوتر آن را خواهیم نوشت ) به همان اندازه خروجی دارای فضای سفید ( space ) خواهد بود که آرگومان را جلو می برد اما اگر در تعیینکننده فرمت یک علامت منفی ( مایناس - ) بگذارید آن را به سمت چپ انتقال خواهد داد
{{چپچین}}
+
{{پایان چپچین}}
این پرچم ، تضمین می کند که علامت عدد در خروجی خطدستوری نوشته خواهد شد یعنی - برای اعداد منفی ( negative ) و + برای اعداد مثبت ( positive ) که به صورت پیشفرض فقط برای اعداد منفی نوشته می شود و برای اعداد مثبت علامتی گذاشته نمی شود
{{چپچین}}
فضای سپید یا همان اسپیس
{{پایان چپچین}}
این پرچم یعنی space که بازگردان آن می شود فضای سپید یا فضای خالی برای اعداد مثبت جای خالی می گذارد و برای اعداد منفی علامت منفی ( مایناس - ) که اگر همراه با علامت مثبت ( + ) نوشته شود فضای سپید نادیده گرفته می شود
{{چپچین}}
0
{{پایان چپچین}}
عدد صفر به انگلیسی 0 ( زیرو ) هنگامی که برای آرگومان پهنا و عرضی در نظر گرفته شود ( که در ادامه می نویسیم ) که یک عدد است به جای فضای خالی پشت عدد ، صفر می گذارد که البته بستگی به تعداد ارقام عدد نیز دارد ؛ یعنی اگر عدد 352 باشد و ما پهنای آن را ۸ تا تعیین کرده باشیم ۵ تا فضای خالی قرار می گیرد ؛ اگر از این پرچم استفاده کنیم در خروجی خطدستوری چاپ می شود : 00000352
{{چپچین}}
#
{{پایان چپچین}}
پرچم هاش یا شارپ چندین کار را می تواند انجام بدهد :
۱ − برای تعیینکنندههای فرمت g و G در صورتی که قسمت اعشار نداشته باشند 0 های مقابل آن را ( در قسمت اعشاری ) حذف نمی کند
۲ − برای فرمتکنندههای a و A و e و E و f و F و g و G یک علامت اعشار ( ممیز که در انگلیسی نقطه است ) را حتماً اضافه می کند تا مشخص شود عدد اعشاری است حتی در صورتی که قسمت اعشار 0 باشد
۳ − برای تعیینکنندههای فرمت اوکتال o و هگزادسیمال کوچک x و هگزادسیمال بزرگ X برای هر عددی جز 0 قبل از آن علائم 0 و 0x و 0X را به ترتیب می نویسد و پیش از مقدار چاپ شده در خروجی خطدستوری قرار می دهد
۴ − برای تعیینکنندههای فرمت ls یا S باعث می شود تا سایز متن به تعداد کاراکترهای خروجی باشد و نه به اندازه ( size ) کاراکترهای موجود که ممکن است چند بایتی و عریض باشند که در UFT-8 یا uTF-16 یا UTF-32 تعریف شدهاند
۵ − برای تعیینکنندههای فرمت p که برای چاپ آدرس اشارهگر است آن را به مقدار هگزادسیمال تبدیل می کند که قابل برگشت نیست ( یعنی عکس همین عمل ) مگر اینکه در محیطهای ترا اسپیس ( teraspace ) که شامل برخی سیستم عاملها نظیر لینوکس می شود با دستور مستقیم به کامپایلر آن را مهیا نمائیم
{{چپچین}}
'
{{پایان چپچین}}
آپوستروف با علامت ' ( که همان سینگل کوت می باشد ) باعث می شود تا هر سه رفم با یک ممیز ( علامت نقطه در انگلیسی . ) از یکدیگر جدا شوند که البته برای این کار باید فایل سرآیند locale.h را به برنامه خود ضمیمه نمائید مثل :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
#include <locale.h>
int main()
{
setlocale(LC_NUMERIC, "");
int a = 1564952413;
printf("%'d", a);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
که در اینجا برنامه چاپ می کند : 1.564.952.413
مطالب پرچمها کاملاً روشن هستند و نیازی به مثال ندارد اما به عنوان نمونه یک مثال برای پرچم مایناس ( علامت منفی ) می نویسیم :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main()
{
int a = 47;
printf("%-6d", a);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در این مثال اگر علامت منفی را بر داریم عدد 47 با ۶ فاصله که نوشتهایم 6 چاپ می شود اما چون علامت منفی گذاشتهایم چپچین شده و در ابتدای رابط خطدستوری قرار می گیرد
<br><br>
'''عرض و پهنا'''
در عرض و پهنا ، پس از علامت درصد یک شماره می نویسیم که ورودی یا خروجی را به جلو می راند و به هیچ وجه باعث از بین رفتن مقدار نمی شود . این کار باعث می شود تا بتوانیم در رابط خطدستوری شکل و جدول خاصی را ایجاد کنیم . به علاوه اگر پس از علامت درصد علامت استریسک ( ستاره ) را بنویسیم بتوانیم به صورت پویا ، مقداری را به عنوان آرگومان بنویسیم تا به همان اندازه کاراکترهای ما به جلو رانده شوند . مثال عدد را در مثال پیشین نوشتیم ، اما برای مثال استریسک :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main()
{
int a = 8, b = 94;
printf("%*d", a, b);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال بالا مقدار a مقدار ۸ می باشد و b مقدار ۹۴ که مقدار 94 را در خروجی خطدستوری چاپ نمودهایم اما به مقدار a یعنی ۸ تا فاصله و فضای سپید و خالی پیش از آن قرار دادهایم که عدد به جلو رانده می شود
'''دقت کنید :'''
اگر در قسمت تعیینکننده فرمت یک نقطه بگذارید و پس از آن یک عدد بنویسید ، برای اعداد اعشاری دقت اعشار همان عدد است و مابقی گرد شده و نادیده گرفته می شوند . برای رشتهها نیز تعداد کاراکترها را معین می کند که اگر از عدد نوشته شده بیشتر باشد ، کاراکترهای بعدی نادیده گرفته می شوند . همچنین می توانید بعد از علامت نقطه ، یک استریسک بگذارید و در قسمت آرگومانها مقدار مورد نظر را به تابع بفرستید تا دقت را معین کنید . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main()
{
char ch[] = "whatthehell";
printf("%.3s", ch);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main()
{
printf("%.*s", 3, "abcdef");
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال اول رشته whatthehell فقط سه کاراکتر اولش چاپ می شود و در مثال دوم فقط abc . برای اعداد اعشاری نیز یک مثال می نویسیم :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main()
{
float f = 2.564;
printf("%.2f", f);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال بالا مقدار ۲٫۵۶۴ عدد ۴ ـش نادیده گرفته می شود ( چون کوچکتر از ۵ است اگر گرد شود می شود 0 که فاقد مقداری در ارزش مکانی است و نادیده گرفته می شود )
مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main()
{
long double pi = 3.14159265358979;
printf("%.14Lf", pi);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
'''دقت کنید :''' در زبان سی و سیستم عاملهای متداول به صورت پیشفرض ، دقت اعشار نمایشی فقط ۶ رقم است ؛ اما اگر از double استفاده کنید دقت بالاتر می رود و می توانید عددی بزرگتر از ۶ بنویسید و در سیستم عامل قدرتمندی مثل گنو/لینوکس و کامپایلر قدرتمندی مثل GCC می توانید از long double استفاده نموده و بازهم دقت را بالاتر ببرید ( ولی در ویندوز long double به اندازه همان double دقت دارد )
در مثال بالا عدد پای ( یا همان پی Pi ) تا ۱۴ رقم اعشار نوشته شده و در خروجی خط دستوری ، چاپ شده است
'''تعیین کنندههای طول :'''
{{چپچین}}
hh
{{پایان چپچین}}
برای اعداد صحیح که به صورت کاراکتر تعریف شدهاند و دیگر نیازی به نقش ایفا کردن و کستکردن ندارد . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main()
{
char a = 12;
printf("%hhd", a);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال بالا a یک کاراکتر است ، اما ما تعیین کننده نوع آرگومان را d و decimal تعریف کردهایم . اما با این حال ( به خاطر استفاده از hh ) برنامه بدون هیچ اشکالی مقدار 12 را در خروجی خطدستوری نمایش می دهد ( دقت کنید که حجم یک کاراکتر ۱ بایت است و تنها می تواند تا مقدار ۱۲۷ و یا بدون علامت تا ۲۵۵ را در خود ذخیره کند )
{{چپچین}}
h
{{پایان چپچین}}
برای اعداد صحیح نوع کوتاه در مبنای ۱۰ و یا اوکتال و یا هگزادسیمال که به صورت short ( کوتاه ) تعریف شدهاند ( دقت کنید که نوع داده کوتاه یک یا نهایتاً دو بایت است و مقادیر بزرگتر از ظیف خود باعث ایجاد خطا می شود ) تا به صورت decimal ( دهدهی متداول ) چاپ شوند
مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main()
{
unsigned short a = 300;
printf("%hd", a);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال بالا a یک کوتاه بدون علامت است که با تعیین کننده نوع صحیح و پیشوند h به خروجی خطدستوری فرستاده می شود
{{چپچین}}
l
{{پایان چپچین}}
برای نوع اعداد صحیح بلند ؛ البته شما می توانید اعداد اوکتال یا هگزادسیمال را نیز با طول بلند و تعیینکننده فرمت صحیح به مبنای ده برگردانده و در رابط خطدستوری از آن استفاده کنید . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main()
{
long a = 0xff;
printf("%ld", a);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال بالا نوع داده a بلند است و در آن ff را به شکلی که نوشته شده ( و باید بشود ) ذخیره نمودهایم . در هنگام چاپ با مقدار ۲۵۵ رو به رو خواهیم شد ( دقت کنید که ff در مبنای ۱۰ می شود ۲۵۶ ولی چون ۰ نیز یک مقدار است می شود ۲۵۵ )
{{چپچین}}
ll
{{پایان چپچین}}
برای تعیین طول داده صحیح خیلی بلند
{{چپچین}}
L
{{پایان چپچین}}
برای تعیین طول داده اعشاری خیلی بلند که می شود Lf یا LF یا Lg یا LG
{{چپچین}}
z
{{پایان چپچین}}
برای تعیین طول داده از نوع size_t که در فایل سرآیند stddef تعریف شده است
{{چپچین}}
j
{{پایان چپچین}}
برای تعیین طول داده از نوع intmax_t که در فایل سرآیند inttypes تعریف شده است
{{چپچین}}
t
{{پایان چپچین}}
برای تعیین طول داده از نوع ptrdiff_t که در قایل سرآیند stddef تعریف شده است
{{چپچین}}
H
{{پایان چپچین}}
به عنوان پیشوند برای A و a و E و e و f و F و G و g که قسمت اعشاری را ۳۲ بیت در نظر می گیرد Decimal32_
{{چپچین}}
D
{{پایان چپچین}}
به عنوان پیشوند برای A و a و E و e و f و F و G و g که قسمت اعشاری را ۶۴ بیت در نظر می گیرد Decimal64_
{{چپچین}}
DD
{{پایان چپچین}}
به عنوان پیشوند برای A و a و E و e و f و F و G و g که قسمت اعشاری را ۱۲۸ بیت در نظر می گیرد Decimal128_
برخی از تعیین کنندههای طول آرگومان در استاندراد باید خارج از دو دابل کوت نوشته شوند و البته باید فایل سرآیند inttypes.h را ضمیمه برنامه خود نمائید
{{چپچین}}
PRId32
PRId64
PRIi32
PRIi64
PRIu32
PRIu64
PRIx32
PRIx64
{{پایان چپچین}}
اولی برای اعداد صحیح ۳۲ بیت و دومی برای صحیح ۶۴ بیت و بعدی برای اعداد صحیح ( منفی و مثبت ) ۳۲ بیت و بعدی مانند قبلی ولی ۶۴ بیت ، بعدی برای اعداد صحیح بدون علامت ۳۲ بیتی و بعدی همان برای ۶۴ بیتی و بعدی برای اعداد هگزادسیمال ۳۲ بیت و بعدی همان برای ۶۴ بیتی . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
#include <inttypes.h>
int main()
{
int a = 45;
printf("%" PRId64 "\n", a);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال بالا متغیر از نوع صحیح a با مقدار ۴۵ تعریف شده است و تابع کتاخانهای printf از PRId64 برای تعیینکننده فرمت و تعیین کننده نوع آرگومان استفاده شده و آرگومان a به آن فرستاده شده است که پس از کامپایل و اجرا در خروجی عدد 45 را نمایش می دهد
== امنیت زنجیرهای ==
پیش از آغاز نوشتن تابعها و ماکروها لازم است مطلبی کلی را بدانید که در دانش رایانه و برنامهنویسی ( و حتی الکترونیک که اینجا به آن نمی پردازیم ) دانستن آن ضروری است . در دانش رایانه ، زنجیره یا ریسمان به کوچکترین مجموعه دستور العملهای یک برنامه می گویند که توسط پردازنده مرکزی ( واحد پردازشگر مرکزی / سیپییو CPU ) قابل اجرا است . اما در دانش برنامهنویسی در زبانهایی که تابعگرا هستند ،امنیتِ زنجیرهپردازه یا امنیت زنجیرهای بدین مفهوم است که تابع اگر در هنگام فراخوانی ، توسط چند سند برنامه ( متن برنامه Source Code File ) باعث رفتار تعریفنشده ، ویرانی دادهها یا شرایط رقابتی نشود از نظر زنجیرهای یا ریسمانی ، امن است و در غیر این صورت ، ناامن . بدین مفهوم که اگر تابع در چند زنجیره سند منبع ( سند برنامه ) فراخوانده شود باعث تداخل آنها با هم نمی شود تا : ۱ - رفتار تعریفنشدهای رخ ندهد ۲ - مقادیر و موجودی متغیرها ( که میتوانند ماکرو یا تابع باشند ) دستخوش تغییر یا نابودی نشود ۳ - طبق استاندارد و زبان ، در سندها و فایلهایی که مجاز به اشتراک و استفاده چندباره آن در سندها نیستیم از آنها استفاده نکنیم و یا آنها را مستقل تعریف کنیم ( نظیر استفاده از کلیدواژه static برای تابعها که پیشتر در مبحث کلاسهای ذخیره مطرح کردیم ) دقت کنید که اگر شرایط رقابتی ، پیش بیاید رفتارهای پیشبینی نشده و ناخوشایند برای برنامهنویس پیش می آیند که برنامه نوشته شده را دچار خطا و باگ Bug می کند
در این کتاب ، فقط توابع و ماکروهایی که از نظر امنیت زنجیرهای ، امن نیستند می نویسیم امن نیست ( از نظر امنیت زنجیرهای ) و در مورد مابقی ، آن را نمی نویسیم ( معلوم است که امن است )
== تابع printf ==
نمای کلی تابع کتابخانهای printf و تابعهای مشابه آن بدین شکل است :
{{چپچین}}
printf(const char * format-string, argument-list);
{{پایان چپچین}}
تابع printf سرنام print formatted و به معنی چاپ فرمت شده ( قالببندی شده ) می باشد که یک یا چند رشته را دریافت می نماید که داخل آنها تعیینکنندههای فرمت و تعیین کنندههای مختلف می توانند همان طور که تا بدینجا نوشته شد آن را آماده پذیرش آرگومان یا آرگومانها نموده که آرگومان(ها) را به آن می فرستیم ( که حتی می توانند مقدار باشند ) تا جایگزین تعیینکنندههای فرمت شود( شوند )
اگر تعداد آرگومانهای فرستاده شده از تعیینکنندههای فرمت بیشتر باشند ، آنهایی که اضافه هستند نادیده گرفته می شوند اما اگر تعیینکنندههای فرمت بیشتر از آرگومانهای فرستاده شده باشند ، نتیجه تعریف نشده است ( مطابق با استاندارد سی ) . تابع printf از نوع داده صحیح int تعریف شده است و اگر با موفقیت بتواند به اتمام برسد یک مقدار مثبت را که تعداد کاراکترهای دریافت شده می باشد را باز می گرداند ( دقت کنید که حتی اعداد و دنبالههای فرار نیز کاراکتر حساب می شوند ) ولی اگر ناموفق باشد یک مقدار منفی را باز می گرداند . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main()
{
printf("%d", printf("This is a string\n"));
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
مثال بالا ابتدا printf داخلی را ارزیابی کرده که یک رشته است و آن را چاپ می کند و سپس بیرونی و اولی را که ۱۷ کاراکتر در رشته ما ( به همراه دنباله فرار خط شکسته ) وجود دارد و آن را در رابط خطدستوری نمایش می دهد
'''دقت کنید :'''
همان طور که گفته شد اگر تعداد تعیینکنندههای فرمت بیشتر از آرگومانها باشد ، نتیجه تعریفنشده است ( در استاندارد سی ) ولی کامپایلر قدرتمندی همچون GCC به شما هشدار خواهد داد ؛ اما برنامه کامپایل شده و اجرا می شود ولی دارای رخنهپذیری امنیتی خواهد بود که هکرها میتوانند از روش حمله رشته فرمت شده استفاده کرده و به دادههای برنامه شما و سیستم عامل دسترسی پیدا کنند . جهت اطلاعات بیشتر صفحه زیر را مطالعه کنید :
[https://en.wikipedia.org/wiki/Uncontrolled_format_string Format string attack]
همچنین نوشتن تعیینکننده فرمت n به صورت n% که در همین مبحث نوشته شد می تواند باعث حمله رشته فرمت شده بشود . که باید بسیار مراقب استفاده آن به صورت صحیح باشید . از طرفی این تعیینکننده فرمت باعث ایجاد کامل شدن تورینگ می شود . جهت اطلاعات بیشتر به صفحه زیر مراجعه کنید :
[https://en.wikipedia.org/wiki/Turing-complete Turing-complete ]
== تابع scanf ==
نمای کلی تابع کتابخانهای scanf و تابعهای مشابه آن به شکل زیر است :
{{چپچین}}
scanf(const char *format-string, argument-list);
{{پایان چپچین}}
تابع scanf سرنام scan formatted به معنی اسکن فرمت شده ( قالببندی شده ) قادر است تا از ورودی استاندارد ( معمولاً صفحهکلید Keyboard ) مقادیری را دریافت نموده و در متغیرها و آرگومانهای خود جای بدهد و آنها را مقداردهی نماید . شکل کلی رشته فرمتشده دریافت کنندههایی مثل scanf و تابعهای مشابه آن به شرح زیر است :
{{چپچین}}
%[parameter]*[width][length]type
{{پایان چپچین}}
پارامتر در scanf همانند printf می باشد . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main()
{
int a, b;
scanf("%2$d%1$d", &a, &b);
printf("%d & %d",a , b);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
همان طور که می بینید با نوشتن شماره و علامت دلار ابتدا b دریافت می شود و سپس a ولی در خروجی ابتدا a چاپ می شود و سپس b . '''دقت کنید''' که تابع scanf برای دریافت و وارد کردن مقدار داخل متغیر از علامت آدرسدهی استفاده می کند و علت آن نحوه تعریف آن در فایل سرآیند stdio می باشد که با اشارهگرها نوشته می شود
برای اینکه پهنا و عرض یک آرگومان را جهت دریافت تعیین کنید باید بعد از علامت درصد ( % percent ) ، یک عدد را بنویسید که به همان تعداد کاراکتر ( چه حرفی و چه عددی ) دریافت خواهد شد و نه بیشتر . '''دقت کنید''' که علامت ستاره ( استریسک * ) در تابع scanf پهنا را تعیین نمی کند بلکه باعث می شود تا تابع scanf یک یا چند کاراکتر را نادیده گرفته و در آرگومانهای فرستاده شده ذخیره نکند
پس با نوشتن مقدار پس از علامت درصد تعیین می کنیم که تابع ، چند کاراکتر ( عددی یا حرفی ) را دریافت کند . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
int i;
printf("Enter a number :\n");
scanf("%2d", &i);
printf("Your number is : %d\n", i);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال بالا شما می توانید به عنوان مثال یک عدد ۵ رقمی را وارد کنید ولی فقط ۲ رقم اول آن دریافت می شود
در تابع scanf و تابعهای مشابه آن می توان از scanset ها استفاده نمود . یک جفت کروشه باز و بسته می توانند تعیین کنند که تابع scanf و تابعهای مشابه آن فقط کاراکترهای خاصی را دریافت نمایند و یا کاراکترهایی را از قلم بیاندازند . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
char str[128];
printf("Enter a string: ");
scanf("%[A-Z]s", str);
printf("You entered: %s\n", str);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال بالا فقط تا زمانی که تابع scanf به کاراکترهای A تا Z برسد آنها را اسکن می کند و در رشته str ذخیره می کند و اگر به کاراکتر دیگری برسد متوقف می شود . '''دقت کنید''' که اگر اولین کاراکتر ورودی شما یک حرف کوچک باشد ( به عنوان مثال ) همان جا عمل اسکن متوقف می شود . دقت کنید که تابع scanf توسط اشارهگرها تعریف شده است و توسط عملگر آدرسدهی مقدار و موجودی را دریافت نموده و در آرگومان متناظر ذخیره می کند بنابراین برای رشته که یک اشارهگر است از عملگر آدرسدهی استفاده نمی کنیم ( حتی اگر از کاراکتر یا آرایهای استفاده کنیم ؛ چون می دانید که آرایهها توسط اشارهگرها تعریف می شوند )
همچنین باید بدانید که اگر داخل جفت کروشه باز و بسته ، پیش از کاراکتر یا کاراکترها از علامت کرات ^ استفاده کنید تا زمانی که تابع scanf به آن نرسیده باشد دادهها را دریافت کرده و در آرگومان متناظر خود ذخیره می کند . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
char str[100];
printf("Enter a string: \n");
scanf("%[^p]s", str);
printf("You entered: %s\n", str);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال بالا می توانید متن مقابل را وارد کنید : C is more powerful than python ولی با جمله C is more powerful than مواجه خواهید شد چرا که scanf به کاراکتر p رسیده است
ضمناً '''دقت کنید''' که در اسکن کردن متونی که دارای فضای سپید ( مثل اسپیس Space ) هستند استفاده از scanset ها ضروری است . چرا که تابع scanf و تابعهای مشابه آن فضای سفید را به صورت پیشفرض دریافت نمی کنند . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
char a[100];
scanf("%[^\n]s", a);
printf("Your text is : %s\n", a);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال بالا اگر از scanset ـی که نوشته شده [n\^] استفاده نکنید نمی توانید از اسپیس استفاده کنید و با اولین اسپیس رشته شما شکسته می شود و scanf دیگر اسکن نمی کند
'''نکته :''' علامت هایفن یا همان خط تیره ( که به اشتباه به آن دش dash نیز می گویند ) برای بیان یک طیف است اما اگر بخواهید خود آن را برای اسکن شدن یا نشدن تعیین کنید هر کامپایلر از روش خاص خود استفاده می کند و باید به راهنمای کامپایلر خود مراجعه کنید
'''دقت کنید''' که فضای سپید مثل اسپیس space یا جدول افقی Tab در تابع scanf و تابعهای مشابه آن باعث می شود تا تابع از ورودی بخواند اما آن را در آرگومانی ذخیره نکند . از این تکنیک می توانید در قسمتهایی از کد خود که خط شکسته دارند استفاده کنید ( چون خط شکسته باعث می شود تا scanf و تابعهای مشابه آن ، خط شکسته را به عنوان یک کاراکتر دریافت کرده و دیگر متن شما را دریافت نکنند )
'''یادآوری :''' علامت استریسک باعث می شود تا کاراکتر یا کاراکترهایی نادیده گرفته شوند و در آرگومانها ذخیره نشوند
مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
char a, b;
printf("enter a character\n");
scanf("%c", &a);
printf("enter another character\n");
scanf(" %c%*[^\n]",&b);
printf("Your characters were %c and %c\n", a, b);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال بالا کاراکتر a بدون هیچ مشکلی دریافت می شود اما چون Enter را می زنید و تابع printf نیز خط را می شکند کاراکتر b باید با ترفند دریافت شود که ابتدا یک اسپیس وارد می کنیم و سپس خط شکسته را نادیده گرفته و کاراکتر b را دریافت می نمائیم تا در خروجی خطدستوری نمایش داده شود
مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
char a[100], b[100];
printf("Enter a text :\n");
scanf("%[^\n]s", a);
printf("Your first text is : %s\n", a);
printf("Enter second text :\n");
scanf(" %[^\n]s", b);
printf("Yurt second text is : %s\n", b);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
مثال بالا نیز همانند مثال قبل است با این تفاوت که رشتهها را به جای کاراکترها ذخیره می کنیم . در رشته اول scanf تا زمانی که به خط شکسته نرسیده باشد اسکن می کند و در رشته دوم ابتدا یک اسپیس نوشتهایم تا خط شکسته قبلی ذخیره نگردد و خط شکسته را نادیده گرفتهایم
تابع scanf در صورت موفقیت آمیز بودن کارکرد خود ، یعنی دریافت و مقداردهی آرگومان یا آرگومانها به همان تعداد ، مقداری صحیح و مثبت ، باز می گرداند و در صورتی که مقداری را دریاقت نماید ولی نتواند آن را مقداردهی کند آن را محاسبه نخواهد کرد . ضمناً اگر هیچ کدام از مقادیر ، دریافت و مقداردهی نشوند مقدار 0 را باز میگرداند . و در صورتی که کارکرد آن موفقیتآمیز نباشد یک ماکروی EOF ( سرنام End of File ) که پائینتر یک مبحث برای آن موجود است و بیشتر توضیح دادهایم باز می گرداند
'''دقت کنید :''' که تابع scanf باید به تعداد و اندازه پارامترهای تعیین کننده ، مقدار عددی یا حرفی و رشتهای دریافت کند و در صورتی که آرگومانهای بیشتری بنویسید ، برنامه شما رفتار تعریفنشده بروز خواهد داد و یا احتمالاً برنامه شما دچار شکست و توقف می شود . ضمناً اگر تعیینکننده نوع با نوع دادهای که وارد میشود یکسان نباشد نیز برنامه شما رفتار تعریفنشده بروز خواهد داد . مخصوصاً در مورد رشتهها ؛ اگر تعداد تعیین شده ، کمتر از تعداد کاراکترهای وارد شده باشد بافر سرریز می شود که برای این کار ترفندهای مختلفی وجود دارد که سادهترین آن تعیین پهنا و عرض رشته است که کافی نیست ولی برای تعیین آن باید از تابعهای کتابخانهای دیگری استفاده کرد که در مبحث فعلی موجود نیستند و در فصول فایلهای سرآیند دیگر موجودند که نوشته خواهند شد . ضمن اینکه اگر به درستی از تابع scanf استفاده نکنید امکان حمله رشته فرمت شده وجود دارد ؛ نظیر اینکه تعداد تعیین کنندههای نوع ، بیشتر از تعداد آرگومانها باشند ( همانند printf که در آنجا آدرسش را گذاشتیم ؛ یعنی هکرها با وارد کردن کاراکترهایی خاص به حافظه برنامه یا سیستم عامل و سیستم دسترسی پیدا می کنند )
'''نکته :''' در بسیاری از خطاهای scanf یا تابعها و ماکروهای دیگر ، مقدار ماکروی errno ( سرنام error number به معنی شماره خطا ) مقداردهی می شود که با توجه به سیستم عامل و کامپایلر خود و بررسی شماره خطا می توانید خطا را پیدا نموده و بر طرف نمائید که در فصل فایل سرآیند errno نوشته خواهد شد
== تابع sprintf ==
تابع sprintf سرنام string print formatted به معنی چاپ رشته فرمتشده همانند تابع printf می باشد به غیر از اینکه متنی را در خروجی خطدستوری نمایش نمی دهد بلکه آن را ذخیره می کند که می توان با تابع printf ( به عنوان مثال ) آن را چاپ نمود . نمای کلی تابع sprintf به شکل زیر می باشد :
{{چپچین}}
sprintf(char *buffer, const char *format, arguments)
{{پایان چپچین}}
ابتدا نام رشتهای که قرار است به عنوان بافر ، دادهها را بگیرد می نویسیم ، سپس رشته خودمان را به همراه تعیینکنندههای فرمت ( در صورت لزوم ) می نویسیم و سپس آرگومانها را که خود می توانند حتی مقدار باشند می نویسیم که در نهایت در بافر ذخیره می شود . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main()
{
char buff[50];
char str[] = "string";
sprintf(buff, "This is a %s", str);
printf("%s", buff);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
ابتدا یک رشته به نام buff مخفف buffer اعلان نمودیم . سپس یک رشته به نام str مخفف string و به معنی رشته با مقدار string تعریف نمودیم . سپس توسط تابع کتابخانهای sprintf رشته This is a را به همراه تعیینکننده فرمت رشته که آرگومان آن str است در buff ذخیره کردیم ( که می شود This is a string یعنی این یک رشته است ) و سپس توسط تابع کتابخانهای printf مقدار buff را در خروجی خطدستوری چاپ نمودیم . از تمام تعیینکنندههای فرمت در printf در sprintf نیز می توانید استفاده کنید
== تابع sscanf ==
تابع sscanf سرنام string scan formatted به معنی اسکن رشته فرمتشده ، رشته موجود در متن منبع برنامه ( source code ) را دریافت می نماید و قسمتهای مختلف آن را اسکن می کند و در آرگومانها ذخیره می کند . نمای کلی تابع کتابخانهای sscanf به شکل زیر است :
{{چپچین}}
sscanf(const char *buffer, const char *format, arguments-list);
{{پایان چپچین}}
مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main()
{
char str[] = "This is a string with 2 numbers : 5 and 9";
char str2[10], str3[10], str4[10], str5[10], str6[10], str7[10];
char c1, c2;
int i1, i2, i3;
sscanf(str, "%s %s %c %s %s %d %s %c %d %s %d", str2, str3, &c1, str4, str5, &i1, str6, &c2, &i2, str7, &i3);
printf("%s %s %c %s %s %d %s %c %d %s %d", str2, str3, c1, str4, str5, i1, str6, c2, i2, str7, i3);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال بالا یک رشته به نام str تعریف نمودهایم که یک رشته است که می گوید این یک رشته است با ۲ عدد : ۵ و ۹ سپس ۶ رشته ۱۰ کاراکتری که مطمئن هستیم رشتهها بیشتر از ۱۰ کاراکتر ندارند ، اعلان نمودهایم . سپس ۲ کاراکتر ، اعلان نمودهایم و سپس نیز ۳ عدد داده صحیح را اعلان نمودهایم . تابع کتابخانهای sscanf رشته str را می گیرد و قسمتهای مختلف آن را اسکن می کند و به ترتیب در آرگومانهای تعیین شده ( که متغیرهایی هستند که بالاتر نوشتیم اعلان شدهاند ) ذخیره کردهایم . در نهایت با تابع printf دادههای ذخیره شده را در خروجی خطدستوری چاپ نمودهایم . دقت کنید که scanset ها در sscanf نیز برقرار و کارا هستند
همچنین تابع sscanf در صورت عملکرد موفقیتآمیز مقداری بزرگتر یا مساوی 0 را باز می گرداند و در غیر این صورت مقدار EOF سرنام End Of File به معنی پایان فایل یا پایان سند . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main()
{
char str[] = "This is a string with 2 numbers : 5 and 9";
char str2[10], str3[10], str4[10], str5[10], str6[10], str7[10];
char c1, c2;
int i1, i2, i3;
int itemsread = 0;
itemsread = sscanf(str, "%s %s %c %s %s %d %s %c %d %s %d", str2, str3, &c1, str4, str5, &i1, str6, &c2, &i2, str7, &i3);
printf("%s %s %c %s %s %d %s %c %d %s %d\n", str2, str3, c1, str4, str5, i1, str6, c2, i2, str7, i3);
printf("Items read are : %d\n", itemsread);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در این مثال تابع کتابخانهای sscanf مقدار ۱۱ را باز می گرداند . ۲ رشته سپس ۱ کاراکتر سپس ۲ رشته و سپس ۱ عدد و دوباره ۱ رشته و سپس ۱ کاراکتر سپس ۱ عدد و بعد ۱ رشته و ۱ عدد دیگر که مجموعاً می شود ۱۱ مورد و آیتم دریافت شده
== تابع vprintf ==
تابع vprintf سرنام variadic print formatted به معنی پرینت فرمت شده تعداد متغیر ، تابعی همانند printf را توسط کاربر می سازد . فقط این تابع نیاز به ماکروها و توابعی دارد که در فایل سرآیند stdarg تعریف شدهاند و ما در اینجا به صورت مختصر توضیح می دهیم تا در مبحث مربوطه مفصلاً آنها را تشریح کنیم . va_list یک ماکرو است که فهرستی ( لیستی ) از آرگومانهایی که قرار است ایجاد شوند را در یک متغیر ایجاد می کند . سپس تابع va_start با ۲ آرگومان که اولی همان آرگومانهای va_list است را دریافت می کند تا امکان دسترسی به آن را فراهم کند و دومی آخرین آرگومان ثابت و غیر متغیر تابع را دریافت می کند تا تابع متغیر آغاز به کار کند و va_end آرگومان ساخته شده را می گیرد تا آن را خاتمه دهد ( در تابعی با تعداد پارامترهای متغیر ) . به مثال زیر دقت کنید :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
#include <stdarg.h>
void PrintFormatted(char *string, ...)
{
va_list args;
va_start(args, string);
vprintf(string, args);
va_end(args);
return;
}
int main()
{
PrintFormatted("%d variable argument\n", 1);
PrintFormatted("%d variable %s\n", 2, "arguments");
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال ساده بالا ابتدا stdio را ضمیمه برنامه خود نمودهایم و سپس stdarg را تا تابعی با تعدادِ آرگومانهای پذیرنده متغیر تعریف کنیم . تابع پوچ PrintFormatted یک پارامتر رشته به نام string دارد و سه نقطه ( ellipsis ) که تعداد پارامترهای متغیر را نشان می دهد و تعیین می کند . سپس va_list متغیری برای کار با آرگومانهای دریافت شده با نام args را تعریف کرده است . سپس va_start آرگومانهای فرستاده شده و آرگومان تابع را پذیرفته است . سپس vprintf هر رشتهای را که به آن فرستاده شود در args ذخیره می کند و پرینت می نماید و در پایان va_end عمر args و تابع با تعداد پارامترهای متغیر را پایان می دهد . حالا به جای printf می توانیم از تابع vprintf استفاده کنیم که ابتدا یک رشته را به آن فرستادهایم که اولین قسمت آن یک متغیر عددی صحیح است که تعیین کننده فرمت آن را نوشته و در پایان به آن ۱ را فرستادهایم . دومی نیز به همین شکل است به استثنای اینکه آخرین آرگومان فرستاده شده به آن ( قبل از خط شکسته ) یک رشته است ( "arguments" ) '''دقت کنید :''' تعیین کنندههای فرمت در vprintf همانند printf و sprintf میباشند
== تابع vsprintf ==
تابع vsprintf سرنام variadic string print formatted تلفیقی از vprintf و sprintf می باشد . نمای کلی ایجاد تابع vsprintf به شکل زیر است :
{{چپچین}}
vsprintf(char * buffer , const char * format , arguments-list)
{{پایان چپچین}}
ابتدا باید تابعی با تعداد پارامترهای متغیر تعریف نمود که در آن vsprintf یک متغیر اشارهگر را می پذیرد تا متن در آن ذخیره شود ، سپس تعیینکنندههای فرمت و در نهایت فهرست آرگومانهای فرستاده شده را . بدین ترتیب اگر متنی را با تعیین کنندههای فرمت به همراه آرگومانهای متناسب به vsprintf بفرستیم در متغیر اشارهگر ذخیره می شود که می توانیم آن را با یک تابع کتابخانهای مثل printf چاپ کنیم . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
#include <stdarg.h>
void vspfunc(char * str, char * fmt, ...)
{
va_list argptr;
va_start(argptr, fmt);
vsprintf(str, fmt, argptr);
va_end(argptr);
return;
}
int main(void)
{
char buff[50];
int c = 299792458;
double pi = 3.141592;
char string[] = "string";
vspfunc(buff, "%d %f %s", c, pi, string);
printf("%s", buff);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال بالا ابتدا stdio.h و stdarg.h را ضمیمه برنامه خود نمودهایم تا از ماکروها و تابعهای کتابخانهای آنها در برنامه خود استفاده کنیم . سپس یک تابع پوچ با نام vspfunc مخفف vsprintffunction تعریف نمودهایم که یک متغیر اشارهگر از نوع کاراکتر به نام str مخفف string و یکی هم به نام fmt مخفف format دارد به همراه سه نقطه که نشانگر داشتن تعداد پارامترهای متغیر است . داخل تابع ابتدا به کمک ماکروی va_list متغیری که قرار است آرگومانها را پذیرا شود تعریف نمودهایم ( argptr ) سپس برای کار با آرگومانهای فرستاده شده و آرگومانهای تابع از va_start استفاده کردهایم . سپس تابع vsprintf سه آرگومان را می پذیرد . اولی اشارهگری که در آن دادهها ذخیره شوند ؛ دومی تعیینکنندههای فرمت و سومی فهرست آرگومانهای فرستاده شده . سپس va_end عمر argptr را پایان می دهد . چون تابع ، پوچ است مقداری را باز نمی گرداند . داخل تابع اصلی برنامه main یک رشته به کمک آرایهای از کاراکتر با نام buff مخفف buffer با پنجاه عنصر اعلان نمودهایم . یک متغیر صحیح که سرعت انتشار نور در خلأ را در خود ذخیره کرده یک متغیر اعشاری با دقت دو برابر که عدد پای ( پی ) را در ذخود ذخیره کرده و یک رشته که string را در خود ذخیره کرده . سپس آنها را به کمک تابع کتابخانهای vsprintf در buff ذخیره نمودهایم و با تابع کتابخانهای printf در خروجی خطدستوری چاپ نمودهایم و تابع با موفقیت به پایان می رسد
== تابع putchar ==
تابع کتابخانهای putchar سرنام put character به معنی کاراکتر را قرار بده یک کاراکتر را به خروجی خطدستوری می فرستد . نمای کلی ایجاد تابع کتابخانهای putchar به شکل زیر است :
{{چپچین}}
putchar(unsigned char);
{{پایان چپچین}}
برای استفاده از این تابع یا می توانید یک کاراکتر را داخل تابع بنویسید تا چاپ شود یا یک داده کاراکتری تعریف شده را به آن بفرستید . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
putchar('J');
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
که در خروجی خطدستوری کاراکتر J را چاپ می کند ؛ همچنین می توانید مقدار و موجودی J را داخل یک داده کاراکتری ذخیره کنید و سپس آن را به putchar بفرستید . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
char c = 'J';
putchar(c);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
یک مثال دیگر برای کامل کردن کاربرد تابع putchar :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
char ch = 'A';
for(ch = 'A'; ch <= 'Z'; ch++)
{
putchar(ch);
putchar('\n');
}
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
ابتدا یک کاراکتر با مقدار و موجودی کاراکتر A با نام ch تعریف نمودهایم . سپس با حلقه for کاراکتر ch را از A تا زمانی که مقدار کمتر و مساوی Z باشد به همراه یک خط شکسته در خروجی خطدستوری قرار دادهایم که همان حروف الفبای انگلیسی می باشد
== تابع getchar ==
تابع کتابخانهای getchar مخفف get character به معنی « کاراکتر را بگیر » برای دریافت یک کاراکتر از ورودی استاندارد ( معمولاً صفحهکلید Keyboard در ورودی خطدستوری ) می باشد . نمای کلی ایجاد تابع getchar بدین شکل می باشد :
{{چپچین}}
getchar(void);
{{پایان چپچین}}
تابع getchar آرگومانی را نمی پذیرد و مقدار آن فقط در دادههای صحیح قابل ذخیره است ( که کامپایلر به صورت خودکار نقش کاراکتر را به آن می دهد )
خروجی getchar باید یک کاراکتر باشد و اگر EOF یعنی End Of File را بازگرداند یعنی یا فایل به پایان رسیده است یا خطایی در وارد کردن کاراکتر وجود داشته است . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include<stdio.h>
int main()
{
int ch;
ch = getchar();
printf("The entered character is : %c", ch);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
ابتدا یک داده از نوع صحیح با نام ch اعلان نمودهایم ؛ سپس ch توسط getchar که مقداری از نوع کاراکتر دریافت می کند تعریف می شود و مقدار و موجودی آن ، همان مقدار و موجودی کاراکتری وارد شده است و سپس در خروجی خطدستوری چاپ می شود که کاراکتر وارد شده توسط شما کاراکتر ''x'' می باشد که ''x'' همان کاراکتر وارد شده توسط کاربر می باشد
== تابع puts ==
تابع کتابخانهای puts سرنام put string به معنی رشته را قرار بده ، یک رشته را در خروجی استاندارد که معمولاً محیط خطدستوری سیستم عامل است می نویسد . نمای کلی ایجاد تابع puts به شکل زیر می باشد :
{{چپچین}}
puts(const char * string);
{{پایان چپچین}}
می توانیم یک رشته را داخل آن بنویسیم یا نام یک متغیر از نوع رشته را که تعریف شده است به آن بفرستیم تا در خروجی خطدستوری نمایش دهد .
'''نکته :''' تابع puts به خودی خود ، در پایان رشته ، خط را می شکند و وارد خط بعدی می شوید
مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include<stdio.h>
int main()
{
puts("Hello World!");
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در قطعه کد بالا رشته !Hello World را نمایش دادهایم
مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include<stdio.h>
int main()
{
char ch[] = "This is a string";
puts(ch);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال و قطعه کد بالا یک رشته به نام ch را تعریف کردهایم . سپس با تابع کتابخانهای puts مقدار و موجودی ch را نمایش دادهایم
همچنین اگر puts را داخل یک داده صحیح ذخیره کنید ، هم متن نمایش داده می شود و هم تعداد کاراکترهای داخل رشته puts ذخیره می شود . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include<stdio.h>
int main()
{
int n = puts("This is a string");
printf("%d", n);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
'''نکته :''' تعیینکنندهای فرمت در puts عمل نمی کنند و در صورت استفاده ، کامپایلر از شما خطا می گیرد
== تابع gets ==
تابع کتابخانهای gets سرنام get string به معنی رشته را بگیر ، از ورودی استاندارد که معمولاً صفحهکلید است رشتهای را دریافت می کند و سپس آن را در بافر ذخیره می کند ( که یک اشارهگر است ) . نمای کلی ایجاد تابع کتابخانهای gets به صورت زیر است :
{{چپچین}}
gets(char * buffer);
{{پایان چپچین}}
دقت کنید که از تعیینکنندههای فرمت نمی توانید در gets استفاده کنید . تابع gets با یک خط جدید ( شکسته شدن خط ) پایان می یابد که آن را به صورت یک تهی NULL ذخیره می کند و اگر عملیات دریافت با موفقیت انجام شود ، رشته ذخیره شده در خود را باز می گرداند و اگر یک اشارهگر تهی NULL Pointer را باز گرداند یعنی خطایی رخ داده و در صورتی که رشتهای وارد نشده باشد EOF سرنام End Of File را باز می گرداند
'''نکته :''' استفاده از تابع gets ریسک پذیر است ؛ چرا که چک نمی کند که رشتهای که شما اعلان کردهاید چند عنصری است و اگر از مقدار تعیین شده بیشتر باشد ، بافر Buffer سرریز می شود و آنچه که باز می گرداند تعریفنشده است
مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include<stdio.h>
int main()
{
char ch[30];
printf("Enter a string : \n");
gets(ch);
printf("%s", ch);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در قطعه کد بالا یک رشته ۳۰ کاراکتری با نام ch را اعلان نمودهایم . سپس در رابط خطدستوری چاپ کردهایم یک رشته را وارد کنید و خط را شکستهایم . سپس تابع gets رشته ch را از کاربر دریافت می کند و در نهایت تابع printf آنچه را که وارد کردهاید در خروجی خطدستوری چاپ می کند
'''
نکته مهم :''' تابع gets در استاندار C11 و از آن به بعد ، حذف شده است . اگر کامپایلر شما خطا گرفت یا اگر کامپایلر خود را تنظیم کردید تا از استاندارد جدید استفاده کند و از شما خطا گرفت ، علتش همین است . توصیه شده است که به جای gets از fgets استفاده کنید که در ادامه خواهیم نوشت
== ماکروهای stdin و stdout ==
در قسمت بعدی ماکروی FILE را خواهیم نوشت که به برنامهنویس اجازه میدهد تا جریان فایلی را ایجاد کند تا فایلی ساخته شود و آن را بخوانیم یا درون آن چیزی بنویسیم یا هر دوی اینها . اما ماکروهای stdin سرنام standard iput به معنی ورودی استاندارد و stdout سرنام standard output به معنی خروجی استاندارد برای ما این امکان را فراهم میآورند تا از ورودی و خروجی استاندارد ( در رایانه صفحهکلید و نمایشگر ) به جای جریان فایل در تابعهای کتابخانهای که فایل را میخوانند و در آن مینویسند از صفحهکلید و نمایشگر استفاده کنیم . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
fprintf(stdout, "%s", "string");
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در قطعه کد بالا از تابع کتابخانهای fprintf سر نام file print formatted به معنی چاپ فرمت شده فایل استفاده کردهایم اما به جای اینکه با فایلی سر و کار داشته باشیم و بخواهیم طبق معمول در فایلی چیزی را بنویسیم به جای نام فایل نوشتهایم : stdout
و سپس تعیینکننده فرمت تعیین کرده است که یک رشته نوشته شود ( در اینجا نمایش داده شود ) و به جای آن رشته string را به عنوان آرگومان به تابع فرستادهایم . به همین شکل می توان به جای یک تابع کتابخانهای که از فایل ، اطلاعات را می خواند ، بنویسیم : stdin و از صفحهکلید ، اطلاعات را دریافت کنیم
== ماکروی نوع داده FILE ==
به ورود و خروج دادهها از گذرگاه ( مثل برنامه ) جریان داده گفته می شود . همچنین به ورود و خروج دادهها به داخل فایل ، جریان فایل گفته می شود . ماکروی FILE با یک علامت استریسک و یک شناسه برای نام فایلی که می خواهیم بسازیم ، در برنامه ( زبان برنامهنویسی سی ) جریان فایلی را می سازد و آن را آماده استفاده می کند . نمای کلی ایجاد جریان فایل بدین شکل است :
{{چپچین}}
FILE * const char * name-of-file
{{پایان چپچین}}
که const char * name-of-file یک رشته است که نام فایلی را که قصد استفاده از آن را داریم را تعیین می کند . مثل : FILE * fp در اینجا fp سرنام file pointer نام انتخابی ما برای فایلی که قصد استفاده از آن را داریم می باشد
== تابعهای fopen و fclose ==
تابع fopen سرنام file open به معنی فایل را باز کن ، فایلی را که ماکروی نوع داده FILE آماده کرده باشد را باز میکند و در دادهی فایل باز شده ( توسط FILE ) ذخیره می کند . تابع کتابخانهای fopen دو پارامتر را از نوع رشته پذیرا می باشد : یکی نام فایل و دیگری نحوه باز کردن فایل file opening mode ( که هر دو طبعاً باید داخل دو دابل کوت " قرار بگیرند )
به عنوان نام فایل اگر فقط نامی را بنویسید ، برنامه فایل مورد نظر شما را در همان آدرس برنامه ایجاد می کند ، اما اگر آدرس معین دیگری را به آن بدهید در همان آدرس ایجاد می کند . تابع fopen در صورت عمل موفق ، یک اشارهگر به فایل ( و به طور کلّیتر شیئای که جریان فایل را در دست دارد ) باز می گرداند و در صورت عدم موفقیت یک اشارهگر تهی NULL باز می گرداند . تابع کتابخانهای fclose نیز سرنام file close فایل باز شده را می بندد تا از حافظه موقت ( RAM ) پاک شود و فضای اشغال شده را آزاد می کند که فقط باید بین جفت پرانتز باز و بسته آن ، نام فایلی را که ایجاد کردهاید بنویسید . تابع fclose در صورت موفقیتآمیز بودن عملیات مقدار 0 را باز می گرداند و در صورت خطا EOF را باز خواهد گرداند
نحوههای باز کردن فایل بدین شرح می باشند :
{{چپچین}}
r
{{پایان چپچین}}
مخفف read که برای خواندن فایل می باشد و به اولین کاراکتر فایل اشاره می کند
{{چپچین}}
w
{{پایان چپچین}}
مخفف write که برای نوشتن در فایل می باشد و فایل را باز نویسی می کند ( یعنی اگر داخل فایل متنی موجود باشد ، آن را جایگزین می کند ) و در صورت عدم وجود فایل ، فایل را ایجاد می کند
{{چپچین}}
a
{{پایان چپچین}}
مخفف append که در ادامه فایل ، متنی را می نویسد ( یعنی اگر متنی داخل آن موجود باشد ، در ادامه آن ، خواهد نوشت ) در صورت عدم وجود فایل آن را می سازد
{{چپچین}}
r+
{{پایان چپچین}}
مخفف + read که هم می خواند و هم می نویسد اما به اولین کاراکتر فایل اشاره می کند
{{چپچین}}
w+
{{پایان چپچین}}
مخفف + write که هم می خواند و هم می نویسد و در صورت نوشتن متن را جایگزین می کند . همچنین در صورت عدم وجود فایل ، آن را می سازد
{{چپچین}}
a+
{{پایان چپچین}}
مخفف + append که هم می خواند و هم در انتهای فایل می نویسد و به آخرین کاراکتر فایل اشاره می کند . در صورت عدم وجود فایل آن را می سازد
{{چپچین}}
rb
{{پایان چپچین}}
مخفف read binary که فایل را به صورت باینری ( دودویی ) و در واقع عددی می خواند . اگر فایل ، موجود نباشد یک اشارهگر NULL باز می گرداند
{{چپچین}}
wb
{{پایان چپچین}}
مخفف write binary که فایل را به صورت باینری ( دودویی ) و در واقع عددی می نویسد و جایگزین می کند . در صورت عدم وجود فایل آن را می سازد
{{چپچین}}
ab
{{پایان چپچین}}
مخفف append binary که فایل را به صورت باینری ( دودویی ) و در واقع عددی اضافه کرده و در انتهای می نویسد . در صورت عدم وجود فایل آن را می سازد
{{چپچین}}
rb+
{{پایان چپچین}}
مخفف + read binary که فایل را جهت خوانده و نوشته شدن در مبنای دو و به صورت عددی باز می کند . اگر فایلی وجود نداشته باشد یک اشارهگر NULL باز می گرداند
{{چپچین}}
wb+
{{پایان چپچین}}
مخفف + write binary که فایل را جهت خوانده و نوشته شدن در مبنای دو و به صورت عددی باز می کند و اگر محتوایی داشته باشد آن را جایگزین می کند . در صورت عدم وجود فایل ، آن را می سازد
{{چپچین}}
ab+
{{پایان چپچین}}
فایل را جهت خواندن و اضافه کردن در مبنای دو و در واقع عددی باز می کند . در صورت عدم وجود فایل آن را می سازد
مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
FILE * fp;
fp = fopen("/home/lovelorn/Documents/mytext.txt", "w");
fprintf(fp, "%s", "string");
fclose(fp);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
'''تشریح :''' ابتدا فایل سرآیند stdio را ضمیمه برنامه خود نمودهایم تا از ماکروها و تابعهای کتابخانهای استاندارد تعریف شده در آن استفاده کنیم . سپس داخل تابع اصلی برنامه main که پارامتری ندارد یک فایل را با نام fp آماده استفاده نمودهایم . موجودی fp توسط تابع کتابخانهای fopen که در فایل سرآیند stdio تعریف شده است یک فایل متنی به نام mytext می باشد که داخل آدرس home و نام کاربری خودم lovelorn می باشد ( این نام توسط شما در سیستم عامل لینوکس تعریف می شود ) که متعلق به سیستم عامل GNU/Linux می باشد شما در ویندوز می توانید بنویسید :
{{چپچین}}
"D:/myapp/mytext.txt"
{{پایان چپچین}}
که در حالت w یعنی نوشتن قرار دارد و فایلی به نام mytext را با فرمت txt در آدرس ذکر شده ایجاد می کند . سپس توسط تابع fprintf سرنام file print formatted به معنی چاپ فرمت شده فایل که هنوز به آن نرسیدهایم اما همان طور که اشاره شد جهت نوشتن در فایل می باشد ، نام فایل را ذکر کرده و سپس توسط تعیین کننده فرمت تعیین کردهایم که یک رشته را میخواهیم بنویسیم و سپس string به معنی رشته را به آن فرستادهایم که می توانستیم نام یک متغیر تعریف شده را نیز نویسیم که باید یک رشته می بود که داخل متنی موجود وجود داشت . سپس فایل fp را توسط تابع کتابخانهای fclse بستهایم تا فضای اشغال شده توسط فایل fp در حافظه موقت RAM آزاد شود . سپس تابع main با موفقیت به پایان می رسد
== تابع fprintf ==
تابع کتابخانهای fprintf سرنام file print formatted به معنی چاپ فرمتشده فایل متنی را از برنامه دریافت نموده و در جریان فایل می نویسد . شکل کلی ایجاد تابع fprintf به صورت زیر است :
{{چپچین}}
fprintf(FILE * stream, const char * format-string, argument list);
{{پایان چپچین}}
ابتدا نام جریان فایل را نوشته ؛ سپس تعیین کنندههای فرمت را به همراه متن دلخواه ( که ضروری نیست ولی می توانید بنویسید ) می نویسیم و سپس آرگومانهایی که به تابع فرستاده می شوند تا جایگزین تعیین کنندههای فرمت شوند را می نویسیم
مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
char str[] = "Hello World!\n";
FILE * fp;
fp = fopen("mytext.txt", "w");
fprintf(fp, "%s", str);
fclose(fp);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال بالا رشته str جمله !Hello World را به همراه یک شکستن خط در خود ذخیره نموده و تعریف شده است . سپس فایل fp را آماده ایجاد نمودهایم . فایل fp توسط تابع کتابخانهای fopen با نام mytext در آدرس برنامه نوشته خواهد شد ( در صورتی که وجود نداشته باشد ساخته خواهد و در صورت وجود ، متن آن بازنویسی خواهد شد و همان طور که در مطلب پیشین گفتیم می توانید آدرس را هم بنویسید . تابع کتابخانهای fprintf که مطلب فعلی می باشد تابع fp را هدف قرار داده و یک رشته را پذیرا می باشد که رسته همان str با موجودی و مقدار !Hello World و یک شکستن خط می باشد . در پایان با تابع کتاخانهای fclose که در مطلب پیشین نوشتیم ، فایل fp زا می بندیم و فضای اشغال شده توسط آن را آزاد می نمائیم و تابع main با موفقیت به اتمام رسیده است . حالا شما می توانید فایل mytext.txt را در جایی که برنامه خود را نوشته و کامپایل نمودهاید بیابید که داخل همان متن نوشته شده به همراه یک خط شکسته در آن موجود می باشد . ضمناً تابع fprintf در صورت عملکرد موفقیتآمیز تعداد بایتهای نوشته شده را باز میگرداند و در صورت عدم موفقیت یک عدد منفی را باز میگرداند
'''نکته :''' تعیین کنندههای فرمت در fprintf همانند printf می باشند
== تابع fscanf ==
تابع fscanf سرنام file scan formatted به معنی اسکن فرمتشده فایل جهت خواندن دادهها از جریان فایل می باشد که دادهها را داخل متغیرهای آرگومانهای فرستاده شده به خود ذخیره می نماید . شکل کلی ایجاد تابع fscanf به صورت زیر می باشد :
{{چپچین}}
fscanf(FILE * stream, const char * format-string, argument-list);
{{پایان چپچین}}
ابتدا نام جریان فایلی را که قرار است خوانده شود می نویسیم ، سپس تعیین کنندههای فرمت را و سپس در پایان آرگومانهایی که قرار است جایگزین تعیین کنندههای فرمت شوند را به تابع می فرستیم
مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
char str1[10], str2[10];
float euler;
FILE * fp;
fp = fopen ("mytext.txt", "r");
fscanf(fp, "%s %s %f", str1, str2, &euler);
printf("The text in file is : %s %s %f\n", str1, str2, euler );
fclose(fp);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
ما سند و فایلی را به نام mytext.txt در آدرس و جایی که برنامه قرار دارد ایجاد نمودهایم و داخل آن نوشتهایم : Hello World! 2.71 سپس در برنامه خود ۲ رشته با نامهای str1 و str2 اعلان نمودهایم ؛ همین طور یک عدد اعشاری با نام اویلر . سپس یک فایل را با نام fp آماده استفاده نمودهایم و سپس با تابع کتابخانهای fopen فایل mytext.txt را جهت خواندن باز نمودهایم . تابع کتابخانهای fscanf که مطلب فعلی ماست فایل fp را اسکن می کند و داخل آن به دنبال ۲ رشته و یک عدد اعشاری می گردد که داخل str1 و str2 و euler ذخیره می کند . '''دقت کنید''' که رشتهها جهت دریافت شدن نیازی به عملگر آدرسدهی ( یعنی همان علامت امپرسند & ) ندارند اما جهت دریافت عدد در مثال نیز از آن استفاده نمودهایم که ضروری می باشد . سپس آنچه که در فایل mytext.txt خوانده شده است در خروجی خطدستوری نمایش داده می شود که اولین رشته Hello و دومین رشته !World و عدد اعشاری ما عدد اویلر با دقت ۲ رقم اعشار یعنی ۲٫۷۱ می باشد . در پایان نیز فایل را بسته و تابع را با موفقیت به پایان می رسانیم . مقداری که تابع fscanf باز می گرداند مقدار و تعداد دادههایی است که خوانده است ؛ اگر کمتر از دادههای داخل فایل باشد با مشکلی رو به رو شده است تا جایی که این مقدار می تواند 0 باشد ؛ اما اگر به کلی فایل را نتواند بخواند مقدار EOF را باز خواهد گرداند . '''دقت کنید''' که تعیین کنندههای فرمت در fscanf همانند scanf می باشند
== تابع getc ==
تابع کتابخانهای getc سرنام get character به معنی کاراکتر را بگیر همانند getchar می ماند اما به جای گرفتن کاراکتر از ورودی استاندارد ( صفحهکلید keyboard ) کاراکتر را از فایل می گیرد . شکل کلی ایجاد تابع getc بدین صورت می باشد :
{{چپچین}}
getc(FILE * Stream)
{{پایان چپچین}}
تابع getc از یک فایل کاراکتری را دریافت کرده و به اولین کاراکتر بعدی می رود . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
FILE * fp;
int ch;
fp = fopen("mytext.txt", "r");
ch = getc(fp);
while(ch != EOF)
{
putchar(ch);
ch = getc(fp);
}
putchar('\n');
fclose(fp);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
ابتدا فایل mytext را برای خواندن باز می کنیم ، داده صحیح ch با تابع کتابخانهای getc فایل را دریافت می کند و اولین کاراکتر آن را در ch ذخیره کرده و به سراغ کاراکتر بعدی می رود . سپس توسط حلقه while تا زمانی که به پایان فایل نرسیده کاراکتر(های) داخل فایل را نمایش داده و بعد دوباره کاراکتر بعدی را می گیرد . در پایان نیز خط را شکستهایم . که فایل تغییر نکرده و خروجی آن همان 2.71 !Hello World می باشد . تابع getc کاراکتری را که خوانده به صورت یک کاراکتر بدون علامت unsigned char که نقش یک صحیح int را ایفا می کند باز می گرداند و به کاراکتر بعدی در جریان فایل اشاره می کند . در صورت رسیدن به پایان فایل EOF را باز می گرداند و یا اگر مشکلی وجود داشته باشد یک خطا را باز می گرداند که می توان با تابعهای کتابخانهای feof و ferror آن را از هم تشخیص داد و خطای بازگردانده شده را دریافت نمود تا خطا را برطرف کرد . فایل را بسته و تابع اصلی برنامه را با موفقیت به پایان می رسانیم
== تابع putc ==
تابع putc همانند putchar میباشد و سرنام put character است جز اینکه کاراکتر دریافت شده را اخل یک فایل قرار می دهد و منتظر کاراکتر بعدی می ماند تا وارد شود و آن را داخل فایل قرار دهد . شکل کلی ایجاد تابع putc بدین صورت است :
{{چپچین}}
putc(int ch, FILE * stream);
{{پایان چپچین}}
تابع putc یک مقدار کاراکتری را که می تواند از نوع صحیح و یا کاراکتر باشد دریافت نموده و داخل جریان فایل می نویسد . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
FILE * fp;
char ch;
char brkline = '\n';
fp = fopen("alphabet.txt", "w");
for(ch='A'; ch<='Z'; ch++)
{
putc(ch, fp);
putc(brkline, fp);
}
fclose(fp);
printf("The Operation Has Finished Successfully !\n");
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال بالا فایلی را با نوع داده FILE به نام fp آماده ایجاد شدن می نمائیم . یک کاراکتر با نام ch را اعلان نموده و کاراکتر brkline را با شکستن خط تعریف می کنیم . سپس با تابع کتابخانهای fopen فایل alphabet.txt به معنی الفبا را برای نوشته شدن می سازیم . با حلقه for از جایی که ch مقدار A دارد تا جایی که مقدار آن به Z برسد ch یک واحد یک واحد افزایش می یابد و به سراغ کاراکتر بعدی می رود . تا putc مقدار ch در فایل مد نظر چاپ می کند و سپس دوباره همین تابع مقدار خط شکسته را وارد می کند تا حروف الفبای انگلیسی در خطوط مجزا در فایلی با نام alphabet در دایرکتوری و فولدری که برنامه قرار دارد ایجاد شده و ذخیره گردند . سپس فایل را می بندیم و در پایان با تابع printf در خروجی خطدستوری چاپ نمودهایم عملیات با موفقیت به پایان رسید .
تابع putc در صورت موفقیتآمیز بودن عملیات خود کاراکتری را که نوشته است باز میگرداند و در صورت عدم موفقیت مقدار EOF را باز میگرداند
== ماکروی مقدار NULL ==
مقدار تهی با تلفظ نُل که آن را نول می نویسیم NULL در فایلهای سرآیند stdio و stdlib و stddef و time و locale و string و wchar تعریف شده است و مقدار اشارهگری است که آن اشارهگر به مکانی غیر قابل دسترسی اشاره می کند تا اگر به اشتباه از آن اشارهگر در برنامه استفاده شد باعث توقف سیستم نشود . حتماً از مبحث اشارهگرها به یاد دارید که اگر اشارهگری را اعلان نمودید و آن را به شکلی تعریف نکردید که به متغیر یا تابع دیگری اشاره کند ، بهتر است آن را با دادن مقدار NULL تعریف کنید . طبق استاندارد عبارت ثابت ;int * ptr = 0 یک اشارهگر NULL است نام آن ( ptr ) دل به خواه است اما اگر یک متغیر صحیح اشارهگر را مقدار 0 به آن بدهید همانند مقدار NULL خواهد بود و غیر قابل دسترسی است و در صورتی که بخواهید آدرس آن را به دست آورید یا در خروجی چاپ کنید و نمایش دهید آدرس آن غیر قابل دسترسی اعلام خواهد شد . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
int * iptr = NULL;
printf("%p\n", iptr);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال بالا آدرس اشارهگر ptr غیر قابل دسترسی نمایش داده خواهد شد
طبق استاندارد مشخص نشده است که غیر قابل دسترسی بودن مقدار NULL در کامپایلر و پیادهساز باید چگونه باشد اما مقدار آن :
{{چپچین}}
((void *)0)
{{پایان چپچین}}
تعریف شده است . شما علاوه بر دادن مقدار تهی به اشارهگر در برنامههای بزرگ خود میتوانید در دستور شرطی if بررسی کنید که اشارهگر شما به جایی اشاره کرده است یا خیر که می نویسید if (ptr == NULL) بدین ترتیب مشخص می شود که اشارهگر ptr به جایی اشاره کرده و آدرسی دارد یا خیر . همچنین در ساخت دادههای درختی و لیست پیوندی باید آخرین مقدار آن را تهی تعیین کنید تا پایان دادهها را تعیین کنید
== تابع fputc ==
تابع fputc سرنام file put character همانند putc میباشد و یک کاراکتر را داخل فایل تعیین شده می نویسد و منتظر کاراکتر بعدی می ماند تا آن را وارد کند ( به محل بعدی اشاره می کند ) جز اینکه putc به نحوی در فایل سرآیند تعریف میشود که در هر بار فراخوانی ، فایل فرستاده شده به خود را دوباره می خواند و این مورد در نوشتن برنامه به صورت غیر حرفهای می تواند باعث ایجاد باگ ، مخصوصاً باگ امنیتی و رخنهپذیری شود در حالی که fputc اینگونه نیست و امن می باشد ؛ ضمن اینکه fputc را می توانید به عنوان آرگومان به یک تابع دیگر بفرستید و همچنین فضای حافظه موقت کمتری اشغال می کند ولی fputc کمی کندتر از putc می باشد . شکل کلی ایجاد تابع fputc بدین صورت می باشد :
{{چپچین}}
fputc(int ch, FILE * fp);
{{پایان چپچین}}
ch نام مقداری است که کاراکتر متناظر آن در ازکی ( ASCII ) توسط شما تعیین می شود تا در فایل نوشته شود . همچنین شما می توانید یک کاراکتر را تعریف کنید و به آن بفرستید تا آن را در فایل بنویسد . تابع fputc در صورت عملکرد موفقیتآمیز مقداری را که نوشته است باز می گرداند و در صورت بروز خطا مقدار EOF را می فرستد ؛ همچنین جهت اشکالزدایی مقادیر دیگری را می فرستد که با تابعهای کتابخانهای دیگر stdio همانند بسیاری از تابعهای کتابخانهای ، خطا را در آن بر طرف کنید . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main ()
{
FILE *fp;
int ch;
int nl = 10;
fp = fopen("alphabet.txt", "w+");
for( ch = 65 ; ch <= 90; ch++ )
{
fputc(ch, fp);
fputc(nl, fp);
}
fclose(fp);
return(0);
}
</syntaxhighlight>
{{پایان چپچین}}
همین برنامه را به صورت زیر نیز می توانیم بنویسیم :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main ()
{
FILE *fp;
char ch;
char nl = '\n';
fp = fopen("alphabet.txt", "w+");
for( ch = 'A' ; ch <= 'Z'; ch++ )
{
fputc(ch, fp);
fputc(nl, fp);
}
fclose(fp);
return(0);
}
</syntaxhighlight>
{{پایان چپچین}}
تشریح این برنامهها تکرار مکررات در همین صفحه است و واضح است که برنامه چگونه عمل می کند ، فقط در اولین قطعه کد مقدار ۶۵ تا ۹۰ کاراکترهای A تا Z در ازکی می باشند و مقدار ۱۰ کاراکتر خط شکسته که در هر بار اجرای حلقه for یک کاراکتر از حروف الفبای انگلیسی و یک کاراکتر خط شکسته نوشته می شود و در دومین قطعه کد دیگر کاراکتر ها را نوشتهایم و نه مقدار آن را
== تابع fgetc ==
تابع fgetc سرنام file get character به معنی کاراکتر را از فایل بگیر همانند getc می باشد و یک کاراکتر را از فایل دریافت می نماید و منتظر کاراکتر بعدی می ماند تا دریافت شود ؛ جز اینکه getc به عنوان یک ماکرو در فایل سرآیند stdio تعریف شده است و با هر بار فراخوانی ، فایل فرستاده شده به خود را دوباره می خواند و اگر کد به درستی نوشته نشود باعث ایجاد باگ مخصوصاً باگ امنیتی و رخنهپذیری می شود ؛ در حالی که fgetc اینگونه نیست و امن می باشد . fgetc را می توانید به عنوان یک آرگومان به تابع دیگری بفرستید و فضای حافظه کمتری را اشغال می کند اما چون fgetc به صورت یک تابع در stdio تعریف شده است کمی کندتر از getc می باشد . شکل کلی ایجاد تابع fgetc بدین صورت می باشد :
{{چپچین}}
fgetc(FILE * stream);
{{پایان چپچین}}
یک فایل را به fgetc می فرستید تا از اولین کاراکتر آن شروع به خواندن کند و منتظر کاراکتر بعدی بماند و به آن اشاره کند تا در ادامه اگر باز هم فراخوانده شد آن را نیز دریافت نماید . تابع fgetc در صورت موفقیتآمیز بودنِ عملکرد خود ، کاراکتری را که خوانده است مقدار عددی صحیح آن را باز می گرداند و در صورت عدم موفقیت EOF را باز می گرداند که با تابعهای feof و ferror که تابعهای تعریف شده در stdio هستید می توان پی برد که فایل به پایان رسیده یا خطایی وجود دارد . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main ()
{
FILE *fp;
int ch;
fp = fopen("alphabet.txt", "r");
ch = fgetc(fp);
while(ch != EOF)
{
putchar(ch);
ch = fgetc(fp);
}
fclose(fp);
return(0);
}
</syntaxhighlight>
{{پایان چپچین}}
'''توضیح برنامه :''' برنامه یک متغیر از نوع صحیح با نام ch دارد که مقدار آن تابع fgetc با دریافت فایل fp می باشد که اولین کاراکتر فایل alphabet.txt را می خواند ( فایلی که در برنامه قبلی ایجاد کردیم که حروف الفبا را نوشت ) و سپس تا زمانی که ch به آخر فایل نرسیده است ch که کاراکتر alphabet.txt است را بر روی خروجی خطدستوری نمایش داده و سپس دوباره fgetc کاراکتر بعدی را می خواند و در خود ذخیره می کند و در پایان فایل را بسته و تابع اصلی را با موفقیت به پایان رساندهایم
== تابع fputs ==
تابع کتابخانهای fputs سرنام file put string به معنی رشته را در فایل قرار بده یک رشته از کاراکترها را داخل جریان داده و معمولاً فایل فرستاده شده به آن ، می نویسد . شکل ایجاد تابع fputs بدین صورت می باشد :
{{چپچین}}
fputs(const char * str, FILE * stream);
{{پایان چپچین}}
ابتدا یک فایل را آماده ایجاد می کنیم سپس آن را باز کرده و نامی برای آن انتخاب می کنیم و بعد به کمک fputs متنی را داخل آن می نویسیم و سپس فایل را می بندیم تا فضای اشغال شده آزاد شود .ضمناً تابع fputs در صورت موفقیتآمیز بودن عملکرد خود یک مقدار غیر منفی را می فرستد و در صورت خطا EOF را و البته مقادیر دیگری که می توانید توسط ferror و دیگر تابعهای خطا یاب ، خطای آن را بیابید و بر طرف کنید که در ادامه می نویسیم . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main ()
{
FILE *fp;
fp = fopen("mytext.txt", "w");
fputs("Hello World!\n2.71", fp);
fclose(fp);
return(0);
}
</syntaxhighlight>
{{پایان چپچین}}
'''توضیح :''' همان طور که نوشته شد ، فایلی را آماده کردهایم تا ایجاد شود ( fp ) سپس آن را جهت نوشتن ایجاد نمودهایم ( mytext.txt ) و با تابع کتابخانهای fputs در آن نوشتهایم :
!Hello World<br>
2.71
و البته اگر دقت کنید این بار در ایجاد نوشته و رشته ، خط را شکستهایم . حال اگر با یک پیرایشگر متن ، فایل ایجاد شده را باز کنید ، متن را داخل آن ، مشاهده خواهید نمود
== تابع fgets ==
تابع fgets سرنام file get string به معنی رشته کاراکترها را از فایل بگیر ، جهت دریافت یک خط از متن فایل داده شده می باشد . شکل کلی ایجاد تابع fgets بدین صورت می باشد :
{{چپچین}}
fgets(char * str, int limit number, FILE * Stream);
{{پایان چپچین}}
تابع نام یک رشته را دریافت می کند ، سپس تعداد محدودیت تعداد کاراکترهای دریافتی را می نویسیم و سپس ورودی جریان داده که معمولاً جریان فایل است . تابع تا زمانی که به خط شکسته یا تعداد محدود کننده نوشته شده نرسیده باشد ، فایل را می خواند و آن را ذخیره می کند . تابع fgets در صورت داشتن عملکرد موفقیتآمیز ، یک اشارهگر را به رشته خود باز می گرداند و در صورت رسیدن به پایان خط یا خطا در عملکرد یک مقدار نول NULL را می فرستد که با feof می توان فهمید که به پایان رسیده است یا خیر و در صورت خطا می توان با تابع ferror خطای آن را پیدا نمود . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main ()
{
FILE *fp;
fp = fopen("mytext.txt", "r");
char str[20];
fgets(str, 20, fp);
puts(str);
fclose(fp);
return(0);
}
</syntaxhighlight>
{{پایان چپچین}}
توضیح : در صورت کامپایل قطعه کد بالا و اجرای آن تنها !Hello World را از فایل mytext.txt در خروجی خطدستوری خواهیم دید ، چرا که 2.71 در خط بعدی و بعد از شکسته شدن خط وجود دارد . فایل mytext.txt ابتدا آماده و سپس برای خوانده شدن باز شده . آرایه کاراکتری str با ۲۰ عنصر ، اعلان شده است . تابع fgets فایل mytext.txt را باز نموده و از آن ۲۰ کاراکتر خط اول را می خواند و در str ذخیره می کند و سپس توسط تابع puts این رشته در خروجی خطدستوری نمایش داده می شود و سپس فایل بسته شده و تابع اصلی ، با موفقیت به پایان می رسد
برای اینکه به صورت مطمئن از fgets متنی را از ورودی استاندارد دریافت کنید باید به شکل زیر عمل کنید ( چرا که با زدن دکمه ورود Enter یا همان Return داخل صفحهکلید ) کاراکتر خط شکسته را به متن اضافه می کند که در صورتی که بخواهید دستوری را بدهید یا نام فایلی را وارد کنید دچار مشکل خواهید شد . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
fgets(filename, 200, stdin);
filename[strcspn(filename, "\r\n")] = 0;
</syntaxhighlight>
{{پایان چپچین}}
'''توضیح :''' تابع fgets داده یا فایلی را با نام filename دریافت میکند که تعداد آن نهایتاً ۲۰۰ تا است و از ورودی استاندارد ، یعنی صفحهکلید ، داده را وارد میکنیم . سپس تابع strcspn که در فایل سرآیند string تعریف شده است هر جا ورودی به خط جدید ( در ویندوز ) و البته خط شکسته ( در تمام سیستم عاملها ) را پیدا کند ، آن را خالی کرده و حذف می کند
== ماکروی نوع داده size_t ==
ماکروی نوع داده size_t سرنام size type به معنی « اندازه نوع » ، اندازه اشیائی همچون آرایهها ، بلوکهای حافظه ، ساختمانها و رشتهها را به بایت در خود ذخیره می کند . اندازه size_t هرچه که باشد منفی نیست . اندازه size_t در C99 شانزده بیت تعریف شد و در حال حاضر حداکثر مقدار ذخیره شده در کامپایلرها و سیستمهای ۳۲ بیتی قدیمی ۲ بایت و در سیستمهای ۶۴ بیت با کامپایلرها و سیستمهای قدیمیتر ۴ بایت و در سیستمهای جدید ۸ بایت است یعنی به اندازه یک int یا یک long long int بدون علامت . اندازه size_t توسط عملگر sizeof به دست میآید . استفاده از size_t به تخصیص حافظه پویا کمک می کند . ضمناً size_t علاوه بر فایل سرآیند stdio در فایلهای سرآیند stddef و stdlib و string و time و wchar تعریف شده است . '''نکته :''' وقتی می خواهید اندازه شیئای را به دست بیاورید بهتر است از size_t استفاده کنید ؛ همچنین برای تعریف اندازههای بزرگ ، جهت قابل حمل بودن برنامه خود بهتر است از size_t استفاده کنید
مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main()
{
int array[5] = { 1, 2, 3, 4, 5 };
size_t size = sizeof(array);
printf("The size of the array is: %zu\n", size);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
'''توضیح :''' در تابع اصلی برنامه ، یک آرایه صحیح به نام array تعریف نمودهایم که ۵ عنصر دارد و هر صحیح ( int ) در سیستمهای ۶۴ بیتی ۴ بایت است . سپس یک نوع داده size_t با شناسه و نام size تعریف نمودهایم که مقدار آن مقدار array است . سپس در تابع printf در خروجی خطدستوری ، چاپ کردهایم اندازه آرایه مورد نظر به اندازه size می باشد که این کار را با تعیینکننده فرمت z به همراه u که سرنام unsigned می باشد نوشته و آرگومان size را به آن فرستادهایم تا جایگزین شود . در پایان ، تابع اصلی برنامه با موفقیت به پایان می رسد و در صورت کامپایل و اجرای برنامه با اندازه آرایه ۲۰ است ، مواجه خواهیم شد ( ۵ عنصر که هرکدام ۴ بایت را اشغال می کند )
'''دقت کنید :''' در تعاریف استانداردهای قدیمیتر مثل C98/C99 ماکروی نوع داده size_t طوری تعریف شده است که تعیینکننده فرمت آن d یا ul یا ull است و نه zu . بنابراین در هنگام نوشتن کد دقت کنید که کامپایلر شما با چه استانداردی ، مطابقت دارد
== تابع fread ==
تابع fread سرنام file read به معنی « فایل را بخوان » فایل فرستاده شده به خود را به تعدادی که تعیین کردهایم و تعداد بایتهایی که باید یکجا خوانده شوند ، در یک متغیر اشارهگر که عموماً باید یک آرایه باشد ذخیره می کند . شکل کلی ایجاد تابع fread بدین صورت می باشد :
{{چپچین}}
fread(void * buffer, size_t size, size_t count, FILE * stream);
{{پایان چپچین}}
فایل stream به تعداد count و اندازه هر یک بلوک از بایتهای size در buffer ذخیره می شود . تابع fread در صورت موفقیتآمیز بودنِ عملکرد خود ، تعداد نوشتههای خود ( count ) را باز می گرداند ولی در صورتی که از تعداد count کمتر شود یعنی خطایی رخ داده و یا به پایان فایل رسیدهایم ( EOF ) . اگر size و یا count را 0 بنویسید تابع مقدار 0 را باز میگرداند اما اختلالی در جریان فایل و یا دادههایی که فرستادهایم ایجاد نمی شود و برنامه به ادامه خود می پردازد . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
FILE * fp;
char buf[100];
fp = fopen ("alphabet.txt", "r");
fread(buf, 1, 100, fp);
printf("%s\n", buf);
fclose(fp);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال بالا ابتدا فایل fp را آماده ایجاد نمودهایم . بعد از آن ، رشته ۱۰۰ کاراکتری buf را اعلان نمودهایم . سپس فایل fp را تعیین کردهایم تا توسط تابع fopen برای خوانده شدن باز شود که همان فایل alphabet.txt می باشد . تابع fread صد بایت را دانه به دانه ( چون برای size نوشتهایم 1 ) از فایل fp می خواند و در buf ذخیره می کند . سپس تابع printf آن را در خروجی خطدستوری چاپ می کند که همان حروف الفبای انگلیسی است . سپس فایل را بسته و تابع با موفقیت به اتمام می رسد
در نظر داشته باشید که fread قابلیت خواندن فایلها را به صورت عددی نیز دارد و یکی از مهمترین تابعهای کتابخانهای زبان سی C برای خواندن فایلها به صورت عددی می باشد . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main()
{
FILE * fp = fopen("/home/lovelorn/Pictures/post-3.jpeg", "rb");
unsigned char n;
for (int i = 0; i < 100; i++)
{
fread(&n, 1, 1, fp);
printf("%d\n", n);
}
fclose(fp);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال بالا فایل post-3.jpeg از قالب و فرمت JPEG را به صورت عددی باز نمودهایم ( شما میتوانید هر فایلی را که داخل سیستم خود دارید قرار داده و آدرس بدهید ) سپس متغیر کاراکتری بدون علامت n را اعلان نمودهایم تا یک بایت جا را در خود بگیرد . پس از آن با یک حلقه for صد بار تابع fread را فراخواندهایم تا از فایل مورد نظر یک بار یک بایت را بخواند و آن را در n ذخیره کند ؛ دقت کنید که بافر باید یک اشارهگر باشد و چون n اشارهگر نیست ، با عملگر آدرسدهی ، در آن مقادیر را ذخیره کرده و سپس توسط تابع printf در خروجی خطدستوری چاپ نمودهایم . دقت کنید که شما درصورتی که هر واحد را ۴ بایت تعریف کنید هر ۴ بایت یک عدد خوانده می شود و در سیستمهای ۳۲ بیتی قدیمی باید تعیین کننده فرمت lu را بنویسید و در صورتی که داده شما ۸ بایتی باشد که آن را بدون علامت تعیین کنید از فرمت llu و در غیر این صورت با خطای نااندازه بودن حافظه مواجه خواهید شد ( که البته همان طور که در پائین نوشتهایم شما باید دادهها را تبدیل کنید ) . در پایان ، فایل مورد نظر خود را بسته و تابع اصلی برنامه را با موفقیت به پایان می رسانیم . در صورتی که با موفقیت برنامه بالا را کامپایل و اجرا کنید با اعداد ۲۵۵ ، ۲۱۶ ، ۲۵۵ و ... ( وابسته به نسخه استاندارد JPEG ) مواجه خواهید شد ( دقت کنید که اکر تعیینکننده فرمت خود را X بنویسید همانند یک هگزادسیمال ادیتور مقادیر برای شما شانزده شانزدهی و به عبارت دیگر در مبنای ۱۶ نوشته خواهد شد )
'''دقت کنید :''' تابع fread به صورت ویژه برای خواندن فایلها به صورت عددی می باشد و اگر بخواهید یک فایل متنی را عددی بخوانید به مشکلاتی بر می خورید و بهتر است از fscanf و sscanf و یا gets استفاده کنید . همچنین تابع fread مقادیر عددی را که به آن می فرستیم و بزرگتر از ۱ بایت ( برای هر حجم size ) باشد در سیستمهای اندین کوچک ( لیتل اندین Little Endian ) از راست به چپ می خواند و اگر آن را چاپ کنید با عدد برعکس شده ۰ و ۱ آن رو به رو خواهید شد . جهت رفع این مشکل در سیستم عاملهای شبهیونیکس و البته ویندوز تابع ntohs سرنام network to host system به معنی عدد شبکه را به سامانه ( سیستم ) میزبان تبدیل کن ، موجود می باشد ( در شبکه ، اعداد ، اندین بزرگ یا همان بیگ اندین Big Endian هستند ) تا قبل از چاپ نمودن عدد آن را بر عکس کنید تا درست خوانده شود ولی تابع استانداردی برای این کار وجود ندارد
در سیستم عاملهای شبهیونیکس و با رابط پازیکس ( POSIX ) می توانید برنامه را همانند برنامه زیر بنویسید :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
#include <arpa/inet.h>
int main()
{
FILE * fp = fopen("/home/lovelorn/Pictures/post-3.jpeg", "rb");
unsigned short n;
unsigned short rev;
for (int i = 0; i < 100; i++)
{
fread(&n, 2, 1, fp);
rev = ntohs(n);
printf("%d\n", rev);
}
fclose(fp);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
'''دقت کنید :''' گنجایش ntohs فقط ۲ بایت است و چک کنید که در سیستم شما هم short فقط ۲ بایت جا اشغال می کند . اگر در سیستمهای ۳۲ بیتی قدیمی هستید int هم ۲ بایت است . همچنین این مشکل در سیستمهای اندین کوچک ( لیتل اندین Little Endian ) مثل معماریهای x86 یا بعضاً ARM ( که در گذشته دو اندینه بود و در حال حاضر اندین کوچک است ) وجود دارد و در سیستمهای اندین بزرگ ( بیگ اندین Big Endian ) وجود ندارد . از سویی برخی از سیستمها فایل سرآیند netinet/in.h را به جای arpa/inet.h برای استفاده از ntohs نیاز دارند و باید آن را ضمیمه برنامه خود کنید و همچنین در ویندوزهای قدیمی تا نسخه ۸.۱ فایل سرآیند winsock.h و در ویندوزهای جدید باید Winsock2.h را ضمیمه فایل برنامه خود کنید
'''توضیح :''' این برنامه همانند برنامه قبلی نوشته شده است با این تفاوت که نوع داده short را انتخاب نمودهایم که ۲ بایت است و یک متغیر دیگر rev مخفف reversed اعلان نموده و دادههای خود را با ntohs در آن ذخیره نمودهایم و سپس مقدار rev را در خروجی خطدستوری چاپ نمودهایم . اگر مقادیر فایل را ۲ بایت به ۲ بایت به مبنای ۱۰ تبدیل کنید خواهید دید که ارقام و مقادیر صحیح و درست هستند و دیگر برعکس نیستند
== تابع fwrite ==
تابع fwrite سرنام file write به معنی « فایل را بنویس » دادههای تحویل داده شده به تابع را داخل یک فایل می نویسد . شکل کلی ایجاد تابع fwrite بدین صورت می باشد :
{{چپچین}}
fwrite(const void * ptr, size_t size, size_t nmemb, FILE * fp);
{{پایان چپچین}}
یک داده اشارهگر به اندازه بلوکهای بایتی size و به تعداد nmemb در داخل فایل fp نوشته می شود . تابع fwrite در صورت موفقیتآمیز بودنِ عملکرد خود تعداد nmemb را باز خواهد گرداند و در غیر این صورت پیام خطایی را خواهد فرستاد که توسط تابع ferror می توانید ایراد را پیدا کرده و رفع کنید . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
FILE * fp;
int num[100];
int number;
fp = fopen("myfile.bin", "wb");
for (number = 0; number < 100; ++number)
{
num[number] = number;
}
fwrite(num, 4, 100, fp);
fclose(fp);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
'''توضیح :''' فایل fp آماده ساختن شده است . یک آرایه از نوع متغیر صحیح با ۱۰۰ عنصر و با نام num اعلان شده است . همچنین یک متغیر صحیح با نام number اعلان شده است . تعیین کردهایم که فایلی که می خواهیم به صورت عددی بنویسیم myfile.bin نام دارد و باید ساخته شود و یا بازنویسی شود . با یک حلقه for متغیر number به عنوان اندیس num از مقدار ۰ شروع کرده و تا ۹۹ ادامه می یابد و البته قبل از اجرای حلقه number یک بار افزایش خواهد یافت چون عملگر افزایش پیش از number نوشته شده است . num[0] مقداری نمی گیرد ، بنابراین توسط کامپایلر مقدار 0 را خواهد گرفت . در چهار بایت بعدی num[1] برابر مقدار 1 است و سپس 2 و الی آخر . تابع fwrite متغیر آرایهای num را که ۱۰۰ عنصر ۴ بایتی دارد را هر ۴ بایت به ۴ بایت ، ۱۰۰ بار در فایل fp که همان myfile.bin است می نویسد . سپس فایل را بسته و تابع main را با موفقیت به پایان می رسانیم . برای مشاهده نتیجه ، یک پیرایشگر فایل یا همان پیرایشگر هگزادسیمال ( Hex Editor یا همان Hexadecimal Editor ) نیاز دارید که برای تمام سیستم عاملها موجود است
== تابع ungetc ==
شکل کلی فراخواندن تابع کتابخانهای ungetc که سرنام unget character می باشد به معنی کاراکتر را نگیر بدین صورت است :
{{چپچین}}
ungetc(int ch, FILE * fp);
{{پایان چپچین}}
تابع ungetc بر خلاف getc عمل می کند و تضمین شده است که حداقل یک کاراکتر را که وارد یا خوانده شده است به جریان داده یا جریان فایل بفرستد تا آماده خواندن شود ( دقت کنید که برخی به کارگیرندهها تعداد بیشتری را می فرستند که به ترتیب عکس ذخیره می شود ، یعنی آخرین کاراکتر فرستاده شده ، اولین کاراکتر برای جریان داده یا جریان فایل است که خوانده شود ) همچنین ungetc تنها ورودی getc را به جریان داده و یا فایل باز نمی گرداند و شامل دیگر گیرندهها نظیر scanf نیز می شود . مهم است بدانید که کامپایلر ، کاراکتر تعریف شده توسط ungetc از نوع صحیح int را به نوع داده unsigned char تبدیل می کند . شما می توانید به جای نوشتن متغیری جهت فرستاده شدن به جریان ، یک کاراکتر نوشتاری را نیز بفرستید . نتیجه هر دو این است که زمانی که یک تابع بخواهد از جریان ورودی داده یا فایل ، کاراکتری را بخواند ، کاراکتر فرستاده شده از ungetc را جهت نوشتن به خروجی می فرستد . تابع ungetc در صورت موفقیتآمیز بودن عملکرد خود ، کاراکتری را که به جریان داده و یا فایل فرستاده است ، باز می گرداند و در غیر این صورت مقدار EOF را . اگر ch مقدار EOF را بگیرد ، تنها EOF را باز می گرداند که البته طبق استاندارد نباید به ungetc مقدار EOF را فرستاد . کاراکتری که شما با ungetc بازگشت می زنید برای جریان ، لازم نیست همان کاراکتری باشد که بار آخر ، توسط جریان خوانده شده است و در واقع ضرورتی ندارد که کاراکترهایی را از جریان داده بخوانید که قبل از آن توسط ungetc بازگشت خورده و خوانده نشدهاند . اما این کار در نوشتن برنامه تقریباً بیهوده و عجیب است . معمولاً از ungetc برای نخواندن یک کاراکتر که از همان جریان داده یا فایل برای خواندن استفاده شده ، استفاده می شود . شما مجاز به چند بار استفاده مکرر از ungetc به صورت پشت سر هم بدون تابعهای خواندن از ورودی استاندارد ( صفحه کلید Keyboard ) یا فایل نیستید . اما برخی به کارگیرندهها این اجازه را می دهند . بازگرداندن کاراکترها توسط ungetc فایل را تغییر نمی دهد . اگر از یک تابع جهت تغییر مکان خواندن فایل مثل fseek یا fseeko یا rewind یا حتی fflush ( که در ادامه خواهند آمد ) استفاده شود ungetc نادیده گرفته می شود . نخواندن یک کاراکتر توسط ungetc در فایلی که به انتهای خود رسیده ، علامت انتهای فایل را پاک می کند چون یک کاراکتر را جهت ورود آماده می کند ولی بعد از آنکه کاراکتر را خواندید اگر دوباره بخواهید بخوانید با انتهای فایل EOF مواجه خواهید شد . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include<stdio.h>
int main(void)
{
int ch = 0;
FILE * fr;
fr = fopen("alphabet.txt", "r");
while(ch != EOF)
{
ch = getc(fr);
putchar(ch);
ungetc(ch, fr);
printf("\n%c", ch);
break;
}
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
'''توضیح :''' یک متغیر که قرار است نقش یک کاراکتر را ایفا کنید با نام ch تعریف کردهایم . فایل fr را آماده ایجاد نمودهایم . سپس توسط تابع fopen فایل alphabet.txt را که در همین صفحه ایجاد کردیم ، چهت خواندن باز می کنیم . سپس حلقه while تا زمانی که به پایان فایل نرسیدهایم ch را توسط getc از فایل fr دریافت می کند و سپس آن را چاپ می کند . تابع ungetc آخرین کاراکتر خوانده شده را به جریان می فرستد . و بعد از آن با تابع printf یک بار خط را شکسته و آخرین مقدار باقیمانده در جریان را که همان A می باشد چاپ می کند . سپس حلقه را می شکنیم چرا که در صورتی که آن را نشکنیم ، مقداری که توسط ungetc به جریان ورودی می فرستد باقی می ماند و تا بی نهایت چاپ می شود A در صورتی که حالا فقط ۲ A در خطهای جداگانه داریم
'''نکته :''' اگر یک یا چند بار دیگر تلاش کنید تا ch را چاپ کنید باز هم با مقدار A رو به رو خواهید شد ؛ چرا که در ذخیرهگاه جریان داده یا فایل ، A ذخیره شده است و ungetc آن را به ذخیرهگاه ( buffer ) که در ادامه نوشته خواهد شد فرستاده است
== تابع fflush ==
شکل کلی فراخواندن تابع fflush سرنام file flush به معنی فایل را خالی کن بدین صورت می باشد :
{{چپچین}}
fflush(FILE * stream)
{{پایان چپچین}}
در کرنل سیستم عامل قسمتی وجود دارد که ذخیرهگاه جریان ورودی/خروجی دادهها و فایلها می باشد که به آن بافر Buffer گفته می شود . با بسته شدن فایل یا خروجی موفقیتآمیز برنامه خود به خود بافر ، تخلیه می شود اما گاهی ممکن است برنامه دچار اشکال شود و متوقف گردیده و بدین صورت فایل نوشته نشود . در این صورت ، اگر شما از تابع کتابخانهای fflush استفاده کرده باشید ، فایل بر روی دیسک و یا خروجی استاندارد نوشته خواهد شد . در استاندارد C تابع fflush برای ورودی ، تعریف نشده است ( و فقط برای خروجی فایل است ) ولی برخی از پیادهسازها از آن پشتیبانی می کنند . اما قبل از اینکه برای ورودی از آن استفاده کنید ، راهنمای کامپایلر خود را مطالعه کنید ؛ چرا که ممکن است با یک رفتار تعریفنشده مواجه شوید . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main()
{
int c;
FILE * fr;
fr = fopen("alphabet.txt", "r");
c = getc(fr);
ungetc(c, fr);
c = getc(fr);
printf("Character read after ungetc: %c\n", c);
fflush(fr);
c = getc(fr);
printf("Character read after fflush: %c\n", c);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال بالا یک کاراکتر از فایل الفبا یک بار خوانده می شود . سپس توسط ungetc به ذخیرهگاه ( بافر ) فرستاده می شود . دوباره کاراکتر را دریافت کرده و آن را در خروجی خطدستوری چاپ می کنیم . حالا از تابع fflush برای خالی کردن ذخیرهگاه استفاده می کنیم و بار دیگر از فایل می خوانیم و آن را در خروجی خطدستوری چاپ می کنیم که عملاً هیچ چیز نیست . چون ذخیرهگاه خالی شده است ( یعنی ungetc بی اثر شده است )
مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int * program_crash = 0;
int main(void)
{
FILE * fp;
fp = fopen("testfile.txt", "w");
printf("Enter a number : \n");
int num = 0;
scanf("%d", &num);
fprintf(fp, "The number is : %d\n", num);
fflush(fp);
*program_crash = 5;
fclose(fp);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال بالا یک اشارهگر خالی تعریف نمودهایم . سپس فایلی را با نام testfile.txt به معنی فایل امتحانی با پسوند txt سرنام text به معنی متن ساده آماده نوشتن کردهایم . سپس در خروجی خطدستوری ، چاپ نمودهایم تا کاربر یک عدد را وارد کند . عدد را دریافت نموده و سپس توسط تابع fprintf در فایل مورد نظر نوشتهایم : The number is و سپس عدد وارد شده توسط کاربر را که همان num می باشد در فایل خواهیم نوشت به معنی عدد وارد شده شما اینقدر می باشد . پس از آن ذخیرهگاه را تخلیه نمودهایم تا هر آنچه در ذخیرهگاه فایل موجود است نوشته شود . سپس به اشارهگر program_crash مقدار غیر استاندارد 5 را دادهایم که مجاز به این کار نیستیم ( مراجعه شود به مبحث اشارهگرها در فصل دادهها ) و برنامه متوقف می شود . اما فایل ما با موفقیت نوشته شده است و شما می توانید آن را در یک پیرایشگر متن مشاهده کنید . تابع fflush در صورت موفقیتآمیز عمل کردن مقدار 0 را باز می گرداند و مقدار EOF نشانگر وجود یک اختلال است که موفقیتآمیز عمل نکرده است . با نوع داده ماکروی errno می توانید مقادیر اضافهتری دریافت کنید که نشان می دهد خطای ایجاد شده از کجاست تا آن را بر طرف کنید
'''نکته :''' پیام خطای Segmentation Fault که به نام Core Dump نیز معروف است زمانی رخ می دهد که بر روی حافظه ضروری کرنل بخواهیم چیزی بنویسیم و یا دادهای را وارد حافظه کنیم که اندازه آن بزرگتر از مقدار حافظه می باشد
== تابع remove ==
این تابع کتابخانهای ، همان طور که از اسمش پیداست فایلی را که به آن بفرستیم ، حذف می کند . شکل کلی ایجاد تابع remove بدین صورت می باشد :
{{چپچین}}
remove(const char* filename);
{{پایان چپچین}}
داخل جفت پرانتزهای باز و بسته تابع ، یک رشته می نویسیم که نام فایلی است که می خواهیم حذف شود . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
remove("testfile.txt");
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
حتماً به یاد دارید که یک فایل در دایرکتوری کامپایلر ( فولدر کامپایلر ) به نام testfile.txt ایجاد نمودیم . حال اگر برنامه بالا را بنویسید و آن را کامپایل کرده و اجرا کنید ، فایل مذکور حذف می شود . تابع remove در صورت موفقیتآمیز بودن عملکرد خود مقدار 0 را باز می گرداند و یک مقدار غیر 0 در صورت وجود اختلال . با استفاده از نوع داده ماکروی errno می توانید مقادیر اختلال و مشکل را دریافت نموده و اختلال را رفع کنید
== تابع rename ==
تابع کتابخانهای rename نیز همان طور که از نامش پیداست ، برای یک فایل یا دایرکتوری ( فولدر ) ، نام جدیدی را که به آن دستور دادهایم قرار می دهد و نام آن را عوض می کند . شکل کلی ایجاد تابع rename بدین صورت می باشد :
{{چپچین}}
rename(const char * oldfilename, const char * newfilename);
{{پایان چپچین}}
ابتدا نام فایلی را که موجود است می نویسیم و سپس نام فایل جدیدی را که قرار است پس از تعویض داشته باشد می نویسیم . این تابع ، در صورت عملکرد موفقیتآمیز خود مقدار 0 را باز می گرداند و در صورت اختلال مقدار دیگری را که البته با نوع داده ماکروی errno با مقدار بازگردانده شده ما می توانیم اختلال را بر طرف کنیم . دقت کنید که برخی پیادهسازها و سیستم عاملها به شما اجازه می دهند تا در صورتی که آدرسی دیگر ، نسبت به فایل موجود بنویسید ، آن را نام نویسی جدید نمایند و آن را انتقال دهند به دایرکتوری و آدرس داده شده در حالی که مابقی خطا می گیرند ؛ همین طور برخی اجازه می دهند تا اگر نامی که می خواهید بدهید در دایرکتوری موجود است آن را جایگزین فایل مشابه کنید و مابقی این اجازه را نمی دهند و خطا می گیرند . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main()
{
rename("oldfile.txt", "newfile.txt");
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
یک فایل متنی با نام oldfile ایجاد کرده و در صورت تمایل ، داخل آن ، متنی بنویسید و سپس برنامه بالا را نوشته و کامپایل کرده و اجرا کنید . نام آن به newfile.txt تغیییر پیدا خواهد نمود
== تابع fseek ==
تابع fseek سرنام file seek به معنی جستجو در فایل ، جهت اشاره به قسمت معینی از فایل است که بخواهیم در آن چیزی بنویسیم یا آن را بخوانیم . شکل کلی ایجاد تابع fseek بدین صورت می باشد :
{{چپچین}}
fseek(FILE * filepointer, long int offset, int position);
{{پایان چپچین}}
تابع fseek ابتدا اشارهگر فایل را پذیرا می باشد ؛ سپس باید تعداد جایگاهی که می خواهیم جا به جایی در فایل صورت بگیرد (offset) را می نویسیم و در پایان مقادیر از پیش تعیین شده ( position ) استاندارد فایل را می نویسیم که در هر دفعه فقط می تواند یکی از مقادیر زیر باشد :
{{چپچین}}
SEEK_SET
{{پایان چپچین}}
برای رفتن به ابتدای فایل
{{چپچین}}
SEEK_CUR
{{پایان چپچین}}
سرنام Seek Current که می شود همان جایی که فایل در حال استفاده بوده است ، به همان جا اشاره کند و فایل را آماده استفاده نماید
{{چپچین}}
SEEK_END
{{پایان چپچین}}
که به پایان فایل می رود
'''نکته :''' در صورتی که به ابتدای فایل بروید و بعد مقداری را بدهید که به عقب بازگردید ( یعنی عدد منفی بنویسید ) اجرای تابع ناموفق خواهد بود ؛ ضمناً اگر به انتهای فایل بروید و بخواهید مقداری بدهید که به جلوتر برود و دادههایی را بنویسید طبق استاندارد به انتهای فایل ، مقادیر تهی ( 00 در شانزده شانزدهی Hexadecimal ) و مقادیر متناظر در مبناهای دیگر به آخر فایل اضافه می شود
'''دقت کنید :''' بهتر است در صورتی که نمی خواهید عدد خیلی بزرگی که در نوع داده بلند long جا می شود را بنویسید حتماً از تعیین کننده نوع L جهت تعیین بزرگی عدد استفاده کنید و توصیه می شود حتی برای اعداد بزرگ نیز استفاده کنید تا دچار خطایی نشوید
تابع fseek در صورت موفقیتآمیز عمل کردن ، مقدار 0 را باز می گرداند و در صورت بازماندن از عملکرد درست ، مقدار غیر صفر را باز می گرداند
مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
FILE * fp = fopen("test.txt", "r");
fseek(fp, 5L, SEEK_SET);
char str[15];
fgets(str, 15, fp);
printf("%s\n", str);
fclose(fp);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
یک فایل متنی را با متن ! This is a test file ایجاد کنید ( در صورت تمایل از متن دیگری استفاده کنید ) و حتماً فایل را در دایرکتوری و یا فولدری که برنامه کامپایل می شود ذخیره کنید ؛ در غیر این صورت در باز کردن فایل ، آدرس آن را بنویسید . سپس قطعه کد بالا را در یک فایل با پسوند c ذخیره کرده و پس از کامپایل اجرا کنید . فایل test.txt جهت خوانده شدنِ متنی ، باز شده است . سپس تابع fseek به ابتدای فایل رفته و ۵ کاراکتر ( و در فایلهای دودویی ، بایت ) به جلو می رود . آرایه کاراکتری str که همان رشته می باشد با ۱۵ عنصر اعلان شده است . سپس توسط تابع fgets از رشته مورد نظر ۱۵ کاراکتر را از فایل fp که همان فایل test.txt می باشد خواندهایم و آن در در خروجی خطدستوری چاپ کردهایم . در پایان ، فایل خودمان را بستهایم . اگر این قطعه کد را کامپایل و اجرا کنید با متن ! is a file مواجه خواهید شد ( چرا که This چهار کاراکتر دارد و جلوی آن نیز یک فاصله خالی وجود دارد که می شود ۵ تا و ما ۵ کاراکتر در فایل ، جلو رفتهایم و کاراکترهای قبلتر خوانده نشدهاند )
== تابع ftell ==
تابع ftell سرنام file tell به ما جایی که در حال حاضر ، فایل تعیین شده ، قرار دارد ( برای نوشتن یا خواندن ) اعلام می کند . شکل کلی ایجاد تابع ftell بدین صورت می باشد :
{{چپچین}}
ftell(FILE * filepointer);
{{پایان چپچین}}
تابع ftell در صورت موفقیت آمیز بودن عملکرد خود ، شماره بایتی که فایل در حال استفاده است را باز می گرداند و در صورت عملکرد ناموفق مقدار منفی یک را یعنی 1- . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main ()
{
printf("Enter file name :\n");
char name[200];
scanf("%s", name);
FILE * fp;
fp = fopen(name, "rb");
fseek(fp, 0L, SEEK_END);
long size = ftell(fp);
printf("%ld\n", size);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال بالا از کاربر خواستهایم تا نام فایل را وارد کند . آرایه کاراکتری name با ۲۰۰ عنصر اعلان شده تا نام فایل ، در آن ذخیره شود . با تابع scanf نام را از کاربر می گیریم . سپس ماکروی نوع داده FILE یک اشارهگر فایل را با نام fp آماده ایجاد شدن کرده است . با تابع fopen اشارهگر فایل fp فایلی را با نام name برای خوانده شدن دودویی ( باینری ) باز می کند . با تابع fseek به انتهای فایل می رویم و پیش روی نیز نمی کنیم ( 0L ) سپس چون نوع داده تاع ftell از نوع بلند long است یک داده بلند با نام size ایجاد نمودهایم تا وقتی به انتهای فایل رفتیم و جایگاه اشاره به فایل را بررسی نمودیم ، به این شکل ، اندازه ( size ) فایل را به دست بیاوریم . در پایان با printf همان اندازه را در خروجی خطدستوری ، چاپ نمودهایم . یکی از متداولترین استفادههای ftell میزان عملیات بر روی فایل است ؛ عملیاتی مثل کپی کردن . وقتی کپی می کنید مدام با حلقه هم می خوانید و هم هر چه نوشتید بررسی می کنید تا ببینید چند در صد فایل ، نوشته شده است ( نسبت به اصل فایل که می خواهید آن را کپی کنید و اندازه آن را به دست آوردهاید )
== تابع rewind ==
تابع کتابخانهای rewind به معنی بازگرد به ابتدا ، جهت بازگرداندن اشارهگر جریان فایل به ابتدای آن است . شکل کلی فراخوانی تابع rewind بدین صورت است :
{{چپچین}}
rewind( FILE * filepointer );
{{پایان چپچین}}
مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main()
{
FILE * fp;
fp = fopen("mytext.txt", "r");
int text;
while((text=fgetc(fp)) != EOF)
{
printf("%c", text);
}
rewind(fp);
text=fgetc(fp);
printf("Read character is : %c\n", text);
fclose(fp);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال بالا ، فایل متنی mytext که قبلاً آن را ایجاد نمودیم ( با پسوند txt ) را جهت خواندن ، باز می کنیم . سپس یک صحیح با شناسه text اعلان نمودهایم تا با تابع fgetc تا زمانی که به انتهای فایل نرسیدهایم آن را بخوانیم و با تابع printf آن را در خروجی خطدستوری ، چاپ کنیم . سپس به ابتدای فایل برگشته ( توسط همین تابع ، یعنی rewind ) و یک کاراکتر را که اولین آن خواهد بود میخوانیم و آن را با printf در خروجی خطدستوری ، چاپ میکنیم که همان H است . سپس فایل را بسته و تابع اصلی برنامه ( main ) را با موفقیت به پایان می رسانیم
'''دقت کنید :''' تابع rewind هیچ مقداری را باز نمی گرداند ( چه در صورت موفقیت و چه در صورت وجود خطا ) و همچنین تمام دادههای پیدا کردن خطا در عملکرد آن و خواندن یا نوشتن فایل را پاک می کند . بنابراین توصیه می شود که برای بازگشتن به ابتدای فایل نیز همچنان از fseek استفاده کنید
== تابع ferror ==
تابع کتابخانهای ferror سرنام find error به معنی خطا را بیاب ، اگر در جریان داده فایل ، هنگام خواندن یا نوشتن ، خطایی رخ دهد مقداری را بازگردانده و نشانگر خطا را با مقداردهی ماکروی errno تعیین می کند تا برنامهنویس بتواند خطا را برطرف کند . تابع ferror در صورت موفقیتآمیز بودن عملکرد خود ( یعنی خطایی در جریان داده فایل موجود نباشد ) ، مقدار 0 را باز میگرداند و در غیر این صورت ( یعنی وجود خطا ) مقداری غیر 0 را باز خواهد گرداند . شکل کلی فراخوانی تابع ferror بدین صورت است :
{{چپچین}}
ferror(FILE * stream);
{{پایان چپچین}}
مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main()
{
FILE * fp;
fp = fopen("myexample.txt", "w");
if (fp == NULL)
{
printf("File doesn't exist\n");
return 1;
}
fputs("This is an example\n", fp);
fclose(fp);
fputs("This text won't be written on file\n", fp);
if (ferror(fp))
printf("Error during writing to file\n");
fp = fopen("myexample.txt", "a");
fputs("This will append to the end of file\n", fp);
if (ferror(fp))
printf("Error during writing to file\n");
else
printf("The writing operation was successful\n");
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال بالا در هنگام کامپایل ، احتمالاً کامپایلر به شما هشدار خواهد داد که اشارهگر فایل ، پس از بسته شدن فایل ، مورد استفاده قرار گرفته است . اما این مثال ساده ، فقط جهت درک کارآمدی تابع ferror می باشد . '''توضیح :''' ابتدا با اشارهگرِ نوع داده FILE ، فایل fp را آماده ایجاد شدن نمودهایم . سپس fp فایلی متنی را با نام myexample.txt جهت ایجاد و نوشتن ، بازکرده است . چک کردهایم که اگر فایل به هر دلیلی موجود نیست ( NULL ) پیغام خطای فایل موجود نیست را در خروجی خطدستوری ، چاپ کند و برنامه با عدم موفقیت ، به اتمام برسد . سپس داخل فایل خود نوشتهایم This is an example یعنی این یک مثال است و خط را شکستهایم . سپس فایل را بستهایم و نوشتهایم This text won't be written on file یعنی این متن در فایل نوشته نخواهد شد ( چرا که فایل را بستهایم و دیگر نمیتوانیم در آن ، بنویسیم یا حتی آن را بخوانیم ) . سپس با دستور if چک کردهایم که اگر ferror مقداری دارد ( که یعنی خطایی رخ داده ) در خروجی خطدستوری ، چاپ کنید : خطایی در حین نوشتن در فایل وجود دارد . ( چون فایل ، بسته شده است ) که همین اتفاق ، رخ خواهد داد . سپس دوباره فایل را جهت اضافه نمودن ( a که همان طور که در بالاتر نوشتیم سرنام append است ) باز کردهایم و نوشتهایم : This will append to the end of file یعنی این متن در ادامه فایل ، اضافه خواهد شد . سپس دوباره با تابع ferror چک کردهایم که آیا خطایی وجود دارد یا خیر که در صورت وجود خطا چاپ کند : Error during writing to file یعنی در هنگام نوشتن در فایل ، خطایی رخ داده است و خط را بشکند اما خطایی وجود نخواهد داشت ( مگر اینکه فایل را پاک کنید یا قفل کنید یا سیستم عامل شما مخصوصاً در صورت آلوده بودن ، فایل را قفل کند ) و در غیر این صورت چاپ کند : The writing operation was successful یعنی عملیات نوشتن با موفقیت ، انجام شد . سپس برنامه با موفقیت به پایان می رسد
'''دقت کنید :''' در صورتی که چک نکنید اشارهگرِ فایل ، تهی است ( NULL ) و ferror با خطای NULL مواجه شود ، رفتاری تعریفنشده بروز خواهد داد و البته برخی کامپایلرها به جدای از استاندارد ، ماکروها و توابعی را در نظر گرفتهاند تا این خطا را شناسایی کرده و بر طرف کنید ولی بهتر است همیشه در ابتدا چک کنید که فایل موجود است و اشارهگرِ فایل ، تهی نیست
'''دقت کنید :''' تابع ferror خطای جریان داده آخرین فایل باز شده را بررسی کرده و نشانگر خطا را مقداردهی میکند و در صورتی که فایل را ببندید یا از تابع rewind یا تابع clearerr که به معنی خطا را پاک کن می باشد ، استفاده کنید نشانگر خطا خالی می شود ( تابع clearerr را در ادامه همین مبحث ، می نویسیم )
== ماکروی مقدار EOF ==
ماکروی مقدار EOF سرنام End Of File به معنی پایان سند یا همان فایل ، مقداری است که اگر بازگردانده شود ؛ یعنی تابع ( مثل getc یا fread ) جهت خواندن سند ، به انتهای آن رسیده است و یا بعضاً در همان تابعها خطایی در خواندن فایل ایجاد شده است . مقدار بازگردانده شده توسط EOF طبق استاندارد باید یک صحیح منفی باشد اما مقدار دقیق آن ، تعیین نشده است اما بسیاری از پیادهسازها ( کامپایلرها ) مقدار منفی یک 1- را باز میگردانند . برنامهنویسان میتوانند از ماکروی EOF جهت خواندن کامل و صحیح اسناد یا همان فایلها استفاده کنند که تا به همین جای مبحث چند بار از آن استفاده نمودهایم و شما نیز آنها را دیدهاید . ماکروی EOF هم در stdio تعریف شده است و هم در stdlib که موضوع بعدی کثاب است و فرقی با هم ندارند ( تعریف EOF )
مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include<stdio.h>
int main(void)
{
FILE * fr = fopen("test.txt", "r");
int ch;
ch = getc(fr);
while(ch != EOF)
{
putchar(ch);
ch = getc(fr);
}
printf("\n");
fclose(fr);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال بالا که همانند مثال دیگری در همین مبحثِ stdio میباشد یک کاراکتر از فایل test.txt را که پیشتر ایجاد نمودیم می خوانیم و سپس توسط حلقه while تا زمانی که مقدار متغیر ch انتهای سند نیست ، مرتب یک کاراکتر که دریافت شده را در خروجی خطدستوری چاپ می کنیم و سپس کاراکتر بعدی را می خوانیم تا جایی که به انتهای سند می رسیم که شرط حلقه برقرار نیست و حلقه می شکند که در خروجی خطدستوری چاپ می شود : ! This is a test file که محتوای سند test.txt می باشد ( که پیشتر آن را در همین مبحث ایجاد نمودیم ) . سپس خط را شکسته ، پرونده را میبندیم و تابع main را با موفقیت به پایان می رسانیم
'''دقت کنید :''' استفاده از تابعهای rewind و fsetpos و fseek یا clearerr ماکروی مقدار EOF را پاک می کنند
== تابع feof ==
تابع feof سرنام find end of file ماکروی مقدار EOF را در تابعهایی که آن را باز می گردانند بررسی می کند تا پیدا کند که آیا واقعاً به پایان فایل رسیدهایم یا نه . اگر به پایان فایل رسیده باشیم ، مقداری غیر 0 را باز می گرداند و در غیر این صورت مقدار 0 را . دقت کنید که یک خطای مرسوم وجود دارد که برای کنترل یک حلقه از ()feof! استفاده می شود تا بررسی شود که تا زمانی که به پایان فایل نرسیدهایم ، توسط تابعهای مربوطه ، فایل خوانده شود اما چون feof بررسی می کند که بعد از انتهای فایل ، می شود خواند یا نه ، این خطر وجود دارد که یک داده اضافه و زباله ، خوانده شود و یا خطایی ایجاد شود که شما را گمراه کند . شکل کلی فراخوانی تابع feof بدین صورت می باشد :
{{چپچین}}
feof(FILE * stream);
{{پایان چپچین}}
که اشارهگر فایل را به آن می فرستیم ( فایلی که توسط برنامه ، باز شده و در حال خوانده شدن است )
مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include<stdio.h>
int main(void)
{
FILE * fr = fopen("test.txt", "r");
int ch;
ch = getc(fr);
while(1)
{
if(feof(fr))
break;
putchar(ch);
ch = getc(fr);
}
fclose(fr);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
'''توضیح :''' فایل fr را با تابع fopen که فایل test.txt می باشد جهت خوانده شدن به صورت متنی ، باز نمودهایم . سپس یک کاراکتر از آن را خواندهایم . بعد از آن با حلقه بی نهایت while ( که مقدار 1 را در آن گذاشتهایم تا همیشه صحیح و برقرار باشد ) ابتدا بررسی نمودهایم که اگر feof مقدار دارد ( چون fr را می خواند ) که یعنی به پایان فایل رسیدهایم ( مقدار غیر 0 ) بشکند که اگر شرط برقرار نباشد ادامه خواهد یافت و کاراکترِ خوانده شده را در خروجی خطدستوری نمایش خواهد داد و سپس به سراغ کاراکتر بعدی می رود که این حلقه یک جا به پایان فایل می رسد و feof مقدار 0 را باز می گرداند . در ادامه فایل fr را بسته و تابع اصلی برنامه را با موفقیت به پایان رساندهایم
== تابع clearerr ==
تابع clearerr سرنام clear error به معنی نشانگر خطا را خالی کن یا پاک کن ، مقدار خطای errno برای نوع خطای خواندن یا نوشتن در فایل و EOF برای انتهای فایل را برای اشارهگرِ فایلی که به آن فرستاده شده ، خالی و پاک می کند . زمانی که در خواندن یا نوشتن فایل ، خطایی رخ می دهد یا به انتهای فایل می رسیم نشانگر خطا و انتهای فایل ( به ترتیب برای هرکدام یعنی errno و EOF ) ایجاد و مقداردهی می شوند ( به اصطلاح سِت می شوند ) ، برای اینکه بعد از رفع خطا و یا بعد از رسیدن به انتهای فایل ، در ادامه فایلِ مورد استفاده ، دادههایی را بنویسیم و دوباره خطایابی کنیم یا بررسی کنیم که به انتهای فایل رسیدهایم یا نه باید نشانگر خطای فایل یا انتهای فایل را پاک کرده و دوباره به کار خود ادامه دهیم که این کار را می توانیم توسط تابع clearerr انجام دهیم . نشانگر خطا و یا انتهای فایل پس از مقدار یافتن در برنامه ، باقی می مانند و گفتیم که اگر فایل را ببندیم یا از fseek استفاده کنیم ، نشانگر خطا پاک می شود ؛ ولی این روش حرفهای برای پاک کردن و خالی کردن نیست ؛ چون بهتر است خطا یا انتهای فایل را ابتدا پیدا نموده ، رفع خطا کنیم و در ادامه فایل ، چیزی بنویسیم و سپس آنها را خالی کرده و به ادامه کار خود در مورد فایل بپردازیم که برای این کار بهتر است از تابع clearerr استفاده کنیم . تابع clearerr هیچ مقداری را باز نمی گرداند . شکل کلی فراخوانی تابع clearerr بدین صورت می باشد :
{{چپچین}}
clearerr(FILE * Stream);
{{پایان چپچین}}
مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include<stdio.h>
int main(void)
{
FILE * fr = fopen("test.txt", "r");
if(fr == NULL)
{
printf("File not found\n");
return 1;
}
int ch;
ch = getc(fr);
while(ch != EOF)
{
putchar(ch);
ch = getc(fr);
}
printf("We Reached EOF\n");
clearerr(fr);
if(feof(fr) != 0)
printf("EOF still set\n");
else
printf("EOF is cleared\n");
fclose(fr);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
'''توضیح :''' فایل test.txt را که پیشتر ایجاد نمودیم جهت خوانده شدن به صورت متنی ، باز می کنیم . چک می کنیم تا در صورت عدم وجود ، در خروجی خطدستوری ، چاپ شود : فایل موجود نیست و تابع main با خطا پایان یابد . متغیر ch را از نوع صحیح ایجاد نموده و یک کاراکتر از فایل خود را خوانده و در آن ذخیره می کنیم . سپس تا زمانی که به پایان فایل نرسیدهایم فایل test را به صورت کاراکتری ، یک به یک ، خوانده و در خروجی خطدستوری ، چاپ می کنیم . سپس چاپ کردهایم به پایان فایل رسیدهایم ( همان EOF ) سپس تابع clearerr را فراخواندهایم تا ماکروی علامت EOF پاک شود . سپس چک کردهایم تا اگر EOF وجود دارد و feof مقدار 0 ندارد چاپ شود EOF still set یعنی علامت پایان فایل همچنان سِت شده است و در غیر این صورت چاپ کند EOF is cleared یعنی علامت پایان فایل پاک شده است که همین طور است ؛ چون با clearerr ماکروی علامت EOF پاک شده است و feof مقدار 0 را می گیرد ( یعنی به پایان فایل نرسیدهایم که البته رسیدهایم و این تمرین مناسبی نیست ، مگر آنکه در ادامه سند یا همان فایل بخواهید متن یا مقادیر دیگری بنویسید ) سپس فایل را بسته و تابع main را با موفقیت به پایان رساندهایم
== ماکروی stderr ==
ماکروی stderr سرنام standard error یکی دیگر از ماکروهای استاندارد ورودی و خروجی همانند stdin و stdout است که برای چاپ پیام خطا در خروجی خطدستوری به کار می رود و می توان از تابعهایی که در خروجی فایل متنی می نویسند استفاده کرد تا به جای نوشتن خطا در فایل ، آن را در خروجی خطدستوری چاپ کند . همانند تابع perror سرنام print error که در همین مبجث آن را می نویسیم و مخصوص چاپ پیام خطاست و هیچ آرگومانی نمی پذیرد ، stderr نیز برای چاپ پیام خطاست . ما می توانیم هر متن خطایی را که خواستیم با stdout آن را چاپ کنیم اما تفاوت stdout و stderr در این است که stdout در بافر buffer سیستم عامل ، ذخیره می گردد اما stderr در بافر نوشته نمی شود و تنها در ترمینال سیستم عاملهای مبتنی بر یونیکس یا شبهیونیکس و خطدستور command prompt ویندوز وجود دارد و به محض بسته شدن آن ، تمام محتوای آن ، پاک می شود . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include<stdio.h>
int main(void)
{
fprintf(stderr, "This is an error\n");
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
توضیح این مثال بسیار ساده است و ما با تابع کتابخانهای fprintf که در فایل متنی می نویسد ، در خروجی خطدستوری ، چاپ کردهایم : این یک خطاست و خط را شکستهایم اما '''دقت کنید''' که تابع ، دیگر آرگومانی نمی تواند بپذیرد و به جای اشارهگر فایل خود می نویسیم stderr
== ماکروی نوع داده fpos_t و تابعهای fgetpos و fsetpos ==
در سیستم عامل قدرتمندی همچون گنو/لینوکس fseek که پیشتر آن را نشریح کردیم می تواند تعداد کاراکترها را نیز در فایل متنی بخواند و به همان جا اشاره کند . اما سیستم عاملهای دیگری نظیر ویندوز در گذشته این قابلیت را نداشتند . ضمناً برخی از فایلها حجمشان از تعداد بایتهای قابل ذخیره در یک صحیح بلند long int بیشتر است . برای همین در استانداردهای C 98/99 و نوینتر از آن ، نوع داده fpost_t به عنوان یک ماکروی نوع داده شیئ کامل تعریف شد که یک آرایه نیست و می تواند به یک رکورد اشاره کند ؛ '''نکته :''' در دانش برنامهنویسی ، یک آرایه ، مجموعهای از عناصرِ فقط یک نوع داده است اما یک رکورد می تواند مجموعهای از عناصرِ انواع مخلف باشد که هر کدام ، یک نام دارند و از طریق آن نام ، می توان به محتوای آن دسترسی پیدا کرد .
ماکروی نوع داده شیئ کامل fpost_t یک داده را اعلان می کند که به انتهای فایل اشاره می کند . پس از آن تابع fgetpos هر جا که در فایل بنویسیم یا از آن بخوانیم و داده اعلان شده را در آن ، قرار دهیم به داده اعلان شده مقدار می دهد و هر جا که تابع fsetpos را به همراه داده مقداردهی شده به کار ببریم ، اشارهگر فایل را به همان جا می برد . شکل کلی استفاده از این ماکرو و تابعها بدین صورت می باشد :
{{چپچین}}
fpos_t pos;
{{پایان چپچین}}
نام pos یک نام اختیاری برای fpos_t است که سرنام file position type و به معنی نوع جای فایل ، می باشد
{{چپچین}}
fgetpos(FILE *stream, fpos_t *pos);
{{پایان چپچین}}
تابع کتابخانهای fgetpos سرنام file get position به معنی جای فایل را به دست بیاور ، یک اشارهگر به فایل را به همراه داده اعلان شده توسط fpos_t می گیرد و آن را مقداردهی می کند . این تابع در صورت موفقیت آمیز بودن عملکرد خود ، مقدار 0 را باز می گرداند و در غیر این صورت مقداری دیگر را باز می گرداند و ضمناً متغیر خطایاب errno را مقداردهی می کند که مقدار آن در هر پیادهساز ، تعریف خود را دارد
{{چپچین}}
fsetpos(FILE *stream, fpos_t *pos);
{{پایان چپچین}}
تابع کتابخانهای fsetpos سرنام file set position به معنی جای فایل را قرار بده ( ست کن ) ، یک اشارهگر به فایل را به همراه داده مقداردهی شده توسط fgetpos می گیرد و نمایانگر یا همان اشارهگر فایل را به همان جا می فرستد . دقت کنید که پیش از استفاده از fgetpos باید با fgetpos جای فایل را تعیین کنید ، در غیر این صورت نمی توانید به درستی از آن استفاده کنید و در برنامه شما خطایی رخ می دهد چرا که جای فایل ، تعیین نشده است . این تابع ، در صورت موفقیتآمیز بودن عملکرد خود مقدار 0 را باز می گرداند و EOF را پاک می کند و ضمناً تمام کاراکترهایی که توسط ungetc به عقب رانده شدهاند را نادیده می گیرد و در غیر این صورت مقداری غیر از 0 را باز می گرداند و متغیر خطایاب errno را مقداردهی می کند
مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
FILE * fp;
fp = fopen("example.txt", "w+");
if(fp == NULL)
{
printf("Error during open file\n");
return 1;
}
fputs("1st sentence\n2nd sentence\n3rd Sentence", fp);
fpos_t pos;
rewind(fp);
char str[25];
fgets(str, sizeof(str), fp);
printf("1 : %s", str);
fgetpos(fp, &pos);
fgets(str, sizeof(str), fp);
printf("2 : %s", str);
fsetpos(fp, &pos);
fgets(str, sizeof(str), fp);
printf("After getting same position : %s", str);
fgetpos(fp, &pos);
fgets(str, sizeof(str), fp);
printf("3 : %s", str);
fclose(fp);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
:توضیح : در مثال بالا فایلی به نام example.txt را جهت نوشتن و خواندن متنی ، ایجاد نمودهایم . سپس در آن نوشتهایم : جمله اول ، جمله دوم و جمله سوم ؛ که در هر کدام خط را شکستهایم . سپس fpos_t یک داده را به نام pos اعلان کرده است که به انتهای فایل ، اشاره می کند . پس به ابتدای فایل باز می گردیم ( با تابع rewind ) . با نوشتن شماره ۱ ، جمله اول را در خروجی خطدستوری ، چاپ کردهایم .
:پس اشارهگر فایل به ابتدای خط دوم می رود و با fgetpos آن را مقداردهی کردهایم تا ابتدای خط دوم مقدار pos شود . خط دوم را خواندهایم و در خروجی خطدستوری ، چاپ کردهایم : ۲ : جمله دوم . سپس با fsetpos مقداری را که fgetpos تعیین کرده بود برای pos تعیین می کنیم که همان ابتدای خط دوم است و دوباره خط دوم را خوانده و در خروجی خطدستوری چاپ کردهایم : بعد از رسیدن به همان جا : خط دوم .
:ما به ابتدای خط سوم می رسیم اما هنوز pos مقدار دهی مجدد نشده است دوباره با fgetpos مقدار pos را به روزرسانی کردهایم که ابتدای خط سوم است و از فایل خود ، خط سوم را خوانده و در خروجی خطدستوری چاپ می کنیم : ۳ : جمله سوم .
:البته این کار ضروری نیست ، چون به خودی خود ، pos به ابتدای خط سوم اشاره می کند اما اگر بخواهیم حتما به جای خاصی از فایل برویم باید با fgetpos مقدار pos را به روزرسانی کنیم . در پایان فایل را بسته و تابع اصلی برنامه را با موفقیت به پایان می رسانیم
== نکته : میانگیری یا بافرینگ ==
بافرینگ ( Buffering ) یا با برگردان فرهنگستان به میانگیری به روشی می گویند که دادهها یا اجسام و موادّ در جایی به صورت موقت ، انباشه می شوند تا بعد از پردازش و یا پیرایش به جای دیگری فرستاده شوند که باعث دست نخوردگی و پایداری ( استیبل شدن Stable ) و یا تسریع در روند آن می شود . اما ما فعلاً فقط به میانگیری یا بافرینگ دادهها در علوم رایانه می پردازیم . میانگیری در علوم رایانه ۳ کاربرد دارد :
۱ - تسریع در روند پردازش دادهها و ورودی/خروجی : در همین کتاب و در همین مبحث بارها مثالهایی را از خواندن و نوشتن و کپی ( Copy کاپی ) کردن فایل نوشتهایم . در برخی از آنها یک بایت به یک بایت ( که عموماً به آن کاراکتر می گوئیم - در تابعهایی مثل fgetc و fputc - اما هر کاراکتری در استاندارد انسی ANSI که کاراکترست ASCII ازکی است را شامل می شود و به صورت دودویی هر مقداری را می توان خواند و نوشت ) خواندهایم و نوشتهایم . تقریباً تمام سیستم عاملها در هسته خود ( Core ) شامل کرنل Kernel و اجزاء کمکی آن ( Core Components ) میانگیر یا بافر ( Buffer ) دارند و عمل ورودی/خروجی ( I/O ) را تسریع می کنند اما اگر برنامه نویس یک بایت به یک بخواهد بخواند و بنویسید ، در زبان C به سیستم عامل تحمیل و دستور داده می شود تا به همان شکل عمل کند ( فراموش نکنید که زبان سی ، زبان اصلی اکثر کرنلهاست و تمام سیستم عاملها کتابخانههایی را برای اجرای برنامهها به زبان سی و/یا سیپلاسپلاس دارند - چه در زمانی که برای سیستم عامل کامپایل می کنید و چه یک برنامه نویس برای نوشتن کرنل خود از یک کامپایلر و کتابخانههای آن استفاده کند این تحمیل و دستور وجود دارد ) اما اگر به جای آن ، یک آرایه بسازیم که مثلاً هزار عنصر داشته باشد و یا ده هزار عنصر ، و بعد به اندازه آن از فایل ، بخوانیم و به همان اندازه بنویسیم در واقع میانگیری کردهایم و سرعت کپی کردن خود و یا هر نوع خواندن و نوشتن را بالا بردهایم
۲ - پیمانهای کردن دادهها و تنظیم سرعت : این روش در علوم بسیاری ، از جمله الکترونیک و مخابرات و همچنین همین علوم رایانه ، کاربرد پایدار کردن ( استیبل کردن Stabilization ) و تنظیم سرعت را دارد . نمی خواهیم از بحث خارج شویم ولی این مثال به درک نحوه میانگیر کردن کمک بزرگی می کند . در یاختههای مهرهداران و یا حتی دیگر جانداران پریاختهای ، در یاختههای مخصوصی در انباشتگاههای خودشان ( Buffer یا میانگیر ) اسید و باز ، انباشت می کنند تا در صورتی که خون و یا بدن جانور از حدی اسیدیتر شد و pH پهاش آن پائین آمد ، بازِ انباشت شده در خود را آزاد کنند و یا خلاف جهت آن ؛ اگر از حدی بازیتر شد و pH آن بالاتر رفت ، اسید خود را آزاد کنند که در این صورت اسید و باز با هم ترکیب میشوند ( و نمک و آب می سازند که نمک ، توسط تصفیه کننده خون ، مثل کلیهها در برخی از پستانداران ، دفع می گردد ) و در نتیجه پهاش pH خون و بدن ثابت باقی می ماند . در علوم رایانه و الکترونیک ، میانگیر کردن به همین شکل به پایداری عملکرد سیستم ، کمک می کند . به عنوان مثال ، پخش کردن ویدئو و یا صدا را در نظر بگیرید . کاربران قدیمی رایانه به خوبی به یاد خواهند داشت و یا حتی هم اکنون نیز ممکن است با چنین پدیدهای مواجه شوید که سرعت ارتبط شما با شبکه ( کانکشن Connection ) پائین باشد ( در گذشته اتصال به اینترنت اکثراً از طریق مودمهای تماسی Dial-Up امکانپذیر بود که سرعت بسیار بسیار پائینی داشت ) و شما بخواهید یک فایل ویدوئی را تماشا کرده و بشنوید و یا فایل صدایی ( صوتی ) را گوش بدهید . در چنین مواقعی اگر به اندازه سرعت شما قابهای ویدئو ( فریمها Frames - واحد سازنده هر ویدئو یا انیمیشن که پشت سر هم و با سرعت معین به تصویر متحرک تبدیل می شوند و به صورت متحرک دیده می شوند ) و یا نمونه-بیتها ( بیت سمپلها Bit Samples واحد سازنده هر فایل صدایی - یا همان صوتی ) را نشان دهد و/یا پخش کند شما نمیتوانید عملاً آن فایل را تماشا کرده و گوش دهید . برای همین برنامهنویسان ، فایل را میانگیر می کنند و هر مثلاً یک یا دو یا سه ثانیه از ویدئو یا صدا را انباشت میکنند و بعد از رسیدن به آن مقدار ، ویدئو و صدا را برای شما پخش می کنند یا اینکه فرض کنید سیستم شما چندان به روز و قدرتمند نیست و شما می خواهید یک فیلم سینمایی با کیفیت ۱۰۸۰ پیکسلی ( که ارتفاع قابهای آن - فریمهای آن - ۱۰۸۰ پیکسل و یا نزدیک به آن است ) تماشا کنید . اگر قرار باشد پخش کننده رسانه Media Player بخواهد کل فایل را رمزگشایی و سپس در حافظه موقت ( Memory که همان رم RAM است ) بارگذاری کند ( Loading ) سیستم شما یا قفل خواهد کرد و مجبور به راه اندازی مجدد سیستم خواهید شد یا اینکه اگر سیستم عامل شما قدرتمند باشد پس از چند ثانیه ، سیستم عامل ، برنامه را پایان می دهد ( Termination ) بنابراین پخش کنندههای رسانه یک یا دو دقیقه از فیلم و ویدئو را رمزگشایی ( دکود Decode ) می کنند و بر روی حافظه موقت بارگذاری می کنند و آن را پخش می کنند و حتی اگر بخواهید فیلم را ۵ دقیقه یا مثلاً نیم ساعت جلو ببرید ، یک یا دو دقیقه قبلی را از حافظه موقت پاک می کنند و سپس دوباره آن قسمت از فیلم و ویدئو را که شما دستور داده بودید پخش کند بارگذاری می کنند . به همین شکل ممکن است سرعت دستگاههای الکترونیکی رایانه ( که میانگیر کردن در خود الکترونیک نیز به کار می رود اما ما در اینجا به آن نمی پردازیم ) و یا در شبکههای مختلف رایانه مثل شبکه اینترنت و پروتکلهای آن ، تداخل پیش بیاید و سرعتهای دادهها نسبت به هم و یا میزبان/میهمان و یا حجم دادهها در آنها نسبت به سرعت میهمان بیشتر باشد ( و یا حتی بعضاً حجم درخواستهای میهمانها از سرعت میزبان بیشتر باشد ) در چنین مواقعی ، پیمانهای عمل کردن برنامهها و یا میانافزارها و سختافزارها ، کمک می کند تا کم کم ، ورودی دریافت شده و به خروجی فرستاده شود و چه سرعت ورودی کم یا زیاد باشد و یا سرعت خروجی کم یا زیاد باشد ، سامانه دچار مشکل و قفل شدن نمی شود
۳ - دادههای موقتی : یکی دیگر از کاربردهای میانگیر کردن ، ساخت یک داده موقتی است ( که این داده از هر نوعی و در هر اندازهای ممکن است باشد ) که دو کاربرد دارد : ۱ - بخواهیم همان زمان با ساخت داده موقت ، بر روی آن پردازش و پیرایش انجام دهیم . به عنوان مثال ، در گذشتهها پیرایشگرهای تصاویر رستر ( Raster Graphics گرافیکهای مبتنی بر پیکسل Pixel ) وقتی فایلی را باز می کردند پیرایشها را بر روی خود همان فایل انجام میدادند و اگر حتی پیرایشهای خود را ملغا ( Undo ) می کردید و آن را ذخیره ( Save ) می کردید باز هم فایل شما دستخوش تغییر قرار می گرفت ( چون تصویر ، پیرایش شده بود و فقط توسط رمزنگار برنامه مجدداً مانند اولش نوشته می شد اما اگر از یک فایل ادیتور یا همان هگزادسیمال ادیتور Hexadecimal Editor استفاده می کردید ، مشاهده می کردید که فایل تغییر پیدا کرده است ) به این روش ویرانگر یا Destructive گفته می شود . اما امروزه برنامههای پیرایشگر رستر به روش ناویرانگر Non Destructive عمل می کنند و هر فایلی که باز می کنید یک فایل کپی موقت ( Temporary ) از روی آن می سازند و بعد از رمزگشایی و بارگذاری بر روی حافظه تغییرات را بر روی آن اعمال می کنند و بدین صورت فایل شما دست نخورده باقی می ماند و هر وقت که خواستید می توانید آن را در فایلی جدید ذخیره ( Save ) و یا جایگزین همان فایل خودتان کنید . همین تکنیک در مورد پیرایش فایلهای ویدئویی نیز به کار می رود ۲ - گاهی نیاز پیدا خواهید کرد تا فایل موقتی بسازید و چند بار بر روی آن پردازش انجام دهید که غیر متوالی هستند . در این صورت فایل را میانگیر می کنید و هر موقع نیاز داشتید آن را پردازش کرده و به سراغ فایلهای دیگر می روید و یا کارهای دیگری انجام می دهید و سپس دوباره به پردازش فایل میانگیر شده خود ( Buffer ) باز می گردید
در مجموع ، میانگیر کردن و ساخت یک میانگیر ( بافر Buffer ) در نوشتن برنامههای شبکه و پروتکلهای آن ، پخش کنندههای رسانه ( میانافزاری و نرمافزاری ) و هسته سیستم عامل ، مخصوصاً کرنل آن در کنار بسیاری دیگر از بخشهای مهندسی نرمافزار و برنامهنویسی ، ضروری و حیاتی است
== تابع setbuf و ماکروی مقدار BUFSIZ ==
گاهی در برنامهنویسی پیشرفته ، امکان دستی ، تعیین کردن میانگیر یا بافر ناممکن و یا بسیار سخت است ( مخصوصاً در برنامهنویسی سطح پائین ) که ما هنوز به این مرحله نرسیدهایم . اما تابع قدیمی setbuf سرنام set buffer به معنی میانگیر را تعیین کن ، با ماکروی اندازه حداقل به اندازه BUFSIZ سرنام Buffer Size به معنی اندازه میانگیر ( بافر ) که امروزه منسوخ شده است و به جای آن در استاندارد سی C تابع setvbuf تعریف شده است ، می تواند میانگیر را برای شما ایجاد کند تا هم فایل را به صورت موقت در حافظه RAM نگهداری کنید و به پردازش آن بپردازید و هم عملیاتهای خواندن/نوشتن را پیمانهای می کند . دقت کنید : ۱ - تابع setbuf باید برای فایلی تعیین شود که باز شده است ۲ - تابع setbuf باید قبل از هر عملی بر روی فایل برای خواندن و نوشتن ، اعمال شود ۳ - اگر مقدار میانگیر را که باید تعیین کنید ، در یک حوزه محلی ، تعیین کنید پس از اتمام بلوکِ آن میانگیر ، همانند یک متغیر معمولی ، میانگیر و بافر ، خالی می شود و دیگر موجود نخواهد بود . اگر می خواهید میانگیر را توسط تابعهای زبان سی C و کامپایلر بسازید ، بهتر است آن مقدار آن را ( مثل مقدار BUFSIZ ) با حوزه سراسری تعیین کنید . در غیر این صورت برنامه شما رفتار تعریفنشدهای بروز خواهد داد ۴ - مقدار میانگیر (بافر ) ، طبق استاندارد باید حداقل به اندازه ماکروی مقدار BUFSIZ که در فایل سرآیند stdio تعریف شده است باشد ( استاندارد ، مقدار آن را تعیین نکرده است ولی در کامپایلری مثل GCC مقدار آن 8192 بایت است ) اگر کامپایلر شما از مقدار کوچکتر پشتیبانی نکند و شما مقداری کوچکتر تعیین کنید با خطا در برنامه مواجه خواهید شد
در صورتی که می خواهید فایل بزرگی را میانگیر کنید بهتر است مقداری بزرگتر از BUFSIZ استفاده کنید و باز هم بهتر است مقدار آن ، مقدار از توان ۲ باشد ؛ مثل : 16384 یا 32768 و ... ) . شکل کلی استفاده از تابع setbuf بدین صورت می باشد :
{{چپچین}}
setbuf(FILE *stream, char *buffer);
{{پایان چپچین}}
باید اشارهگر فایلی را که می خواهید میانگیر کنید را به آن بفرستید و یک آرایه کاراکتری با اندازه حداقل BUFSIZ تا به همان اندازه ، فایل شما را میانگیر کند . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
#include <time.h>
int main()
{
clock_t start, end;
double time_passed;
char buf[BUFSIZ];
start = clock();
FILE * fp, * fp2;
fp = fopen("post-1.jpeg", "rb");
fseek(fp, 0, SEEK_END);
long int size = ftell(fp);
fseek(fp, 0, SEEK_SET);
unsigned char fr[size];
setbuf(fp, buf);
fread(fr, size, 1, fp);
fclose(fp);
fp2 = fopen("copy.jpeg", "wb");
setbuf(fp2, buf);
fwrite(fr, size, 1, fp2);
fclose(fp2);
end = clock();
time_passed = ((double) (end - start)) / CLOCKS_PER_SEC;
printf("Program execution time: %lf seconds\n", time_passed);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در این برنامه از فایل سرآیند time که هنوز به مبحث آن نرسیدهایم استفاده نمودهایم . به معنی زمان می باشد و دارای تابعها و ماکروهایی برای تعیین زمان و سنجش آن می باشد . ابتدا توسط ماکروی clock_t دو متغیر به نام آغاز و پایان اعلان نمودهایم و هر دو را یک بار در آغاز برنامه و یک بار در پایان برنامه با تابع clock که زمان را تعیین می کند مقداردهی نمودهایم . '''دقت کنید :''' ما در این برنامه از دو روش فایلی را با نام post-1.jpeg میانگیر کردهایم . یک بار توسط پیمانه size که به اندازه فایل خودمان ( که شما میتوانید هر فایلی را که در دایرکتوریِ برنامه کامپایل شده خودتان قرار دارد بنویسید ) آن را خواندهایم و به همان اندازه نوشتهایم . یک بار هم توسط تابع setbuf آن را میانگیر و بافر کردهایم . در پایان برنامه مقدار زمان پایان برنامه را منهای مقدار زمان آغاز برنامه نموده و با دقت دو برابر اعشار در خروجی خطدستوری چاپ نمودهایم . دقت کنید که در این برنامه کارکرد setbuf به حداقل خود رسیده است چون به اندازه فایل ، خواندهایم و آن را در حافظه موقت ( RAM ) نوشتهایم سپس فایل را بر روی حافظه دائمی ( مثل H.D.D یا S.S.D ) نوشتهایم . اما اگر اندازه فایل بزرگتر از مقدار قابل سنجش می بود ( مثل نوشتن برنامه سامانه فایلبندی File System ) عملکرد setbuf با مقدار بززگ ، کاملاً چشمگیر می شد
== تابع setvbuf و ماکروهای IOFBF_ و IOLBF_ و IONBF_ ==
تابع setvbuf همانند تابع setbuf می باشد با این تفاوت که نوع میانگیر کردن و اندازه میانگیر ، در دست برنامهنویس است . شکل کلی فراخوانی تابع setvbuf بدین صورت می باشد :
{{چپچین}}
setvbuf(FILE * stream, char * buffer, int mode, size_t size);
{{پایان چپچین}}
ابتدا نام جریان فایل را می نویسیم ، سپس آرایه کاراکتری خود را و سپس نوع میانگیر کردن را که یکی از سه ماکروی نوشته شده است و در نهایت اندازه میانگیر کردن را . سه ماکروی نوشته شده که نوع میانگیر را تعیین می کنند بدین قرار هستند :
IOFBF_ سرنام Input/Output Full Buffer به معنی میانگیر کردن کامل ورودی/خروجی
IOLBF_ سرنام Input/Output Line Buffer به معنی میانگیر کردن خط در ورودی/خروجی
و
IONBF_ سر نام Input/Output Not Buffer به معنی عدم میانگیر کردن ورودی/خروجی
'''دقت کنید :''' در صورتی که بخواهید میانگیر کردن را از کار بیاندازید و از IONBF_ استفاده کنید باید حتماً به جای آرایه کاراکتری از ماکروی مقدار تهی NULL نول استفاده کنید و اندازه را 0 تعیین کنید ؛ در غیر این صورت در هر گونه میانگیر کردن باید اندازهای بزرگتر از 0 داشته باشد . تابع setvbuf در صورت موفقیتآمیز بودن عملکرد خود مقدار 0 را باز می گرداند و در غیر این صورت مقداری غیر 0 را . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
char buf[30];
if(setvbuf(stderr, buf, _IOFBF, sizeof buf))
{
printf("failed to change the buffer of stdout");
return 1;
}
fprintf(stderr, "He");
fflush(stderr);
if(setvbuf(stdout, NULL, _IONBF, 0))
{
printf("failed to change the buffer of stdout");
return 1;
}
printf("llo w");
if(setvbuf(stdout, buf, _IOLBF, sizeof buf))
{
printf("failed to change the buffer of stdout");
return 1;
}
printf("orld!");
putchar('\n');
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
این قطعه کد را مشابه قطعه کد مثال setvbuf در ویکی کتاب انگلیسی نوشتهام ؛ چرا که بسیار زیبا و کارآمد نوشته شده است . یک آرایه کاراکتری با ۳۰ عنصر ، اعلان نمودهایم که نقش میانگیر ما را ایفا می کند . سپس در داخل شرط ، میانگیر کامل خود را بر روی stderr اعمال نمودهایم تا میانگیر و بافر شود . اگر به یاد داشته باشید گفتیم که stderr در داخل بافر سیستم عامل یا کرنل ، نوشته نمی شود . ولی با این کار می توانیم stderr را نیز میانگیر کنیم . در صورت خطا ، پیغامی ، چاپ خواهد شد و تابع اصلی برنامه با خطا به کار خود خاتمه خواهد داد اما در غیر این صورت He در بافر سیستمعامل یا کرنل ( بسته به اینکه برای سیستم عامل ، برنامه می نویسیم و یا سطح پائین و برای سیستم ) می نویسد و سپس آن را خالی می کنیم . سپس بدون میانگیر کردن در خروجی خط دستوری چاپ می کنیم : llo w و در ادامه با میانگیر کردن خط در محیط خطدستوری مثل ترمینال در سیستمعاملهای یونیکس و شبه یونیکس و command prompt در ویندوز و همچنین خطدستور در برنامههای سطح پائین ( مثل بارگذار بوت یا کرنل یا هسته سیستمعامل ) چاپ می کنیم : !orld و در ادامه خط را می شکنیم تا میانگیر شود . دقت کنید اگر خط ، شکسته نشود ، میانگیر ما در حافظه موقت ، تخلیه نمی شود و به جای حروف نوشته شده به احتمال زیاد ، حروف دیگری نمایش داده می شوند ( می توانید امتحان کنید و putchar(\n) را کامنت کنید یا حذف کنید و کامپایل و لینک کرده و سپس اجرا کنید و دوباره آن را اضافه کنید و کامپایل و لینک و اجرا کنید تا نتیجه را ببینید )
== تابع perror ==
تابع perror سرنام print error به معنی خطا را چاپ کن ، خطایی را که در عملیات ورودی/خروجی پیش آمده است را به خروجی استاندارد که معمولاً محیط خطدستوری است می فرستد و نمایش می دهد . شکل کلی استفاده از perror بدین صورت می باشد :
{{چپچین}}
perror(const char * string);
{{پایان چپچین}}
شما مجاز هستید تا درون تابع ، پیامی را به صورت یک رشته یا حتی یک کاراکتر بنویسید تا نمایش داده شود و در این صورت ابتدا پیام شما نمایش داده شده و سپس با یک دو نقطه ( : ) و یک فاصله خالی ( اسپیس Space ) perror پیام خطای سیستم را که در آخرین ورودی/خروجی پیش آمده در stderr می نویسد . ولی اگر داخل تابع یک کاراکتر با مقدار ماکروی تهی ( نول NULL ) قرار بدهید و یا رشته را خالی بگذارید ، تنها پیام خطای سیستم ، نمایش داده می شود . '''دقت کنید :''' هر جا که امکان وجود خطا در ورودی/خروجی پیش آمد perror را بنویسید و گرنه errno با مقدار و پیام خطای دیگری که پیش بیاید جایگزین می شود . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
FILE * file = fopen("imaginary_file.bin", "rb");
if(file == NULL)
{
perror("Error on opening file");
return 1;
}
else
fclose(file);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
'''توضیح :''' در تابع اصلی برنامه ( main ) تلاش کردهایم تا فایلی را که وجود ندارد ( دقت کنید تا در جایی که برنامه را اجرا می کنید فایلی با این نام وجود نداشته باشد تا کارایی مثال بالا را متوجه شوید ) با نام فایل خیالی ( imaginary_file ) با پسوند bin که نشان می دهد فایل از نوع اجرایی و دودویی است ( binary ) با حالت خواندن دودویی rb باز کنیم و اگر فایل موجود نبود پیام خطا چاپ شود : خطا در باز کردن فایل و سپس سیستم ، پیام خطای خود را چاپ می کند که چیزی شبیه به No Such File or Directory یا دقیقاً همین پیام است . در غیر این صورت فایل با موفقیت باز شده و سپس بسته می شود ولی اگر این فایل را در دایرکتوری ( که در ویندوز با اصطلاح فولدر Folder شناخته می شود ) برنامه کامپایل شده بالا ایجاد نکنید ، پیام خطا را مشاهده خواهید نمود
== تابع tmpnam و ماکروهای TMP_MAX و L_tmpnam ==
تابع tmpnam سرنام temporary name به معنی نام موقت برای ایجاد نامی تصادفی و موقت و معمولاً برای سندها ( فایلها ) است که هنوز تصمیمی برای انتخاب نامی برای آن نداریم و البته این نام ، توسط پیادهساز ، نامی ساخته می شود که در سند برنامه و یا دایرکتوری سندهای موقت ، موجود نباشد . اما TMP_MAX سرنام Temporary Maximum به معنی حداکثر (نام ) موقت ، یک ماکرو است که نشان می دهد پیادهساز ( کامپایلر ) تا چند ، نام موقت را می تواند بسازد و ماکروی L_tmpnam سرنام Length of temporary name به معنی طول نام موقت است که حداکثر تعداد کاراکترهایی که پیادهساز می تواند برای نام موقت ، بسازد چند کاراکتر است . جهت متوجه شدن این مسئله به راحتی میتوانید از printf استفاده کنید . یعنی :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
printf("longest name generated is %d and maximum number of random names are : %d\n", L_tmpnam, TMP_MAX);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در پیادهسازهای محتلف و سیستم عاملهای مختلف و البته با توجه به اندازه حافظه موجود در سیستم شما این اعداد می توانند متفاوت باشند . به طور مثال در سیستم عامل گنو/لینوکس و کامپایلر GCC در یک افراز ( پارتیشن Partition ) ۵۱۲ گیگابایتی این مقادیر ۲۰ و ۲۳۸۳۲۸ است ؛ یعنی طولانیترین نامی که GCC می سازد ۲۰ کاراکتر دارد و نهایتاً می تواند ۲۳۸ هزار و ۳۲۸ نام تصادفی ، تولید کند
شکل کلی استفاده از تابع tmpnam بدین صورت می باشد :
{{چپچین}}
tmpnam(char * str);
{{پایان چپچین}}
در ابتدا دقت کنید که شما برای مقدار دهی tmpnam یا باید از ماکروی مقدار تهی NULL استفاده کنید که تابع ، یک اشارهگر به میانگیر ( بافر Buffer ) ایستای سیستم را باز می گرداند و نام می تواند در یک رشته ذخیره شود یا اینکه یک رشته می سازید که تعداد عنصرهای آرایه باید '''حداقل''' به تعداد L_tmpnam باشد و tmpnam را فرا می خوانید تا آن را مقدار دهی کند . ضمناً اگر بخواهید از این نامها برای ایجاد سند ( فایل ) استفاده کنید کامپایلر ، سندها را در دایرکتوری موقت سیستم عامل می سازد . این دایرکتوری در گنو/لینوکس و دیگر شبهیونیکسها همچون سیستم عاملهای مکینتاش ( Mac OS X , OS X , macOS ) در نشانی tmp/ یعنی در فولدر یا دایرکتوری tmp در ریشه ( root ) قرار دارد و در سیستم عاملهای جدید مایکروسافت ویندوز در :
C:\Users\LocalUser\AppData\Local\Temp\
'''دقت کنید :''' یکم اینکه در گذشته ، ویندوز ، همانند سیستم عاملهای شبهیونیکس برای نشانیدهی از اسلش / استفاده میکرد ولی از ویندوز XP به بعد از بک اسلش ( Back Slash ) \ استفاده می کند . دوم اینکه این آدرس در ویندوزهای قدیمی ، متفاوت است و سوم اینکه از ویندوز ۷ به بعد هر افراز ( پارتیشن ) ـی که بر روی آن ویندوز حاضر و فعلی نصب باشد C نام میگیرد ( ممکن است شما دو ویندوز نصب کنید و یکی بر روی افراز D باشد ولی وقتی آن را آغاز کنید - Start Up - نام آن به C تغییر پیدا میکند )
ضمناً این دایرکتوری برای برنامهنویسی حرفهای ، بسیار کاربرد دارد . فرض کنید میخواهید یک پخش کننده چند رسانهای ( Multimedia Player ) یا هر برنامه دیگری بنویسید و هر سندی ( فایلی File ) که باز شد را در فهرست آخرین سندها نگه دارید و به درخواست کاربر ، هر موقع که خواست آن را پاک کنید . برای این کار ، یک فایل در دایرکتوری موقت Temporary می سازید و آن را با سندهایی که باز می شوند ، پیرایش کرده و به روز رسانی می کنید و هر موقع کاربر به برنامه دستور داد که تخلیه شود آن را پاک می کنید و از نو آغاز می کنید . یا مثلاً یک پیرایشگر متن ( Text Editor ) یا واژه پرداز ( Word Processor ) می نویسید و برای آن می خواهید هر ۵ یا ۱۰ دقیقه ( به طور نمونه ) یک بار یک نسخه پشتیبانی ( Backup ) از سند ( File ) یا پرونده ( Document در واژه پرداز ) ایجاد شود ؛ بنابراین آن را در دایرکتوری موقت ، می نویسید . بدین ترتیب اگر برنامه قفل کند یا متوقف شود ، پس از گشودن مجدد برنامه ، حداقل بخش بزرگی از سند یا پرونده ذخیره شده است
'''دقت کنید :''' تابع tmpnam با هر بار فراخوانی ، نام جدیدی را می سازد ؛ پس اگر هنوز نام ساخته شده را ذخیره نکرده باشید و دوباره آن را فرا بخوانید نام قبلی از بین می رود
تابع tmpnam در صورت موفقیت آمیز عمل کردن خود ، یک اشارهگر به نام ساخته شده خود باز می گرداند که اگر آرگومان آن NULL باشد یک اشارهگر به بافر ایستای سیستم ، بازمیگرداند و اگر یک رشته باشد یک رشته را باز میگرداند و اگر در هر صورتی ، کامپایلر ، موفق به ساخت نام موقت نشود یک اشارهگر تهی NULL باز میگرداند . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
char * buf1 = tmpnam(NULL);
char buf2[L_tmpnam];
tmpnam(buf2);
char buf3[30];
tmpnam(buf3);
FILE * fp1 = fopen(buf1, "w");
fputs("first file", fp1);
FILE * fp2 = fopen(buf2, "w");
fputs("second file", fp2);
FILE * fp3 = fopen(buf3, "w");
fputs("third file", fp3);
fclose(fp1);
fclose(fp2);
fclose(fp3);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
'''توضیح :''' یک رشته با نام buf1 تعریف کردهایم که مقدار آن را تابع tmpnam با آرگومان NULL مقداردهی می نماید . یک رشته دیگر با نام buf2 اعلان کردهایم که تعداد عنصرهای آن به اندازه L_tmpnam که اندیس آن می باشد است و سپس آن را با tmpnam مقداردهی کردهایم . سپس یک رشته با نام buf3 با ۳۰ عنصر ، اعلان کردهایم . دقت کنید چون GCC حداقل طول قابل پذیرشش ۲۰ است باید مقداری بزرگتر از آن را بنویسیم ( که در همین مبحث ، کمی بالاتر نوشتیم ؛ شما نیز مقداری بزرگتر از L_tmpnam در کامپایلر خود بنویسید ) سپس ۳ فایل ایجاد نمودهایم که نامهای آنها همان نامهای ایجاد شده توسط تابع tmpnam است ( به ترتیب ) و آنها را به صورت متنی برای نوشتن ، باز کردهایم و در هر کدام از آنها به ترتیب نوشتهایم : سند اول ، سند دوم و سند سوم و سپس فایلها را بستهایم و تابع اصلی برنامه را با موفقیت به پایان رساندهایم ( اگر به دایرکتوری - فولدر - موقت سیستم عامل خود مراجعه کنید ، آنها را خواهید یافت - Visual Studio در ویندوز تماماً آنها را تصادفی میسازد و GCC در گنو/لینوکس با پیشنام file )
'''نکته :''' تابع tmpnam از نظر امنیت زنجیره ، امن است البته اگر آرگومان آن NULL نباشد ؛ برای همین سیستمعاملهای شبهیونیکس و حتی ویندوز هر کدام تابعهایی غیر استاندارد دارند که فرآیند ساخت نامها کاملاً ایمن باشد . برای اطلاع از تابعهای موجود در کامپایلر و سیستم عامل خود به راهنمای آن مراجعه کنید
== ماکروی FOPEN_MAX ==
این ماکرو در فایل سرآیند stdio فقط یک مقدار ثابت دارد که سرنام File Open Maximum به معنی بیشینه ( حداکثر ) تعداد فایل می باشد و نشان می دهد که مطابق با سیستم عامل شما و کامپایلر شما ، در هر سند متن برنامه ، شما چند فایل را پشت سر هم می توانید بدون بسته شدن ، باز کنید . این مقدار باید حداقل طبق استاندارد ۸ باشد ولی به طور مثال در سیستم عامل گنو/لینوکس و کامپایلر GCC این مقدار ۱۶ است . برای اینکه این مقدار را که در فایل stdio کامپایلر شما تعریف شده است بیابید ، قطعه کد زیر را بنویسید و کامپایل و پیوند ( لینک ) کنید و سپس آن را اجرا کنید :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
printf("%d\n", FOPEN_MAX);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
'''توضیح :''' همانند مثالهای پیشین در این مبحث ، پس از تشریحهای فراوان دیگر در مباحث پیشین ، وقت را هدر نداده و قطعه کد را تشریح نمی کنیم . تابع کتابخانهای printf یک مقدار دسیمال ( دهدهی ) را که آرگومانش به آن فرستاده شود در خروجی خطدستوری ، نمایش می دهد و آرگومان آن ، ماکروی FOPEN_MAX می باشد که پس از اجرا می بینید که بیشینه فایلهایی را که در هر برنامه مجاز هستید تا پشت سر هم و بدون بستن فایلهای قبلی باز کنید چه تعداد می باشد
== ماکروی FILENAME_MAX ==
این ماکروی استاندارد که سرنام Maximum File Name می باشد به معنی بیشینه طول نام فایل ، بیشترین مقدار صحیحی که سیستم عامل اجازه می دهد برای هر نام فایل استفاده شود را نشان می دهد . دقت کنید که این مقدار صحیح ثابت است و در فایل سرآیند stdio تعریف می شود تا برنامهنویس بداند که بیشینه مقدار ، چه قدر است که این مقدار فقط تعداد کاراکترهای تعیین شده در ازکی ASCII می باشد ( منهای یکی ؛ چون آخرین مقدار ، تهی است ) و اگر از کاراکترهای یونیکد استفاده شود تعداد کاراکترهای قابل استفاده کاهش می یابد ( مثلاً در UTF-8 که زبانهای مختلف و شکلکها -ایموجیها - پشتیبانی می شوند هر کاراکتر غیر انگلیسی و ازکی ، چهار بایت اشغال می کند ) . این مقدار در حال حاضر در تقریباً تمامیِ سیستم عاملها و سامانههای فایلبندی ۲۵۶ بایت است که چون آخرین بایت آن ، تهی است می شود ۲۵۵ کاراکتر . برای مشاهده این مقدار در سیستم خود از قطعه کد زیر استفاده کنید :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
printf("%d\n", FILENAME_MAX);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
'''نکته :''' هرگز فراموش نکنید که برای برنامه خود در نوشتن آن برای تعیین نامهای فایلها از آرایهای با اندیس این ماکرو استفاده نکنید یعنی char fn[FILENAME_MAX] کاملاً '''خطاست''' . کامپایلر نه از شما خطا می گیرد و نه هشدار می دهد اما چون یک رشته می سازید که مقدار آن در سیستمهای مختلف مقادیر مختلف و بعضاً بزرگی دارد که باید پشت سرهم باشند ( رجوع کنید به مبحث آرایه ) برنامه شما به راحتی مرتکب خطا خواهد شد . بهتر است در صورتی که قصد دارید از این ماکرو برای تعیین نام فایلها استفاده کنید از ترفند تخصیص حافظه پویا که در مباحث بعدی مطرح می شود استفاده نمائید
== تابع tmpfile ==
تابع کتابخانهای tmpfile سرنام temporary file به معنی سند موقت ، یک فایل موقت می سازد که با بستن فایلِ آن یا تمام شدن اجرای برنامه ، حذف می شود . در سیستم عاملهای شبهیونیکس ، معمولاً در دایرکتوری tmp/ ساخته می شود که همین امر باعث می شود سیستم عامل از شما مجوزی برای اجرای برنامه نخواهد . ولی در سیستم عاملی مثل ویندوز Windows در نسخههای نوین آن پوشه (فولدر موقت temporary folder ) داخل فولدرهای اصلی ویندوز موجود است ؛ بنابراین یا باید به عنوان Admin مدیر ، وارد ویندوز شده باشید و یا گذرواژه ( پسورد Password ) آن را بدانید تا بتوانید برنامه را اجرا کنید . فایل موقت به صورتِ پیشفرض به حالت خواندن/نوشتنِ خام یا همان دودویی ( باینری Binary ) باز می شود اما شما می توانید به راحتی در آن ، متن را نیز بنویسید . شکل کلی فراخوانی تابع tmpfile بدین صورت می باشد :
{{چپچین}}
FILE * tmpfile(void);
{{پایان چپچین}}
سند ، توسط یک ماکروی اشارهگر نوع فایل آماده می شود و سپس با نوشتن ;()tmpfile ایجاد می گردد ( دقت کنید که این تابع ، آرگومانی نمی پذیرد و باید آن را خالی بگذارید و حتی اجازه نوشتن void را داخل آن ندارید ) . این تابع در صورت موفقیتآمیز بودن عمل خود ، اشارهگری را به فایل ساخته شده باز می گرداند و در صورت هر گونه عدم موفقیت ، یک اشارهگر تهی ( نول NULL ) را باز می گرداند . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
FILE *fp, *tmpf;
fp = fopen("copy.txt", "w+");
tmpf = tmpfile();
if (tmpf == NULL)
{
perror("System failed to make temporary file");
return 1;
}
char tmpstr[100];
fgets(tmpstr, 100, stdin);
fputs(tmpstr, tmpf);
char str[100];
for(int i = 0; i <= 100; i++)
{
str[i] = tmpstr[i];
}
fputs(str, fp);
fclose(fp);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
'''توضیح :''' دو اشارهگر فایل را به نامهای fp و tmpf ساختهایم و آمادهایم تا فایلهای آنها را بسازیم . اولی به صورت متنی در فایلی با نام copy.txt ساخته می شود . دومی فایل موقت است که اگر موفق به ساخت آن نشویم پیام خطا را چاپ می کند که سامانه ، موفق به ایجاد فایل موقت ، نشد . سپس یک رشته را از ورودی استاندارد ( صفحهکلید Keyboard ) به طول نهایتاً ۱۰۰ کاراکتر دریافت می کند و داخل خود می نویسد ( آنچه را که کاربر بنویسد و در نهایت دکمه ورود Enter را بزند ) سپس رشته دیگری به همان اندازه ساخته می شود و متن فایل موقت را در خود کپی ( کاپی Copy ) می کند و آن را در copy.txt می نویسد و فایل copy.txt بسته می شود و با پایان برنامه فایل موقت نیز پاک می شود . دقت کنید این ، سادهترین شکل گرفتن فایل پشتیبانی Backup از فایل اصلیِ کاربر است . برنامه gEdit به همین شکل ، کاراکتر به کاراکتر ، متن را داخل سند ، ذخیره می کند و بسیار کند است اما روش مطمئنی است که دادهای از دست نرود ( به همین شکل نیز پشتیبانی آن ، کند است ) . در صورتی که بخواهید با سرعت بالایی سند خود را ذخیره کنید باید از روشها و ترفندهای دیگری استفاده کنید که در مباحث بعدی به آنها می رسیم . اما فعلاً برای کپی کردن یک رشته در رشته دیگر چارهای جز این نداشتیم
== تابع freopen ==
تابع کتابخانهای freopen سرنام file re-open به معنی دوباره فایل را باز کن ؛ در صورتی که فایلی باز شده باشد ( توسط fopen ) و اشارهگر فایل باز شده را به آن بفرستیم ، جریان فایل قبلی را می بندد ( دیگر نیازی به fclose نخواهد داشت ) و دوباره آن را باز می کند و در صورتی که فایلی باز نشده باشد و یا اشارهگر فایلِ آن را به freopen نفرستیم باید از جریان ورودی/خروجی استاندارد stdin و stdout و stderr استفاده کنیم تا از فایلی متنی ، بخوانیم یا داخل آن ، متنی را بنویسیم . طبق استاندارد ، استفاده از حالت دودویی ، تعریف نشده است و پیادهسازها در شبهیونیکسها آن را نادیده گرفته و ویندوز نیز تنها به نادیده گرفتن شکسته شدن خط در پایان هر خط متن ، بسنده می کند ( البته برخی سیستم عاملها از آن پشتیبانی می نمایند )
شکل کلی استفاده از تابع freopen بدین صورت می باشد :
{{چپچین}}
freopen(const char * filename, const char * mode, FILE * stream);
{{پایان چپچین}}
می شود گفت همانند fopen است و mode های آن ( یعنی حالتهای باز کردن فایل آن ) همانند fopen در همین مبحث فایل سرآیند stdio می باشد ( با این تفاوت که همان طور که گفته شد حالت دودویی و خام باز نمیکند و البته می تواند از ورودی خروجی استاندارد جهت نوشتن و یا خواندن استفاده کند )
مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
FILE *fp, *fp2;
fp = fopen("example.txt", "r");
if (fp == NULL)
{
perror("File couldn't be opened");
return 1;
}
fp2 = freopen("example.txt", "a", fp);
fputs("4th sentence", fp2);
fclose(fp2);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
'''توضیح :''' در مثال بالا ۲ اشارهگر فایل را آماده ایجاد نموده و اولی را با باز کردن فایل متنی example.txt که کمی پیشتر آن را ایجاد نمودیم با حالت خواندن متنی به پایان رساندهایم . اشارهگر فایل دوم با freopen با حالت اضافه کردن باز شده است و سپس توسط تابع fputs جمله 4th sentence در خط چهارم اضافه شده است و سپس fp2 را بستهایم و نیازی به بستن fp نیست چون freopen آن را بسته است . تابع اصلی برنامه با موفقیت به پایان رسیده است . اگر فایل متنی example.txt را باز کنید حالا به جای ۳ خط ، ۴ خط دارد
مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main()
{
FILE * fp = freopen("copy.txt", "w", stdout);
if (fp == NULL)
{
perror("File couldn't be open");
return 1;
}
printf("This text will replace content of copy.txt");
fclose(fp);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
'''توضیح :''' فایل copy.txt را که در قسمت قبل ، ایجاد کردیم را جهت نوشته شدن مجدد با حالت نوشتن و جریان خروجی استاندارد جهت خارج کردن - نوشتن - متن به فایل باز کردهایم . از اینجا به بعد هر آنچه که در خروجیخط دستوری ، دستور بدهیم تا نمایش داده شود در فایل copy.txt نوشته خواهد شد تا زمانی که اشارهگر فایل خود را ببندیم که ما نیز همین کار را کردهایم . حال اگر فایل متنی copy.txt را باز کنید در آن نوشته شده است : This text will replace content of copy.txt یعنی « این متن ، جایگزین محتوای فایل copy.txt خواهد شد » و اگر فایل را باز کنید همین متن را خواهید دید . تابع اصلی برنامه را با موفقیت به پایان رساندهایم
مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include<stdio.h>
int main()
{
FILE * fp = freopen("example.txt", "r", stdin);
if (fp == NULL)
{
perror("File couldn't be found");
return 1;
}
char text[150];
while(fgets(text, sizeof(text), stdin) != NULL)
{
printf("%s", text);
}
fclose(fp);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
'''توضیح :''' فایل example.txt را جهت خوانده شدن و با جریان ورودی - خواندن - استاندارد stdin باز نمودهایم تا از فایل وارد کنیم . رشته text را با ۱۵۰ عنصر ، اعلان نمودهایم . با حلقه while تابع fgets را اجرا نمودهایم تا متن بخواند و تا زمانی که مقدار دریافتی آن تهی ( نول NULL ) نباشد در خروجی خطدستوری ، متن را نمایش دهد که همان ۴ خطی است که در مثال پیشتر از پیش آن را بازنویسی کردیم و خط چهارم را نیز به آن اضافه نمودیم . سپس فایل fp را بسته و تابع را با موفقیت به پایان رساندهایم
== تابع snprintf ==
تابع کتابخانهای snprintf سرنام string number of arguments print formatted به معنی چاپ قالببندی شده ( فرمتشده ) رشته به اندازه تعداد آرگومانها ؛ همانند تابع printf است جز اینکه متن چاپ شده ، داخل یک میانگیر ( بافر Buffer ) ذخیره می گردد تا یک تابع که عمل خروجیِ چاپ را در خروجی خطدستوری ، انجام می دهد چاپ کند
شکل کلی استفاده از تابع snprintf بدین صورت می باشد :
{{چپچین}}
snprintf(char * buffer, size_t number of characters, const char * formatted-string, arguments-list);
{{پایان چپچین}}
ابتدا باید یک رشته میانگیر ( بافر ) اعلان کنیم تا بتوانیم آن را در تابع snprintf به کار ببریم که کاراکترها در آن ذخیره شوند ؛ سپس تعداد کاراکترهایی که قرار است ذخیره شوند را می نویسیم که اگر کوچکتر از تعداد کاراکترهای نوشته شده باشد ، مابقی ، نادیده گرفته خواهند شد ؛ سپس رشته خود را به همراه قالببندیکنندهها و ... می نویسیم و در پایان اگر تعیینکننده آرگومانی را در رشته قالببندیشده نوشته باشیم ، شناسه ( نام ) دادههای متناظر آن را می نویسیم تا ذخیره شوند
تابع snprintf هر مقدار و موجودیای را که دریافت کند یک ماکروی مقدار NULL در پایان آن قرار می دهد که یعنی رشته ، به پایان رسید . این تابع در صورت موفقیتآمیز بودن عملکرد خود تعداد کاراکترهایی که در میانگیر ذخیره کرده است را باز می گرداند و در صورت هر گونه اختلال و خطا یک مقدار منفی را باز می گرداند . ضمناً در بازگرداندن تعداد کاراکترها NULL را در نظر نگرفته و آن را نمی شمارد
مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
char buff[150];
long long int lightyear = 9460730000000;
long double planck = 6.62607015;
snprintf(buff, sizeof(buff), "The passed distance by light in a year is about %lld kilometer and Planck constant is : %Lf * 10^-34\n", lightyear, planck);
printf("%s", buff);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
'''توضیح :''' یک رشته با نام buff اعلان نمودهایم که میانگیر ( بافر ) ما می باشد . سپس یک داده صحیح خیلی بلند ایجاد نمودهایم که به صورت تقریبی میزان طول سال نوری ( مقدار مسافتی که نور در عرض یک سال می پیماید ) را به کیلومتر در آن ذخیره کردهایم و متغیر ، تعریف شده است . سپس عدد ثابت پلانک ( که بر حسب ژول در ثانیه می باشد و در محاسبه میزان انرژی نور که توسط ماکس پلانک کشف شد مورد استفاده قرار می گیرد ) را در یک داده اعشاری با دقت خیلی زیاد نوشتهایم و متغیر را تعریف نمودهایم . سپس تابع snprintf متن و آرگومانهای فرستاده شده به خود را در buff ذخیره می کند و تعداد نوشته شده برای آن هم تعداد عنصرهای آرایه buff می باشد و نوشتهایم میزان مسافتی که نور ، در یک سال می پیماید lld% است که به آن lightyear را فرستادهایم و عدد ثابت پلانک برابر با Lf% می باشد که به آن planck را فرستادهایم که البته عدد بسیار کوچکی است و مقدار تقریبی نوشته شده در ده به توان منفی ۳۴ نوشته می شود . سپس با تابع printf موجودیِ ذخیره شده در buff را که نوشتیم ، در خروجی خطدستوری ، چاپ نموده و تابع را با موفقیت به پایان می رسانیم
== تابعهای وابسته و اختصاصی ==
در این فصل ، تمام ماکروها و تابعهای استاندارد زبان سی نوشته شدند جز اینکه برخی از تابعها وابسته هستند و باید از فایلهای سرآیند دیگر نیز استفاده کرد تا بتوان در کنار stdio تابعهای مورد نظر را به کار بست که در فصلهای مرتبط نوشته خواهند گردید . همچنین بسیاری از سیستمعاملها علاوه بر رابط برنامهنویسی پازیکس POSIX ( برای برنامهنویسی در سیستمهای شبهیونیکسی ) از تابعها و ماکروهای اختصاصی برخورداند ( همچون Windows یا Linux ) که ما آنها را نمینویسیم و فقط سی استاندارد را مینویسیم . اگر بخواهید از تابعهای اختصاصی سیستمعاملها استفاده کنید کار شما راحتتر میشود و کمتر نیاز پیدا خواهید کرد تا کد بزنید ولی در هر صورت آنها استاندارد نیستند و ما در اینجا تنها سی استاندارد را مینویسیم اما اگر راهنمای کامپایلر خود را در سیستم عامل مد نظر خود ، بخوانید مابقی تابعها و ماکروها نیز نوشته شدهاند
[[رده:زبان برنامه نویسی سی]]
43b8fchoo8eqvj94gz21gj0exjoen3p
135068
135067
2026-09-20T02:20:34Z
HadiLovelorn
23337
135068
wikitext
text/x-wiki
{{سرص|زبان برنامه نویسی سی/مقدمهای بر فایلهای سرآیند|زبان برنامه نویسی سی/stdlib}}
با این فایل سرآیند تا حدودی آشنایی دارید و در طول کتاب بارها به آن اشاره شده است . stdio.h یک فایل سرآیند ( Header ) استاندارد زبان سی می باشد که مخفف Standard Input/Output یا Standard Input & Output است به معنی ورودیها و خروجیهای استاندارد . ما از تابع printf و scanf به وفور در کتاب استفاده نمودهایم که در فایل سرآیند stdio تعریف شدهاند اما پیش از نوشتن توابع بهتر است با تعیینکنندههای فرمت در این توابع استاندارد آشنا شوید.
حتماً به یاد دارید که در کتاب وقتی می نوشتیم ;printf("This is a %s", str) و اگر str یک رشته می بود که داخل آن وارد می کردیم string در خروجی خطدستوری با جمله This is a string مواجه می شدیم. تعیین کنندههای فرمت ، متغیرهایی هستند که داخل دو دابل کوت نوشته می شوند تا بعداً توسط آرگومانهای فرستاده شده ( پاس داده شده ) جایگزین گردند.
{{چپچین}}
%[parameter][flags][width][.precision][length]type
{{پایان چپچین}}
<br><br>
ابتدا پارامتر تعیین کننده نوشته می شود ، سپس پرچمها و سپس عرض و پهنا و سپس میزان دقت و بعد طول و در نهایت نوع داده آرگومان
==انواع داده آرگومان==
انواع داده آرگومان عبارتند از :
{{چپچین}}
d, i
{{پایان چپچین}}
که اعداد دهدهی هستند با این تفاوت که در تابع scanf تعیین کننده نوع i اگر در ابتدای آرگومان نوشته شود 0x آن را هگزادسیمال ( شانزدهشانزدهی ) دریافت می کند و اگر در ابتدای آرگومان نوشته شود 0 آن را اوکتال ( هشتهشتی ) دریافت خواهد نمود
{{چپچین}}
u
{{پایان چپچین}}
که اعداد دهدهی بدون علامت را تعیین می کند unsigned decimal که همان unsigned int می باشد
{{چپچین}}
ld , li
{{پایان چپچین}}
که اعداد صحیح بلند را تعیین می کند long int
{{چپچین}}
lld , lli
{{پایان چپچین}}
که اعداد صحیح خیلی بلند را تعیین می کند long long int
{{چپچین}}
lu
{{پایان چپچین}}
که اعداد صحیح بلند بدون علامت را تعیین می کند unsigned long
{{چپچین}}
llu
{{پایان چپچین}}
که اعداد صحیح خیلی بلند بدون علامت را تعیین می کند unsigned long long int
{{چپچین}}
f, F
{{پایان چپچین}}
برای اعداد اعشاری با این تفاوت که f برای بینهایت inf یا infininty و برای تعریفنشدهها nan را باز می گرداند و F برای بینهایت INF یا INFINITY و برای تعریفنشدهها NAN را باز می گرداند
{{چپچین}}
lf
{{پایان چپچین}}
که اعداد اعشاری با دقت دو برابر را تعیین می کند double
{{چپچین}}
Lf
{{پایان چپچین}}
برای تعیین اعداد اعشاری با دقت بسیار زیاد به کار می رود long double
{{چپچین}}
e, E
{{پایان چپچین}}
برای اعداد اعشاری به صورت توان برای ۱۰ که به صورت d.ddde±dd مقدار را می فرستد یا دریافت می کند که شامل مقدار صحیح است و یک نقطه و مقادیر اعشاری و علامت E برای E و e برای e و سپس نما و توان که دست کم دو رقم هستند . دقت کنید که در ویندوز ارقام توان به صورت پیش فرض سه تا هستند . مثال : 1.5e03 یعنی ۱٫۵ ضربدر ۱۰ به توان ۳
{{چپچین}}
g, G
{{پایان چپچین}}
برای اعداد که اگر کامل ( صحیح ) باشند شامل نقطه و ممیز نخواهد شد و اگر اعشاری باشند ممکن است آن را به صورت معمولی بنویسد یا به صورت توان ۱۰ که همان e و E می باشند که البته می تواند دریافت نیز بکند ( مثلاً در تابع scanf ) و خود کامپایلر تشخیص می دهد که کدام بهتر است و با این تفاوت که پشت سر نما 0 نمی گذارد . مثال : 21.965 یا 2.5e4
{{چپچین}}
x, X
{{پایان چپچین}}
برای اعداد هگزادسیمال که صحیح بدون علامت هستند که x برای حروف کوچک است مثل x5f و X برای حروف بزرگ مثل X5F
{{چپچین}}
o
{{پایان چپچین}}
برای اعداد اوکتال که صحیح بدون علامت هستند
{{چپچین}}
s
{{پایان چپچین}}
برای رشتههایی که با NULL پایان می یابند ( اگر به یاد داشته باشید ، رشته ، مجموعهای از کاراکترهاست ) مثل رشتههایی که با آرایه می سازیم و ذخیره می نمائیم یعنی رشتهای مثل : monkeys are cute
{{چپچین}}
c
{{پایان چپچین}}
برای یک کاراکتر که به خروجی فرستاده می شود یا از ورودی دریافت می شود
{{چپچین}}
p
{{پایان چپچین}}
برای اشارهگرها که آدرسشان به رابط خطدستوری فرستاده شود یا از آنجا دریافت شود . طبق استاندارد می تواند و باید از نوع پوچ باشد void ولی این مورد یعنی برای p وابسته به نویسنده پیادهساز می باشد و هر کامپایلر به دلخواه خود عمل می کند ( مراجعه کنید به راهنمای کامپایلر خود )
{{چپچین}}
a, A
{{پایان چپچین}}
برای اعداد اعشاری با دقت دو برابر ( double ) که در مبنای شانزده ( هگزادسیمال ) نوشته می شود و 0x و بقیه ارقام و حروف ( کوچک ) برای a و 0X و بقیه ارقام و حروف ( بزرگ ) برای A ( دقت کنید که این استاندارد است ولی هر کامپایلر به دلخواه خود قابلیتهای آن را ممکن است افزایش داده باشد )
{{چپچین}}
n
{{پایان چپچین}}
مقداری را در خروجی خطدستوری چاپ نمی کند اما به آرگومان اشارهگر متناظر خود ، تعداد کاراکترهای داخل تابع خود را باز می گرداند
<br><br>
همچنین با استفاده از ماکروی wchar_t که در فایل سرآیند wchar.h تعریف شده است ما می توانیم کاراکترهای اضافهتر از ازکی را که در UTF-8 و UTF-16 و UTF-32 تعریف شدهاند در تابع printf یا scanf و بقیه توابع این فایل سرآیند به عنوان تعیین کننده نوع آرگومان تعیین کنیم تا کاراکترهای مذکور را در رابط خطدستوری چاپ نمائیم یا دریافت کنیم که این تعیین کنندهها شامل :
{{چپچین}}
lc or C
{{پایان چپچین}}
lc و یا C ( بزرگ ) برای یک کاراکتر UTF و
{{چپچین}}
ls or S
{{پایان چپچین}}
ls یا S ( بزرگ ) برای یک رشته انکدینگ UTF
می شود . اما کاراکترهای UTF-8 را می توان در سیستم عاملهای روز ( مادرن Modern ) که چند زبانه هستند در متن منبع نیز نوشت و آن را در خروجی خطدستوری چاپ نمود . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
printf("ญ");
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
که پس از کامپایل و اجرا ، در خروجی کاراکتر ญ از حروف زبان تایلندی را مشاهده خواهید نمود . اما برای کار با حروف یونیکد Unicode مثل UTF-8 باید از توابع و ماکروهای فایل سرآیند wchar.h استفاده نمائید که در مبحث مربوطه نوشته خواهد شد
{{چپچین}}
zu
{{پایان چپچین}}
برای تعیین نوع فرمت داده از نوع size_t که هنوز به آن نرسیدهایم و در ادامه خواهم نوشت اما فقط برای استانداردهای جدید تعریف شده است و در استانداردهای قدیمی مثل C89 همان ul% را می نویسیم
'''پارامترِ تعیین کننده شماره آرگومان''' : جزء استاندارد سی نیست و فقط در پازیکس ( POSIX رابط کاربری قابل حمل برای سیستم عاملهای محیطهای پنجرهای ایکس ) تعریف شده است که یک عدد را می نویسیم و در مقابل آن یک علامت دلار یا همان پسو $ را می گذاریم . با این کار ، تعیین میکنیم که ابتدا چندمین آرگومان دریافت و یا فرستاده شود و سپس چندمین و الی آخر . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main()
{
int a = 15, b = 17;
printf("%2$d %1$d", a, b);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
با اینکه ابتدا آرگومان a و سپس b فرستاده شدهاند ، اما چون شماره تعیین کننده اول ، 2 و شماره تعیین کننده دوم ، 1 می باشد ابتدا b و سپس a چاپ می شود
'''نکته :''' در صورتی که بخواهید علامت درصد % را در خروجی خط دستوری چاپ کنید باید دو بار آن را بنویسید یعنی بدین شکل %%
'''و پرچمها عبارتند از :'''
{{چپچین}}
-
{{پایان چپچین}}
این پرچم متن خروجی خطدستوری را در تعیینکننده فرمت خود چپچین می کند . به صورت پیشفرض تمام متون چپچین هستند اما اگر پیش از تعیین کننده نوع آرگومان عددی را بنویسید ( که کمی جلوتر آن را خواهیم نوشت ) به همان اندازه خروجی دارای فضای سفید ( space ) خواهد بود که آرگومان را جلو می برد اما اگر در تعیینکننده فرمت یک علامت منفی ( مایناس - ) بگذارید آن را به سمت چپ انتقال خواهد داد
{{چپچین}}
+
{{پایان چپچین}}
این پرچم ، تضمین می کند که علامت عدد در خروجی خطدستوری نوشته خواهد شد یعنی - برای اعداد منفی ( negative ) و + برای اعداد مثبت ( positive ) که به صورت پیشفرض فقط برای اعداد منفی نوشته می شود و برای اعداد مثبت علامتی گذاشته نمی شود
{{چپچین}}
فضای سپید یا همان اسپیس
{{پایان چپچین}}
این پرچم یعنی space که بازگردان آن می شود فضای سپید یا فضای خالی برای اعداد مثبت جای خالی می گذارد و برای اعداد منفی علامت منفی ( مایناس - ) که اگر همراه با علامت مثبت ( + ) نوشته شود فضای سپید نادیده گرفته می شود
{{چپچین}}
0
{{پایان چپچین}}
عدد صفر به انگلیسی 0 ( زیرو ) هنگامی که برای آرگومان پهنا و عرضی در نظر گرفته شود ( که در ادامه می نویسیم ) که یک عدد است به جای فضای خالی پشت عدد ، صفر می گذارد که البته بستگی به تعداد ارقام عدد نیز دارد ؛ یعنی اگر عدد 352 باشد و ما پهنای آن را ۸ تا تعیین کرده باشیم ۵ تا فضای خالی قرار می گیرد ؛ اگر از این پرچم استفاده کنیم در خروجی خطدستوری چاپ می شود : 00000352
{{چپچین}}
#
{{پایان چپچین}}
پرچم هاش یا شارپ چندین کار را می تواند انجام بدهد :
۱ − برای تعیینکنندههای فرمت g و G در صورتی که قسمت اعشار نداشته باشند 0 های مقابل آن را ( در قسمت اعشاری ) حذف نمی کند
۲ − برای فرمتکنندههای a و A و e و E و f و F و g و G یک علامت اعشار ( ممیز که در انگلیسی نقطه است ) را حتماً اضافه می کند تا مشخص شود عدد اعشاری است حتی در صورتی که قسمت اعشار 0 باشد
۳ − برای تعیینکنندههای فرمت اوکتال o و هگزادسیمال کوچک x و هگزادسیمال بزرگ X برای هر عددی جز 0 قبل از آن علائم 0 و 0x و 0X را به ترتیب می نویسد و پیش از مقدار چاپ شده در خروجی خطدستوری قرار می دهد
۴ − برای تعیینکنندههای فرمت ls یا S باعث می شود تا سایز متن به تعداد کاراکترهای خروجی باشد و نه به اندازه ( size ) کاراکترهای موجود که ممکن است چند بایتی و عریض باشند که در UFT-8 یا uTF-16 یا UTF-32 تعریف شدهاند
۵ − برای تعیینکنندههای فرمت p که برای چاپ آدرس اشارهگر است آن را به مقدار هگزادسیمال تبدیل می کند که قابل برگشت نیست ( یعنی عکس همین عمل ) مگر اینکه در محیطهای ترا اسپیس ( teraspace ) که شامل برخی سیستم عاملها نظیر لینوکس می شود با دستور مستقیم به کامپایلر آن را مهیا نمائیم
{{چپچین}}
'
{{پایان چپچین}}
آپوستروف با علامت ' ( که همان سینگل کوت می باشد ) باعث می شود تا هر سه رفم با یک ممیز ( علامت نقطه در انگلیسی . ) از یکدیگر جدا شوند که البته برای این کار باید فایل سرآیند locale.h را به برنامه خود ضمیمه نمائید مثل :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
#include <locale.h>
int main()
{
setlocale(LC_NUMERIC, "");
int a = 1564952413;
printf("%'d", a);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
که در اینجا برنامه چاپ می کند : 1.564.952.413
مطالب پرچمها کاملاً روشن هستند و نیازی به مثال ندارد اما به عنوان نمونه یک مثال برای پرچم مایناس ( علامت منفی ) می نویسیم :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main()
{
int a = 47;
printf("%-6d", a);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در این مثال اگر علامت منفی را بر داریم عدد 47 با ۶ فاصله که نوشتهایم 6 چاپ می شود اما چون علامت منفی گذاشتهایم چپچین شده و در ابتدای رابط خطدستوری قرار می گیرد
<br><br>
'''عرض و پهنا'''
در عرض و پهنا ، پس از علامت درصد یک شماره می نویسیم که ورودی یا خروجی را به جلو می راند و به هیچ وجه باعث از بین رفتن مقدار نمی شود . این کار باعث می شود تا بتوانیم در رابط خطدستوری شکل و جدول خاصی را ایجاد کنیم . به علاوه اگر پس از علامت درصد علامت استریسک ( ستاره ) را بنویسیم بتوانیم به صورت پویا ، مقداری را به عنوان آرگومان بنویسیم تا به همان اندازه کاراکترهای ما به جلو رانده شوند . مثال عدد را در مثال پیشین نوشتیم ، اما برای مثال استریسک :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main()
{
int a = 8, b = 94;
printf("%*d", a, b);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال بالا مقدار a مقدار ۸ می باشد و b مقدار ۹۴ که مقدار 94 را در خروجی خطدستوری چاپ نمودهایم اما به مقدار a یعنی ۸ تا فاصله و فضای سپید و خالی پیش از آن قرار دادهایم که عدد به جلو رانده می شود
'''دقت کنید :'''
اگر در قسمت تعیینکننده فرمت یک نقطه بگذارید و پس از آن یک عدد بنویسید ، برای اعداد اعشاری دقت اعشار همان عدد است و مابقی گرد شده و نادیده گرفته می شوند . برای رشتهها نیز تعداد کاراکترها را معین می کند که اگر از عدد نوشته شده بیشتر باشد ، کاراکترهای بعدی نادیده گرفته می شوند . همچنین می توانید بعد از علامت نقطه ، یک استریسک بگذارید و در قسمت آرگومانها مقدار مورد نظر را به تابع بفرستید تا دقت را معین کنید . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main()
{
char ch[] = "whatthehell";
printf("%.3s", ch);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main()
{
printf("%.*s", 3, "abcdef");
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال اول رشته whatthehell فقط سه کاراکتر اولش چاپ می شود و در مثال دوم فقط abc . برای اعداد اعشاری نیز یک مثال می نویسیم :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main()
{
float f = 2.564;
printf("%.2f", f);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال بالا مقدار ۲٫۵۶۴ عدد ۴ ـش نادیده گرفته می شود ( چون کوچکتر از ۵ است اگر گرد شود می شود 0 که فاقد مقداری در ارزش مکانی است و نادیده گرفته می شود )
مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main()
{
long double pi = 3.14159265358979;
printf("%.14Lf", pi);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
'''دقت کنید :''' در زبان سی و سیستم عاملهای متداول به صورت پیشفرض ، دقت اعشار نمایشی فقط ۶ رقم است ؛ اما اگر از double استفاده کنید دقت بالاتر می رود و می توانید عددی بزرگتر از ۶ بنویسید و در سیستم عامل قدرتمندی مثل گنو/لینوکس و کامپایلر قدرتمندی مثل GCC می توانید از long double استفاده نموده و بازهم دقت را بالاتر ببرید ( ولی در ویندوز long double به اندازه همان double دقت دارد )
در مثال بالا عدد پای ( یا همان پی Pi ) تا ۱۴ رقم اعشار نوشته شده و در خروجی خط دستوری ، چاپ شده است
'''تعیین کنندههای طول :'''
{{چپچین}}
hh
{{پایان چپچین}}
برای اعداد صحیح که به صورت کاراکتر تعریف شدهاند و دیگر نیازی به نقش ایفا کردن و کستکردن ندارد . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main()
{
char a = 12;
printf("%hhd", a);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال بالا a یک کاراکتر است ، اما ما تعیین کننده نوع آرگومان را d و decimal تعریف کردهایم . اما با این حال ( به خاطر استفاده از hh ) برنامه بدون هیچ اشکالی مقدار 12 را در خروجی خطدستوری نمایش می دهد ( دقت کنید که حجم یک کاراکتر ۱ بایت است و تنها می تواند تا مقدار ۱۲۷ و یا بدون علامت تا ۲۵۵ را در خود ذخیره کند )
{{چپچین}}
h
{{پایان چپچین}}
برای اعداد صحیح نوع کوتاه در مبنای ۱۰ و یا اوکتال و یا هگزادسیمال که به صورت short ( کوتاه ) تعریف شدهاند ( دقت کنید که نوع داده کوتاه یک یا نهایتاً دو بایت است و مقادیر بزرگتر از ظیف خود باعث ایجاد خطا می شود ) تا به صورت decimal ( دهدهی متداول ) چاپ شوند
مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main()
{
unsigned short a = 300;
printf("%hd", a);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال بالا a یک کوتاه بدون علامت است که با تعیین کننده نوع صحیح و پیشوند h به خروجی خطدستوری فرستاده می شود
{{چپچین}}
l
{{پایان چپچین}}
برای نوع اعداد صحیح بلند ؛ البته شما می توانید اعداد اوکتال یا هگزادسیمال را نیز با طول بلند و تعیینکننده فرمت صحیح به مبنای ده برگردانده و در رابط خطدستوری از آن استفاده کنید . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main()
{
long a = 0xff;
printf("%ld", a);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال بالا نوع داده a بلند است و در آن ff را به شکلی که نوشته شده ( و باید بشود ) ذخیره نمودهایم . در هنگام چاپ با مقدار ۲۵۵ رو به رو خواهیم شد ( دقت کنید که ff در مبنای ۱۰ می شود ۲۵۶ ولی چون ۰ نیز یک مقدار است می شود ۲۵۵ )
{{چپچین}}
ll
{{پایان چپچین}}
برای تعیین طول داده صحیح خیلی بلند
{{چپچین}}
L
{{پایان چپچین}}
برای تعیین طول داده اعشاری خیلی بلند که می شود Lf یا LF یا Lg یا LG
{{چپچین}}
z
{{پایان چپچین}}
برای تعیین طول داده از نوع size_t که در فایل سرآیند stddef تعریف شده است
{{چپچین}}
j
{{پایان چپچین}}
برای تعیین طول داده از نوع intmax_t که در فایل سرآیند inttypes تعریف شده است
{{چپچین}}
t
{{پایان چپچین}}
برای تعیین طول داده از نوع ptrdiff_t که در قایل سرآیند stddef تعریف شده است
{{چپچین}}
H
{{پایان چپچین}}
به عنوان پیشوند برای A و a و E و e و f و F و G و g که قسمت اعشاری را ۳۲ بیت در نظر می گیرد Decimal32_
{{چپچین}}
D
{{پایان چپچین}}
به عنوان پیشوند برای A و a و E و e و f و F و G و g که قسمت اعشاری را ۶۴ بیت در نظر می گیرد Decimal64_
{{چپچین}}
DD
{{پایان چپچین}}
به عنوان پیشوند برای A و a و E و e و f و F و G و g که قسمت اعشاری را ۱۲۸ بیت در نظر می گیرد Decimal128_
برخی از تعیین کنندههای طول آرگومان در استاندراد باید خارج از دو دابل کوت نوشته شوند و البته باید فایل سرآیند inttypes.h را ضمیمه برنامه خود نمائید
{{چپچین}}
PRId32
PRId64
PRIi32
PRIi64
PRIu32
PRIu64
PRIx32
PRIx64
{{پایان چپچین}}
اولی برای اعداد صحیح ۳۲ بیت و دومی برای صحیح ۶۴ بیت و بعدی برای اعداد صحیح ( منفی و مثبت ) ۳۲ بیت و بعدی مانند قبلی ولی ۶۴ بیت ، بعدی برای اعداد صحیح بدون علامت ۳۲ بیتی و بعدی همان برای ۶۴ بیتی و بعدی برای اعداد هگزادسیمال ۳۲ بیت و بعدی همان برای ۶۴ بیتی . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
#include <inttypes.h>
int main()
{
int a = 45;
printf("%" PRId64 "\n", a);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال بالا متغیر از نوع صحیح a با مقدار ۴۵ تعریف شده است و تابع کتاخانهای printf از PRId64 برای تعیینکننده فرمت و تعیین کننده نوع آرگومان استفاده شده و آرگومان a به آن فرستاده شده است که پس از کامپایل و اجرا در خروجی عدد 45 را نمایش می دهد
== امنیت زنجیرهای ==
پیش از آغاز نوشتن تابعها و ماکروها لازم است مطلبی کلی را بدانید که در دانش رایانه و برنامهنویسی ( و حتی الکترونیک که اینجا به آن نمی پردازیم ) دانستن آن ضروری است . در دانش رایانه ، زنجیره یا ریسمان به کوچکترین مجموعه دستور العملهای یک برنامه می گویند که توسط پردازنده مرکزی ( واحد پردازشگر مرکزی / سیپییو CPU ) قابل اجرا است . اما در دانش برنامهنویسی در زبانهایی که تابعگرا هستند ،امنیتِ زنجیرهپردازه یا امنیت زنجیرهای بدین مفهوم است که تابع اگر در هنگام فراخوانی ، توسط چند سند برنامه ( متن برنامه Source Code File ) باعث رفتار تعریفنشده ، ویرانی دادهها یا شرایط رقابتی نشود از نظر زنجیرهای یا ریسمانی ، امن است و در غیر این صورت ، ناامن . بدین مفهوم که اگر تابع در چند زنجیره سند منبع ( سند برنامه ) فراخوانده شود باعث تداخل آنها با هم نمی شود تا : ۱ - رفتار تعریفنشدهای رخ ندهد ۲ - مقادیر و موجودی متغیرها ( که میتوانند ماکرو یا تابع باشند ) دستخوش تغییر یا نابودی نشود ۳ - طبق استاندارد و زبان ، در سندها و فایلهایی که مجاز به اشتراک و استفاده چندباره آن در سندها نیستیم از آنها استفاده نکنیم و یا آنها را مستقل تعریف کنیم ( نظیر استفاده از کلیدواژه static برای تابعها که پیشتر در مبحث کلاسهای ذخیره مطرح کردیم ) دقت کنید که اگر شرایط رقابتی ، پیش بیاید رفتارهای پیشبینی نشده و ناخوشایند برای برنامهنویس پیش می آیند که برنامه نوشته شده را دچار خطا و باگ Bug می کند
در این کتاب ، فقط توابع و ماکروهایی که از نظر امنیت زنجیرهای ، امن نیستند می نویسیم امن نیست ( از نظر امنیت زنجیرهای ) و در مورد مابقی ، آن را نمی نویسیم ( معلوم است که امن است )
== تابع printf ==
نمای کلی تابع کتابخانهای printf و تابعهای مشابه آن بدین شکل است :
{{چپچین}}
printf(const char * format-string, argument-list);
{{پایان چپچین}}
تابع printf سرنام print formatted و به معنی چاپ فرمت شده ( قالببندی شده ) می باشد که یک یا چند رشته را دریافت می نماید که داخل آنها تعیینکنندههای فرمت و تعیین کنندههای مختلف می توانند همان طور که تا بدینجا نوشته شد آن را آماده پذیرش آرگومان یا آرگومانها نموده که آرگومان(ها) را به آن می فرستیم ( که حتی می توانند مقدار باشند ) تا جایگزین تعیینکنندههای فرمت شود( شوند )
اگر تعداد آرگومانهای فرستاده شده از تعیینکنندههای فرمت بیشتر باشند ، آنهایی که اضافه هستند نادیده گرفته می شوند اما اگر تعیینکنندههای فرمت بیشتر از آرگومانهای فرستاده شده باشند ، نتیجه تعریف نشده است ( مطابق با استاندارد سی ) . تابع printf از نوع داده صحیح int تعریف شده است و اگر با موفقیت بتواند به اتمام برسد یک مقدار مثبت را که تعداد کاراکترهای دریافت شده می باشد را باز می گرداند ( دقت کنید که حتی اعداد و دنبالههای فرار نیز کاراکتر حساب می شوند ) ولی اگر ناموفق باشد یک مقدار منفی را باز می گرداند . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main()
{
printf("%d", printf("This is a string\n"));
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
مثال بالا ابتدا printf داخلی را ارزیابی کرده که یک رشته است و آن را چاپ می کند و سپس بیرونی و اولی را که ۱۷ کاراکتر در رشته ما ( به همراه دنباله فرار خط شکسته ) وجود دارد و آن را در رابط خطدستوری نمایش می دهد
'''دقت کنید :'''
همان طور که گفته شد اگر تعداد تعیینکنندههای فرمت بیشتر از آرگومانها باشد ، نتیجه تعریفنشده است ( در استاندارد سی ) ولی کامپایلر قدرتمندی همچون GCC به شما هشدار خواهد داد ؛ اما برنامه کامپایل شده و اجرا می شود ولی دارای رخنهپذیری امنیتی خواهد بود که هکرها میتوانند از روش حمله رشته فرمت شده استفاده کرده و به دادههای برنامه شما و سیستم عامل دسترسی پیدا کنند . جهت اطلاعات بیشتر صفحه زیر را مطالعه کنید :
[https://en.wikipedia.org/wiki/Uncontrolled_format_string Format string attack]
همچنین نوشتن تعیینکننده فرمت n به صورت n% که در همین مبحث نوشته شد می تواند باعث حمله رشته فرمت شده بشود . که باید بسیار مراقب استفاده آن به صورت صحیح باشید . از طرفی این تعیینکننده فرمت باعث ایجاد کامل شدن تورینگ می شود . جهت اطلاعات بیشتر به صفحه زیر مراجعه کنید :
[https://en.wikipedia.org/wiki/Turing-complete Turing-complete ]
== تابع scanf ==
نمای کلی تابع کتابخانهای scanf و تابعهای مشابه آن به شکل زیر است :
{{چپچین}}
scanf(const char *format-string, argument-list);
{{پایان چپچین}}
تابع scanf سرنام scan formatted به معنی اسکن فرمت شده ( قالببندی شده ) قادر است تا از ورودی استاندارد ( معمولاً صفحهکلید Keyboard ) مقادیری را دریافت نموده و در متغیرها و آرگومانهای خود جای بدهد و آنها را مقداردهی نماید . شکل کلی رشته فرمتشده دریافت کنندههایی مثل scanf و تابعهای مشابه آن به شرح زیر است :
{{چپچین}}
%[parameter]*[width][length]type
{{پایان چپچین}}
پارامتر در scanf همانند printf می باشد . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main()
{
int a, b;
scanf("%2$d%1$d", &a, &b);
printf("%d & %d",a , b);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
همان طور که می بینید با نوشتن شماره و علامت دلار ابتدا b دریافت می شود و سپس a ولی در خروجی ابتدا a چاپ می شود و سپس b . '''دقت کنید''' که تابع scanf برای دریافت و وارد کردن مقدار داخل متغیر از علامت آدرسدهی استفاده می کند و علت آن نحوه تعریف آن در فایل سرآیند stdio می باشد که با اشارهگرها نوشته می شود
برای اینکه پهنا و عرض یک آرگومان را جهت دریافت تعیین کنید باید بعد از علامت درصد ( % percent ) ، یک عدد را بنویسید که به همان تعداد کاراکتر ( چه حرفی و چه عددی ) دریافت خواهد شد و نه بیشتر . '''دقت کنید''' که علامت ستاره ( استریسک * ) در تابع scanf پهنا را تعیین نمی کند بلکه باعث می شود تا تابع scanf یک یا چند کاراکتر را نادیده گرفته و در آرگومانهای فرستاده شده ذخیره نکند
پس با نوشتن مقدار پس از علامت درصد تعیین می کنیم که تابع ، چند کاراکتر ( عددی یا حرفی ) را دریافت کند . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
int i;
printf("Enter a number :\n");
scanf("%2d", &i);
printf("Your number is : %d\n", i);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال بالا شما می توانید به عنوان مثال یک عدد ۵ رقمی را وارد کنید ولی فقط ۲ رقم اول آن دریافت می شود
در تابع scanf و تابعهای مشابه آن می توان از scanset ها استفاده نمود . یک جفت کروشه باز و بسته می توانند تعیین کنند که تابع scanf و تابعهای مشابه آن فقط کاراکترهای خاصی را دریافت نمایند و یا کاراکترهایی را از قلم بیاندازند . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
char str[128];
printf("Enter a string: ");
scanf("%[A-Z]s", str);
printf("You entered: %s\n", str);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال بالا فقط تا زمانی که تابع scanf به کاراکترهای A تا Z برسد آنها را اسکن می کند و در رشته str ذخیره می کند و اگر به کاراکتر دیگری برسد متوقف می شود . '''دقت کنید''' که اگر اولین کاراکتر ورودی شما یک حرف کوچک باشد ( به عنوان مثال ) همان جا عمل اسکن متوقف می شود . دقت کنید که تابع scanf توسط اشارهگرها تعریف شده است و توسط عملگر آدرسدهی مقدار و موجودی را دریافت نموده و در آرگومان متناظر ذخیره می کند بنابراین برای رشته که یک اشارهگر است از عملگر آدرسدهی استفاده نمی کنیم ( حتی اگر از کاراکتر آرایهای استفاده کنیم ؛ چون می دانید که آرایهها توسط اشارهگرها تعریف می شوند )
اگر از نوع دیگری به غیر از کاراکتر ، آرایه بسازید و بخواهید آن را توسط scanf مقداردهی کنید ؛ به صورت متداول که در فصل آرایهها نوشته شد یک به یک ، آرایهها را به عنوان آرگومان یا به صورت کروشهای با اعداد می نویسید یا به صورت غیر مستقیم توسط اشارهگرها به همراه پرانتز معین می کنید که باید تعیین کنندههای نوع آن نیز با نوع نوشته شده به صورت آرایه ، یکسان باشد '''اما نکته مهم''' این است که به غیر از کاراکتر آرایهای که نیازی به علامت و عملگر امپرسند & ندارد ، مابقی انواع داده در صورت نوشته شدن به صورت آرایه نیاز به این عملگر دارند و در صورت نوشته شدن به صورت اشارهگر خیر
همچنین باید بدانید که اگر داخل جفت کروشه باز و بسته ، پیش از کاراکتر یا کاراکترها از علامت کرات ^ استفاده کنید تا زمانی که تابع scanf به آن نرسیده باشد دادهها را دریافت کرده و در آرگومان متناظر خود ذخیره می کند . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
char str[100];
printf("Enter a string: \n");
scanf("%[^p]s", str);
printf("You entered: %s\n", str);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال بالا می توانید متن مقابل را وارد کنید : C is more powerful than python ولی با جمله C is more powerful than مواجه خواهید شد چرا که scanf به کاراکتر p رسیده است
ضمناً '''دقت کنید''' که در اسکن کردن متونی که دارای فضای سپید ( مثل اسپیس Space ) هستند استفاده از scanset ها ضروری است . چرا که تابع scanf و تابعهای مشابه آن فضای سفید را به صورت پیشفرض دریافت نمی کنند . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
char a[100];
scanf("%[^\n]s", a);
printf("Your text is : %s\n", a);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال بالا اگر از scanset ـی که نوشته شده [n\^] استفاده نکنید نمی توانید از اسپیس استفاده کنید و با اولین اسپیس رشته شما شکسته می شود و scanf دیگر اسکن نمی کند
'''نکته :''' علامت هایفن یا همان خط تیره ( که به اشتباه به آن دش dash نیز می گویند ) برای بیان یک طیف است اما اگر بخواهید خود آن را برای اسکن شدن یا نشدن تعیین کنید هر کامپایلر از روش خاص خود استفاده می کند و باید به راهنمای کامپایلر خود مراجعه کنید
'''دقت کنید''' که فضای سپید مثل اسپیس space یا جدول افقی Tab در تابع scanf و تابعهای مشابه آن باعث می شود تا تابع از ورودی بخواند اما آن را در آرگومانی ذخیره نکند . از این تکنیک می توانید در قسمتهایی از کد خود که خط شکسته دارند استفاده کنید ( چون خط شکسته باعث می شود تا scanf و تابعهای مشابه آن ، خط شکسته را به عنوان یک کاراکتر دریافت کرده و دیگر متن شما را دریافت نکنند )
'''یادآوری :''' علامت استریسک باعث می شود تا کاراکتر یا کاراکترهایی نادیده گرفته شوند و در آرگومانها ذخیره نشوند
مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
char a, b;
printf("enter a character\n");
scanf("%c", &a);
printf("enter another character\n");
scanf(" %c%*[^\n]",&b);
printf("Your characters were %c and %c\n", a, b);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال بالا کاراکتر a بدون هیچ مشکلی دریافت می شود اما چون Enter را می زنید و تابع printf نیز خط را می شکند کاراکتر b باید با ترفند دریافت شود که ابتدا یک اسپیس وارد می کنیم و سپس خط شکسته را نادیده گرفته و کاراکتر b را دریافت می نمائیم تا در خروجی خطدستوری نمایش داده شود
مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
char a[100], b[100];
printf("Enter a text :\n");
scanf("%[^\n]s", a);
printf("Your first text is : %s\n", a);
printf("Enter second text :\n");
scanf(" %[^\n]s", b);
printf("Yurt second text is : %s\n", b);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
مثال بالا نیز همانند مثال قبل است با این تفاوت که رشتهها را به جای کاراکترها ذخیره می کنیم . در رشته اول scanf تا زمانی که به خط شکسته نرسیده باشد اسکن می کند و در رشته دوم ابتدا یک اسپیس نوشتهایم تا خط شکسته قبلی ذخیره نگردد و خط شکسته را نادیده گرفتهایم
تابع scanf در صورت موفقیت آمیز بودن کارکرد خود ، یعنی دریافت و مقداردهی آرگومان یا آرگومانها به همان تعداد ، مقداری صحیح و مثبت ، باز می گرداند و در صورتی که مقداری را دریاقت نماید ولی نتواند آن را مقداردهی کند آن را محاسبه نخواهد کرد . ضمناً اگر هیچ کدام از مقادیر ، دریافت و مقداردهی نشوند مقدار 0 را باز میگرداند . و در صورتی که کارکرد آن موفقیتآمیز نباشد یک ماکروی EOF ( سرنام End of File ) که پائینتر یک مبحث برای آن موجود است و بیشتر توضیح دادهایم باز می گرداند
'''دقت کنید :''' که تابع scanf باید به تعداد و اندازه پارامترهای تعیین کننده ، مقدار عددی یا حرفی و رشتهای دریافت کند و در صورتی که آرگومانهای بیشتری بنویسید ، برنامه شما رفتار تعریفنشده بروز خواهد داد و یا احتمالاً برنامه شما دچار شکست و توقف می شود . ضمناً اگر تعیینکننده نوع با نوع دادهای که وارد میشود یکسان نباشد نیز برنامه شما رفتار تعریفنشده بروز خواهد داد . مخصوصاً در مورد رشتهها ؛ اگر تعداد تعیین شده ، کمتر از تعداد کاراکترهای وارد شده باشد بافر سرریز می شود که برای این کار ترفندهای مختلفی وجود دارد که سادهترین آن تعیین پهنا و عرض رشته است که کافی نیست ولی برای تعیین آن باید از تابعهای کتابخانهای دیگری استفاده کرد که در مبحث فعلی موجود نیستند و در فصول فایلهای سرآیند دیگر موجودند که نوشته خواهند شد . ضمن اینکه اگر به درستی از تابع scanf استفاده نکنید امکان حمله رشته فرمت شده وجود دارد ؛ نظیر اینکه تعداد تعیین کنندههای نوع ، بیشتر از تعداد آرگومانها باشند ( همانند printf که در آنجا آدرسش را گذاشتیم ؛ یعنی هکرها با وارد کردن کاراکترهایی خاص به حافظه برنامه یا سیستم عامل و سیستم دسترسی پیدا می کنند )
'''نکته :''' در بسیاری از خطاهای scanf یا تابعها و ماکروهای دیگر ، مقدار ماکروی errno ( سرنام error number به معنی شماره خطا ) مقداردهی می شود که با توجه به سیستم عامل و کامپایلر خود و بررسی شماره خطا می توانید خطا را پیدا نموده و بر طرف نمائید که در فصل فایل سرآیند errno نوشته خواهد شد
== تابع sprintf ==
تابع sprintf سرنام string print formatted به معنی چاپ رشته فرمتشده همانند تابع printf می باشد به غیر از اینکه متنی را در خروجی خطدستوری نمایش نمی دهد بلکه آن را ذخیره می کند که می توان با تابع printf ( به عنوان مثال ) آن را چاپ نمود . نمای کلی تابع sprintf به شکل زیر می باشد :
{{چپچین}}
sprintf(char *buffer, const char *format, arguments)
{{پایان چپچین}}
ابتدا نام رشتهای که قرار است به عنوان بافر ، دادهها را بگیرد می نویسیم ، سپس رشته خودمان را به همراه تعیینکنندههای فرمت ( در صورت لزوم ) می نویسیم و سپس آرگومانها را که خود می توانند حتی مقدار باشند می نویسیم که در نهایت در بافر ذخیره می شود . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main()
{
char buff[50];
char str[] = "string";
sprintf(buff, "This is a %s", str);
printf("%s", buff);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
ابتدا یک رشته به نام buff مخفف buffer اعلان نمودیم . سپس یک رشته به نام str مخفف string و به معنی رشته با مقدار string تعریف نمودیم . سپس توسط تابع کتابخانهای sprintf رشته This is a را به همراه تعیینکننده فرمت رشته که آرگومان آن str است در buff ذخیره کردیم ( که می شود This is a string یعنی این یک رشته است ) و سپس توسط تابع کتابخانهای printf مقدار buff را در خروجی خطدستوری چاپ نمودیم . از تمام تعیینکنندههای فرمت در printf در sprintf نیز می توانید استفاده کنید
== تابع sscanf ==
تابع sscanf سرنام string scan formatted به معنی اسکن رشته فرمتشده ، رشته موجود در متن منبع برنامه ( source code ) را دریافت می نماید و قسمتهای مختلف آن را اسکن می کند و در آرگومانها ذخیره می کند . نمای کلی تابع کتابخانهای sscanf به شکل زیر است :
{{چپچین}}
sscanf(const char *buffer, const char *format, arguments-list);
{{پایان چپچین}}
مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main()
{
char str[] = "This is a string with 2 numbers : 5 and 9";
char str2[10], str3[10], str4[10], str5[10], str6[10], str7[10];
char c1, c2;
int i1, i2, i3;
sscanf(str, "%s %s %c %s %s %d %s %c %d %s %d", str2, str3, &c1, str4, str5, &i1, str6, &c2, &i2, str7, &i3);
printf("%s %s %c %s %s %d %s %c %d %s %d", str2, str3, c1, str4, str5, i1, str6, c2, i2, str7, i3);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال بالا یک رشته به نام str تعریف نمودهایم که یک رشته است که می گوید این یک رشته است با ۲ عدد : ۵ و ۹ سپس ۶ رشته ۱۰ کاراکتری که مطمئن هستیم رشتهها بیشتر از ۱۰ کاراکتر ندارند ، اعلان نمودهایم . سپس ۲ کاراکتر ، اعلان نمودهایم و سپس نیز ۳ عدد داده صحیح را اعلان نمودهایم . تابع کتابخانهای sscanf رشته str را می گیرد و قسمتهای مختلف آن را اسکن می کند و به ترتیب در آرگومانهای تعیین شده ( که متغیرهایی هستند که بالاتر نوشتیم اعلان شدهاند ) ذخیره کردهایم . در نهایت با تابع printf دادههای ذخیره شده را در خروجی خطدستوری چاپ نمودهایم . دقت کنید که scanset ها در sscanf نیز برقرار و کارا هستند
همچنین تابع sscanf در صورت عملکرد موفقیتآمیز مقداری بزرگتر یا مساوی 0 را باز می گرداند و در غیر این صورت مقدار EOF سرنام End Of File به معنی پایان فایل یا پایان سند . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main()
{
char str[] = "This is a string with 2 numbers : 5 and 9";
char str2[10], str3[10], str4[10], str5[10], str6[10], str7[10];
char c1, c2;
int i1, i2, i3;
int itemsread = 0;
itemsread = sscanf(str, "%s %s %c %s %s %d %s %c %d %s %d", str2, str3, &c1, str4, str5, &i1, str6, &c2, &i2, str7, &i3);
printf("%s %s %c %s %s %d %s %c %d %s %d\n", str2, str3, c1, str4, str5, i1, str6, c2, i2, str7, i3);
printf("Items read are : %d\n", itemsread);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در این مثال تابع کتابخانهای sscanf مقدار ۱۱ را باز می گرداند . ۲ رشته سپس ۱ کاراکتر سپس ۲ رشته و سپس ۱ عدد و دوباره ۱ رشته و سپس ۱ کاراکتر سپس ۱ عدد و بعد ۱ رشته و ۱ عدد دیگر که مجموعاً می شود ۱۱ مورد و آیتم دریافت شده
== تابع vprintf ==
تابع vprintf سرنام variadic print formatted به معنی پرینت فرمت شده تعداد متغیر ، تابعی همانند printf را توسط کاربر می سازد . فقط این تابع نیاز به ماکروها و توابعی دارد که در فایل سرآیند stdarg تعریف شدهاند و ما در اینجا به صورت مختصر توضیح می دهیم تا در مبحث مربوطه مفصلاً آنها را تشریح کنیم . va_list یک ماکرو است که فهرستی ( لیستی ) از آرگومانهایی که قرار است ایجاد شوند را در یک متغیر ایجاد می کند . سپس تابع va_start با ۲ آرگومان که اولی همان آرگومانهای va_list است را دریافت می کند تا امکان دسترسی به آن را فراهم کند و دومی آخرین آرگومان ثابت و غیر متغیر تابع را دریافت می کند تا تابع متغیر آغاز به کار کند و va_end آرگومان ساخته شده را می گیرد تا آن را خاتمه دهد ( در تابعی با تعداد پارامترهای متغیر ) . به مثال زیر دقت کنید :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
#include <stdarg.h>
void PrintFormatted(char *string, ...)
{
va_list args;
va_start(args, string);
vprintf(string, args);
va_end(args);
return;
}
int main()
{
PrintFormatted("%d variable argument\n", 1);
PrintFormatted("%d variable %s\n", 2, "arguments");
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال ساده بالا ابتدا stdio را ضمیمه برنامه خود نمودهایم و سپس stdarg را تا تابعی با تعدادِ آرگومانهای پذیرنده متغیر تعریف کنیم . تابع پوچ PrintFormatted یک پارامتر رشته به نام string دارد و سه نقطه ( ellipsis ) که تعداد پارامترهای متغیر را نشان می دهد و تعیین می کند . سپس va_list متغیری برای کار با آرگومانهای دریافت شده با نام args را تعریف کرده است . سپس va_start آرگومانهای فرستاده شده و آرگومان تابع را پذیرفته است . سپس vprintf هر رشتهای را که به آن فرستاده شود در args ذخیره می کند و پرینت می نماید و در پایان va_end عمر args و تابع با تعداد پارامترهای متغیر را پایان می دهد . حالا به جای printf می توانیم از تابع vprintf استفاده کنیم که ابتدا یک رشته را به آن فرستادهایم که اولین قسمت آن یک متغیر عددی صحیح است که تعیین کننده فرمت آن را نوشته و در پایان به آن ۱ را فرستادهایم . دومی نیز به همین شکل است به استثنای اینکه آخرین آرگومان فرستاده شده به آن ( قبل از خط شکسته ) یک رشته است ( "arguments" ) '''دقت کنید :''' تعیین کنندههای فرمت در vprintf همانند printf و sprintf میباشند
== تابع vsprintf ==
تابع vsprintf سرنام variadic string print formatted تلفیقی از vprintf و sprintf می باشد . نمای کلی ایجاد تابع vsprintf به شکل زیر است :
{{چپچین}}
vsprintf(char * buffer , const char * format , arguments-list)
{{پایان چپچین}}
ابتدا باید تابعی با تعداد پارامترهای متغیر تعریف نمود که در آن vsprintf یک متغیر اشارهگر را می پذیرد تا متن در آن ذخیره شود ، سپس تعیینکنندههای فرمت و در نهایت فهرست آرگومانهای فرستاده شده را . بدین ترتیب اگر متنی را با تعیین کنندههای فرمت به همراه آرگومانهای متناسب به vsprintf بفرستیم در متغیر اشارهگر ذخیره می شود که می توانیم آن را با یک تابع کتابخانهای مثل printf چاپ کنیم . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
#include <stdarg.h>
void vspfunc(char * str, char * fmt, ...)
{
va_list argptr;
va_start(argptr, fmt);
vsprintf(str, fmt, argptr);
va_end(argptr);
return;
}
int main(void)
{
char buff[50];
int c = 299792458;
double pi = 3.141592;
char string[] = "string";
vspfunc(buff, "%d %f %s", c, pi, string);
printf("%s", buff);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال بالا ابتدا stdio.h و stdarg.h را ضمیمه برنامه خود نمودهایم تا از ماکروها و تابعهای کتابخانهای آنها در برنامه خود استفاده کنیم . سپس یک تابع پوچ با نام vspfunc مخفف vsprintffunction تعریف نمودهایم که یک متغیر اشارهگر از نوع کاراکتر به نام str مخفف string و یکی هم به نام fmt مخفف format دارد به همراه سه نقطه که نشانگر داشتن تعداد پارامترهای متغیر است . داخل تابع ابتدا به کمک ماکروی va_list متغیری که قرار است آرگومانها را پذیرا شود تعریف نمودهایم ( argptr ) سپس برای کار با آرگومانهای فرستاده شده و آرگومانهای تابع از va_start استفاده کردهایم . سپس تابع vsprintf سه آرگومان را می پذیرد . اولی اشارهگری که در آن دادهها ذخیره شوند ؛ دومی تعیینکنندههای فرمت و سومی فهرست آرگومانهای فرستاده شده . سپس va_end عمر argptr را پایان می دهد . چون تابع ، پوچ است مقداری را باز نمی گرداند . داخل تابع اصلی برنامه main یک رشته به کمک آرایهای از کاراکتر با نام buff مخفف buffer با پنجاه عنصر اعلان نمودهایم . یک متغیر صحیح که سرعت انتشار نور در خلأ را در خود ذخیره کرده یک متغیر اعشاری با دقت دو برابر که عدد پای ( پی ) را در ذخود ذخیره کرده و یک رشته که string را در خود ذخیره کرده . سپس آنها را به کمک تابع کتابخانهای vsprintf در buff ذخیره نمودهایم و با تابع کتابخانهای printf در خروجی خطدستوری چاپ نمودهایم و تابع با موفقیت به پایان می رسد
== تابع putchar ==
تابع کتابخانهای putchar سرنام put character به معنی کاراکتر را قرار بده یک کاراکتر را به خروجی خطدستوری می فرستد . نمای کلی ایجاد تابع کتابخانهای putchar به شکل زیر است :
{{چپچین}}
putchar(unsigned char);
{{پایان چپچین}}
برای استفاده از این تابع یا می توانید یک کاراکتر را داخل تابع بنویسید تا چاپ شود یا یک داده کاراکتری تعریف شده را به آن بفرستید . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
putchar('J');
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
که در خروجی خطدستوری کاراکتر J را چاپ می کند ؛ همچنین می توانید مقدار و موجودی J را داخل یک داده کاراکتری ذخیره کنید و سپس آن را به putchar بفرستید . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
char c = 'J';
putchar(c);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
یک مثال دیگر برای کامل کردن کاربرد تابع putchar :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
char ch = 'A';
for(ch = 'A'; ch <= 'Z'; ch++)
{
putchar(ch);
putchar('\n');
}
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
ابتدا یک کاراکتر با مقدار و موجودی کاراکتر A با نام ch تعریف نمودهایم . سپس با حلقه for کاراکتر ch را از A تا زمانی که مقدار کمتر و مساوی Z باشد به همراه یک خط شکسته در خروجی خطدستوری قرار دادهایم که همان حروف الفبای انگلیسی می باشد
== تابع getchar ==
تابع کتابخانهای getchar مخفف get character به معنی « کاراکتر را بگیر » برای دریافت یک کاراکتر از ورودی استاندارد ( معمولاً صفحهکلید Keyboard در ورودی خطدستوری ) می باشد . نمای کلی ایجاد تابع getchar بدین شکل می باشد :
{{چپچین}}
getchar(void);
{{پایان چپچین}}
تابع getchar آرگومانی را نمی پذیرد و مقدار آن فقط در دادههای صحیح قابل ذخیره است ( که کامپایلر به صورت خودکار نقش کاراکتر را به آن می دهد )
خروجی getchar باید یک کاراکتر باشد و اگر EOF یعنی End Of File را بازگرداند یعنی یا فایل به پایان رسیده است یا خطایی در وارد کردن کاراکتر وجود داشته است . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include<stdio.h>
int main()
{
int ch;
ch = getchar();
printf("The entered character is : %c", ch);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
ابتدا یک داده از نوع صحیح با نام ch اعلان نمودهایم ؛ سپس ch توسط getchar که مقداری از نوع کاراکتر دریافت می کند تعریف می شود و مقدار و موجودی آن ، همان مقدار و موجودی کاراکتری وارد شده است و سپس در خروجی خطدستوری چاپ می شود که کاراکتر وارد شده توسط شما کاراکتر ''x'' می باشد که ''x'' همان کاراکتر وارد شده توسط کاربر می باشد
== تابع puts ==
تابع کتابخانهای puts سرنام put string به معنی رشته را قرار بده ، یک رشته را در خروجی استاندارد که معمولاً محیط خطدستوری سیستم عامل است می نویسد . نمای کلی ایجاد تابع puts به شکل زیر می باشد :
{{چپچین}}
puts(const char * string);
{{پایان چپچین}}
می توانیم یک رشته را داخل آن بنویسیم یا نام یک متغیر از نوع رشته را که تعریف شده است به آن بفرستیم تا در خروجی خطدستوری نمایش دهد .
'''نکته :''' تابع puts به خودی خود ، در پایان رشته ، خط را می شکند و وارد خط بعدی می شوید
مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include<stdio.h>
int main()
{
puts("Hello World!");
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در قطعه کد بالا رشته !Hello World را نمایش دادهایم
مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include<stdio.h>
int main()
{
char ch[] = "This is a string";
puts(ch);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال و قطعه کد بالا یک رشته به نام ch را تعریف کردهایم . سپس با تابع کتابخانهای puts مقدار و موجودی ch را نمایش دادهایم
همچنین اگر puts را داخل یک داده صحیح ذخیره کنید ، هم متن نمایش داده می شود و هم تعداد کاراکترهای داخل رشته puts ذخیره می شود . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include<stdio.h>
int main()
{
int n = puts("This is a string");
printf("%d", n);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
'''نکته :''' تعیینکنندهای فرمت در puts عمل نمی کنند و در صورت استفاده ، کامپایلر از شما خطا می گیرد
== تابع gets ==
تابع کتابخانهای gets سرنام get string به معنی رشته را بگیر ، از ورودی استاندارد که معمولاً صفحهکلید است رشتهای را دریافت می کند و سپس آن را در بافر ذخیره می کند ( که یک اشارهگر است ) . نمای کلی ایجاد تابع کتابخانهای gets به صورت زیر است :
{{چپچین}}
gets(char * buffer);
{{پایان چپچین}}
دقت کنید که از تعیینکنندههای فرمت نمی توانید در gets استفاده کنید . تابع gets با یک خط جدید ( شکسته شدن خط ) پایان می یابد که آن را به صورت یک تهی NULL ذخیره می کند و اگر عملیات دریافت با موفقیت انجام شود ، رشته ذخیره شده در خود را باز می گرداند و اگر یک اشارهگر تهی NULL Pointer را باز گرداند یعنی خطایی رخ داده و در صورتی که رشتهای وارد نشده باشد EOF سرنام End Of File را باز می گرداند
'''نکته :''' استفاده از تابع gets ریسک پذیر است ؛ چرا که چک نمی کند که رشتهای که شما اعلان کردهاید چند عنصری است و اگر از مقدار تعیین شده بیشتر باشد ، بافر Buffer سرریز می شود و آنچه که باز می گرداند تعریفنشده است
مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include<stdio.h>
int main()
{
char ch[30];
printf("Enter a string : \n");
gets(ch);
printf("%s", ch);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در قطعه کد بالا یک رشته ۳۰ کاراکتری با نام ch را اعلان نمودهایم . سپس در رابط خطدستوری چاپ کردهایم یک رشته را وارد کنید و خط را شکستهایم . سپس تابع gets رشته ch را از کاربر دریافت می کند و در نهایت تابع printf آنچه را که وارد کردهاید در خروجی خطدستوری چاپ می کند
'''
نکته مهم :''' تابع gets در استاندار C11 و از آن به بعد ، حذف شده است . اگر کامپایلر شما خطا گرفت یا اگر کامپایلر خود را تنظیم کردید تا از استاندارد جدید استفاده کند و از شما خطا گرفت ، علتش همین است . توصیه شده است که به جای gets از fgets استفاده کنید که در ادامه خواهیم نوشت
== ماکروهای stdin و stdout ==
در قسمت بعدی ماکروی FILE را خواهیم نوشت که به برنامهنویس اجازه میدهد تا جریان فایلی را ایجاد کند تا فایلی ساخته شود و آن را بخوانیم یا درون آن چیزی بنویسیم یا هر دوی اینها . اما ماکروهای stdin سرنام standard iput به معنی ورودی استاندارد و stdout سرنام standard output به معنی خروجی استاندارد برای ما این امکان را فراهم میآورند تا از ورودی و خروجی استاندارد ( در رایانه صفحهکلید و نمایشگر ) به جای جریان فایل در تابعهای کتابخانهای که فایل را میخوانند و در آن مینویسند از صفحهکلید و نمایشگر استفاده کنیم . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
fprintf(stdout, "%s", "string");
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در قطعه کد بالا از تابع کتابخانهای fprintf سر نام file print formatted به معنی چاپ فرمت شده فایل استفاده کردهایم اما به جای اینکه با فایلی سر و کار داشته باشیم و بخواهیم طبق معمول در فایلی چیزی را بنویسیم به جای نام فایل نوشتهایم : stdout
و سپس تعیینکننده فرمت تعیین کرده است که یک رشته نوشته شود ( در اینجا نمایش داده شود ) و به جای آن رشته string را به عنوان آرگومان به تابع فرستادهایم . به همین شکل می توان به جای یک تابع کتابخانهای که از فایل ، اطلاعات را می خواند ، بنویسیم : stdin و از صفحهکلید ، اطلاعات را دریافت کنیم
== ماکروی نوع داده FILE ==
به ورود و خروج دادهها از گذرگاه ( مثل برنامه ) جریان داده گفته می شود . همچنین به ورود و خروج دادهها به داخل فایل ، جریان فایل گفته می شود . ماکروی FILE با یک علامت استریسک و یک شناسه برای نام فایلی که می خواهیم بسازیم ، در برنامه ( زبان برنامهنویسی سی ) جریان فایلی را می سازد و آن را آماده استفاده می کند . نمای کلی ایجاد جریان فایل بدین شکل است :
{{چپچین}}
FILE * const char * name-of-file
{{پایان چپچین}}
که const char * name-of-file یک رشته است که نام فایلی را که قصد استفاده از آن را داریم را تعیین می کند . مثل : FILE * fp در اینجا fp سرنام file pointer نام انتخابی ما برای فایلی که قصد استفاده از آن را داریم می باشد
== تابعهای fopen و fclose ==
تابع fopen سرنام file open به معنی فایل را باز کن ، فایلی را که ماکروی نوع داده FILE آماده کرده باشد را باز میکند و در دادهی فایل باز شده ( توسط FILE ) ذخیره می کند . تابع کتابخانهای fopen دو پارامتر را از نوع رشته پذیرا می باشد : یکی نام فایل و دیگری نحوه باز کردن فایل file opening mode ( که هر دو طبعاً باید داخل دو دابل کوت " قرار بگیرند )
به عنوان نام فایل اگر فقط نامی را بنویسید ، برنامه فایل مورد نظر شما را در همان آدرس برنامه ایجاد می کند ، اما اگر آدرس معین دیگری را به آن بدهید در همان آدرس ایجاد می کند . تابع fopen در صورت عمل موفق ، یک اشارهگر به فایل ( و به طور کلّیتر شیئای که جریان فایل را در دست دارد ) باز می گرداند و در صورت عدم موفقیت یک اشارهگر تهی NULL باز می گرداند . تابع کتابخانهای fclose نیز سرنام file close فایل باز شده را می بندد تا از حافظه موقت ( RAM ) پاک شود و فضای اشغال شده را آزاد می کند که فقط باید بین جفت پرانتز باز و بسته آن ، نام فایلی را که ایجاد کردهاید بنویسید . تابع fclose در صورت موفقیتآمیز بودن عملیات مقدار 0 را باز می گرداند و در صورت خطا EOF را باز خواهد گرداند
نحوههای باز کردن فایل بدین شرح می باشند :
{{چپچین}}
r
{{پایان چپچین}}
مخفف read که برای خواندن فایل می باشد و به اولین کاراکتر فایل اشاره می کند
{{چپچین}}
w
{{پایان چپچین}}
مخفف write که برای نوشتن در فایل می باشد و فایل را باز نویسی می کند ( یعنی اگر داخل فایل متنی موجود باشد ، آن را جایگزین می کند ) و در صورت عدم وجود فایل ، فایل را ایجاد می کند
{{چپچین}}
a
{{پایان چپچین}}
مخفف append که در ادامه فایل ، متنی را می نویسد ( یعنی اگر متنی داخل آن موجود باشد ، در ادامه آن ، خواهد نوشت ) در صورت عدم وجود فایل آن را می سازد
{{چپچین}}
r+
{{پایان چپچین}}
مخفف + read که هم می خواند و هم می نویسد اما به اولین کاراکتر فایل اشاره می کند
{{چپچین}}
w+
{{پایان چپچین}}
مخفف + write که هم می خواند و هم می نویسد و در صورت نوشتن متن را جایگزین می کند . همچنین در صورت عدم وجود فایل ، آن را می سازد
{{چپچین}}
a+
{{پایان چپچین}}
مخفف + append که هم می خواند و هم در انتهای فایل می نویسد و به آخرین کاراکتر فایل اشاره می کند . در صورت عدم وجود فایل آن را می سازد
{{چپچین}}
rb
{{پایان چپچین}}
مخفف read binary که فایل را به صورت باینری ( دودویی ) و در واقع عددی می خواند . اگر فایل ، موجود نباشد یک اشارهگر NULL باز می گرداند
{{چپچین}}
wb
{{پایان چپچین}}
مخفف write binary که فایل را به صورت باینری ( دودویی ) و در واقع عددی می نویسد و جایگزین می کند . در صورت عدم وجود فایل آن را می سازد
{{چپچین}}
ab
{{پایان چپچین}}
مخفف append binary که فایل را به صورت باینری ( دودویی ) و در واقع عددی اضافه کرده و در انتهای می نویسد . در صورت عدم وجود فایل آن را می سازد
{{چپچین}}
rb+
{{پایان چپچین}}
مخفف + read binary که فایل را جهت خوانده و نوشته شدن در مبنای دو و به صورت عددی باز می کند . اگر فایلی وجود نداشته باشد یک اشارهگر NULL باز می گرداند
{{چپچین}}
wb+
{{پایان چپچین}}
مخفف + write binary که فایل را جهت خوانده و نوشته شدن در مبنای دو و به صورت عددی باز می کند و اگر محتوایی داشته باشد آن را جایگزین می کند . در صورت عدم وجود فایل ، آن را می سازد
{{چپچین}}
ab+
{{پایان چپچین}}
فایل را جهت خواندن و اضافه کردن در مبنای دو و در واقع عددی باز می کند . در صورت عدم وجود فایل آن را می سازد
مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
FILE * fp;
fp = fopen("/home/lovelorn/Documents/mytext.txt", "w");
fprintf(fp, "%s", "string");
fclose(fp);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
'''تشریح :''' ابتدا فایل سرآیند stdio را ضمیمه برنامه خود نمودهایم تا از ماکروها و تابعهای کتابخانهای استاندارد تعریف شده در آن استفاده کنیم . سپس داخل تابع اصلی برنامه main که پارامتری ندارد یک فایل را با نام fp آماده استفاده نمودهایم . موجودی fp توسط تابع کتابخانهای fopen که در فایل سرآیند stdio تعریف شده است یک فایل متنی به نام mytext می باشد که داخل آدرس home و نام کاربری خودم lovelorn می باشد ( این نام توسط شما در سیستم عامل لینوکس تعریف می شود ) که متعلق به سیستم عامل GNU/Linux می باشد شما در ویندوز می توانید بنویسید :
{{چپچین}}
"D:/myapp/mytext.txt"
{{پایان چپچین}}
که در حالت w یعنی نوشتن قرار دارد و فایلی به نام mytext را با فرمت txt در آدرس ذکر شده ایجاد می کند . سپس توسط تابع fprintf سرنام file print formatted به معنی چاپ فرمت شده فایل که هنوز به آن نرسیدهایم اما همان طور که اشاره شد جهت نوشتن در فایل می باشد ، نام فایل را ذکر کرده و سپس توسط تعیین کننده فرمت تعیین کردهایم که یک رشته را میخواهیم بنویسیم و سپس string به معنی رشته را به آن فرستادهایم که می توانستیم نام یک متغیر تعریف شده را نیز نویسیم که باید یک رشته می بود که داخل متنی موجود وجود داشت . سپس فایل fp را توسط تابع کتابخانهای fclse بستهایم تا فضای اشغال شده توسط فایل fp در حافظه موقت RAM آزاد شود . سپس تابع main با موفقیت به پایان می رسد
== تابع fprintf ==
تابع کتابخانهای fprintf سرنام file print formatted به معنی چاپ فرمتشده فایل متنی را از برنامه دریافت نموده و در جریان فایل می نویسد . شکل کلی ایجاد تابع fprintf به صورت زیر است :
{{چپچین}}
fprintf(FILE * stream, const char * format-string, argument list);
{{پایان چپچین}}
ابتدا نام جریان فایل را نوشته ؛ سپس تعیین کنندههای فرمت را به همراه متن دلخواه ( که ضروری نیست ولی می توانید بنویسید ) می نویسیم و سپس آرگومانهایی که به تابع فرستاده می شوند تا جایگزین تعیین کنندههای فرمت شوند را می نویسیم
مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
char str[] = "Hello World!\n";
FILE * fp;
fp = fopen("mytext.txt", "w");
fprintf(fp, "%s", str);
fclose(fp);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال بالا رشته str جمله !Hello World را به همراه یک شکستن خط در خود ذخیره نموده و تعریف شده است . سپس فایل fp را آماده ایجاد نمودهایم . فایل fp توسط تابع کتابخانهای fopen با نام mytext در آدرس برنامه نوشته خواهد شد ( در صورتی که وجود نداشته باشد ساخته خواهد و در صورت وجود ، متن آن بازنویسی خواهد شد و همان طور که در مطلب پیشین گفتیم می توانید آدرس را هم بنویسید . تابع کتابخانهای fprintf که مطلب فعلی می باشد تابع fp را هدف قرار داده و یک رشته را پذیرا می باشد که رسته همان str با موجودی و مقدار !Hello World و یک شکستن خط می باشد . در پایان با تابع کتاخانهای fclose که در مطلب پیشین نوشتیم ، فایل fp زا می بندیم و فضای اشغال شده توسط آن را آزاد می نمائیم و تابع main با موفقیت به اتمام رسیده است . حالا شما می توانید فایل mytext.txt را در جایی که برنامه خود را نوشته و کامپایل نمودهاید بیابید که داخل همان متن نوشته شده به همراه یک خط شکسته در آن موجود می باشد . ضمناً تابع fprintf در صورت عملکرد موفقیتآمیز تعداد بایتهای نوشته شده را باز میگرداند و در صورت عدم موفقیت یک عدد منفی را باز میگرداند
'''نکته :''' تعیین کنندههای فرمت در fprintf همانند printf می باشند
== تابع fscanf ==
تابع fscanf سرنام file scan formatted به معنی اسکن فرمتشده فایل جهت خواندن دادهها از جریان فایل می باشد که دادهها را داخل متغیرهای آرگومانهای فرستاده شده به خود ذخیره می نماید . شکل کلی ایجاد تابع fscanf به صورت زیر می باشد :
{{چپچین}}
fscanf(FILE * stream, const char * format-string, argument-list);
{{پایان چپچین}}
ابتدا نام جریان فایلی را که قرار است خوانده شود می نویسیم ، سپس تعیین کنندههای فرمت را و سپس در پایان آرگومانهایی که قرار است جایگزین تعیین کنندههای فرمت شوند را به تابع می فرستیم
مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
char str1[10], str2[10];
float euler;
FILE * fp;
fp = fopen ("mytext.txt", "r");
fscanf(fp, "%s %s %f", str1, str2, &euler);
printf("The text in file is : %s %s %f\n", str1, str2, euler );
fclose(fp);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
ما سند و فایلی را به نام mytext.txt در آدرس و جایی که برنامه قرار دارد ایجاد نمودهایم و داخل آن نوشتهایم : Hello World! 2.71 سپس در برنامه خود ۲ رشته با نامهای str1 و str2 اعلان نمودهایم ؛ همین طور یک عدد اعشاری با نام اویلر . سپس یک فایل را با نام fp آماده استفاده نمودهایم و سپس با تابع کتابخانهای fopen فایل mytext.txt را جهت خواندن باز نمودهایم . تابع کتابخانهای fscanf که مطلب فعلی ماست فایل fp را اسکن می کند و داخل آن به دنبال ۲ رشته و یک عدد اعشاری می گردد که داخل str1 و str2 و euler ذخیره می کند . '''دقت کنید''' که رشتهها جهت دریافت شدن نیازی به عملگر آدرسدهی ( یعنی همان علامت امپرسند & ) ندارند اما جهت دریافت عدد در مثال نیز از آن استفاده نمودهایم که ضروری می باشد . سپس آنچه که در فایل mytext.txt خوانده شده است در خروجی خطدستوری نمایش داده می شود که اولین رشته Hello و دومین رشته !World و عدد اعشاری ما عدد اویلر با دقت ۲ رقم اعشار یعنی ۲٫۷۱ می باشد . در پایان نیز فایل را بسته و تابع را با موفقیت به پایان می رسانیم . مقداری که تابع fscanf باز می گرداند مقدار و تعداد دادههایی است که خوانده است ؛ اگر کمتر از دادههای داخل فایل باشد با مشکلی رو به رو شده است تا جایی که این مقدار می تواند 0 باشد ؛ اما اگر به کلی فایل را نتواند بخواند مقدار EOF را باز خواهد گرداند . '''دقت کنید''' که تعیین کنندههای فرمت در fscanf همانند scanf می باشند
== تابع getc ==
تابع کتابخانهای getc سرنام get character به معنی کاراکتر را بگیر همانند getchar می ماند اما به جای گرفتن کاراکتر از ورودی استاندارد ( صفحهکلید keyboard ) کاراکتر را از فایل می گیرد . شکل کلی ایجاد تابع getc بدین صورت می باشد :
{{چپچین}}
getc(FILE * Stream)
{{پایان چپچین}}
تابع getc از یک فایل کاراکتری را دریافت کرده و به اولین کاراکتر بعدی می رود . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
FILE * fp;
int ch;
fp = fopen("mytext.txt", "r");
ch = getc(fp);
while(ch != EOF)
{
putchar(ch);
ch = getc(fp);
}
putchar('\n');
fclose(fp);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
ابتدا فایل mytext را برای خواندن باز می کنیم ، داده صحیح ch با تابع کتابخانهای getc فایل را دریافت می کند و اولین کاراکتر آن را در ch ذخیره کرده و به سراغ کاراکتر بعدی می رود . سپس توسط حلقه while تا زمانی که به پایان فایل نرسیده کاراکتر(های) داخل فایل را نمایش داده و بعد دوباره کاراکتر بعدی را می گیرد . در پایان نیز خط را شکستهایم . که فایل تغییر نکرده و خروجی آن همان 2.71 !Hello World می باشد . تابع getc کاراکتری را که خوانده به صورت یک کاراکتر بدون علامت unsigned char که نقش یک صحیح int را ایفا می کند باز می گرداند و به کاراکتر بعدی در جریان فایل اشاره می کند . در صورت رسیدن به پایان فایل EOF را باز می گرداند و یا اگر مشکلی وجود داشته باشد یک خطا را باز می گرداند که می توان با تابعهای کتابخانهای feof و ferror آن را از هم تشخیص داد و خطای بازگردانده شده را دریافت نمود تا خطا را برطرف کرد . فایل را بسته و تابع اصلی برنامه را با موفقیت به پایان می رسانیم
== تابع putc ==
تابع putc همانند putchar میباشد و سرنام put character است جز اینکه کاراکتر دریافت شده را اخل یک فایل قرار می دهد و منتظر کاراکتر بعدی می ماند تا وارد شود و آن را داخل فایل قرار دهد . شکل کلی ایجاد تابع putc بدین صورت است :
{{چپچین}}
putc(int ch, FILE * stream);
{{پایان چپچین}}
تابع putc یک مقدار کاراکتری را که می تواند از نوع صحیح و یا کاراکتر باشد دریافت نموده و داخل جریان فایل می نویسد . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
FILE * fp;
char ch;
char brkline = '\n';
fp = fopen("alphabet.txt", "w");
for(ch='A'; ch<='Z'; ch++)
{
putc(ch, fp);
putc(brkline, fp);
}
fclose(fp);
printf("The Operation Has Finished Successfully !\n");
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال بالا فایلی را با نوع داده FILE به نام fp آماده ایجاد شدن می نمائیم . یک کاراکتر با نام ch را اعلان نموده و کاراکتر brkline را با شکستن خط تعریف می کنیم . سپس با تابع کتابخانهای fopen فایل alphabet.txt به معنی الفبا را برای نوشته شدن می سازیم . با حلقه for از جایی که ch مقدار A دارد تا جایی که مقدار آن به Z برسد ch یک واحد یک واحد افزایش می یابد و به سراغ کاراکتر بعدی می رود . تا putc مقدار ch در فایل مد نظر چاپ می کند و سپس دوباره همین تابع مقدار خط شکسته را وارد می کند تا حروف الفبای انگلیسی در خطوط مجزا در فایلی با نام alphabet در دایرکتوری و فولدری که برنامه قرار دارد ایجاد شده و ذخیره گردند . سپس فایل را می بندیم و در پایان با تابع printf در خروجی خطدستوری چاپ نمودهایم عملیات با موفقیت به پایان رسید .
تابع putc در صورت موفقیتآمیز بودن عملیات خود کاراکتری را که نوشته است باز میگرداند و در صورت عدم موفقیت مقدار EOF را باز میگرداند
== ماکروی مقدار NULL ==
مقدار تهی با تلفظ نُل که آن را نول می نویسیم NULL در فایلهای سرآیند stdio و stdlib و stddef و time و locale و string و wchar تعریف شده است و مقدار اشارهگری است که آن اشارهگر به مکانی غیر قابل دسترسی اشاره می کند تا اگر به اشتباه از آن اشارهگر در برنامه استفاده شد باعث توقف سیستم نشود . حتماً از مبحث اشارهگرها به یاد دارید که اگر اشارهگری را اعلان نمودید و آن را به شکلی تعریف نکردید که به متغیر یا تابع دیگری اشاره کند ، بهتر است آن را با دادن مقدار NULL تعریف کنید . طبق استاندارد عبارت ثابت ;int * ptr = 0 یک اشارهگر NULL است نام آن ( ptr ) دل به خواه است اما اگر یک متغیر صحیح اشارهگر را مقدار 0 به آن بدهید همانند مقدار NULL خواهد بود و غیر قابل دسترسی است و در صورتی که بخواهید آدرس آن را به دست آورید یا در خروجی چاپ کنید و نمایش دهید آدرس آن غیر قابل دسترسی اعلام خواهد شد . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
int * iptr = NULL;
printf("%p\n", iptr);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال بالا آدرس اشارهگر ptr غیر قابل دسترسی نمایش داده خواهد شد
طبق استاندارد مشخص نشده است که غیر قابل دسترسی بودن مقدار NULL در کامپایلر و پیادهساز باید چگونه باشد اما مقدار آن :
{{چپچین}}
((void *)0)
{{پایان چپچین}}
تعریف شده است . شما علاوه بر دادن مقدار تهی به اشارهگر در برنامههای بزرگ خود میتوانید در دستور شرطی if بررسی کنید که اشارهگر شما به جایی اشاره کرده است یا خیر که می نویسید if (ptr == NULL) بدین ترتیب مشخص می شود که اشارهگر ptr به جایی اشاره کرده و آدرسی دارد یا خیر . همچنین در ساخت دادههای درختی و لیست پیوندی باید آخرین مقدار آن را تهی تعیین کنید تا پایان دادهها را تعیین کنید
== تابع fputc ==
تابع fputc سرنام file put character همانند putc میباشد و یک کاراکتر را داخل فایل تعیین شده می نویسد و منتظر کاراکتر بعدی می ماند تا آن را وارد کند ( به محل بعدی اشاره می کند ) جز اینکه putc به نحوی در فایل سرآیند تعریف میشود که در هر بار فراخوانی ، فایل فرستاده شده به خود را دوباره می خواند و این مورد در نوشتن برنامه به صورت غیر حرفهای می تواند باعث ایجاد باگ ، مخصوصاً باگ امنیتی و رخنهپذیری شود در حالی که fputc اینگونه نیست و امن می باشد ؛ ضمن اینکه fputc را می توانید به عنوان آرگومان به یک تابع دیگر بفرستید و همچنین فضای حافظه موقت کمتری اشغال می کند ولی fputc کمی کندتر از putc می باشد . شکل کلی ایجاد تابع fputc بدین صورت می باشد :
{{چپچین}}
fputc(int ch, FILE * fp);
{{پایان چپچین}}
ch نام مقداری است که کاراکتر متناظر آن در ازکی ( ASCII ) توسط شما تعیین می شود تا در فایل نوشته شود . همچنین شما می توانید یک کاراکتر را تعریف کنید و به آن بفرستید تا آن را در فایل بنویسد . تابع fputc در صورت عملکرد موفقیتآمیز مقداری را که نوشته است باز می گرداند و در صورت بروز خطا مقدار EOF را می فرستد ؛ همچنین جهت اشکالزدایی مقادیر دیگری را می فرستد که با تابعهای کتابخانهای دیگر stdio همانند بسیاری از تابعهای کتابخانهای ، خطا را در آن بر طرف کنید . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main ()
{
FILE *fp;
int ch;
int nl = 10;
fp = fopen("alphabet.txt", "w+");
for( ch = 65 ; ch <= 90; ch++ )
{
fputc(ch, fp);
fputc(nl, fp);
}
fclose(fp);
return(0);
}
</syntaxhighlight>
{{پایان چپچین}}
همین برنامه را به صورت زیر نیز می توانیم بنویسیم :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main ()
{
FILE *fp;
char ch;
char nl = '\n';
fp = fopen("alphabet.txt", "w+");
for( ch = 'A' ; ch <= 'Z'; ch++ )
{
fputc(ch, fp);
fputc(nl, fp);
}
fclose(fp);
return(0);
}
</syntaxhighlight>
{{پایان چپچین}}
تشریح این برنامهها تکرار مکررات در همین صفحه است و واضح است که برنامه چگونه عمل می کند ، فقط در اولین قطعه کد مقدار ۶۵ تا ۹۰ کاراکترهای A تا Z در ازکی می باشند و مقدار ۱۰ کاراکتر خط شکسته که در هر بار اجرای حلقه for یک کاراکتر از حروف الفبای انگلیسی و یک کاراکتر خط شکسته نوشته می شود و در دومین قطعه کد دیگر کاراکتر ها را نوشتهایم و نه مقدار آن را
== تابع fgetc ==
تابع fgetc سرنام file get character به معنی کاراکتر را از فایل بگیر همانند getc می باشد و یک کاراکتر را از فایل دریافت می نماید و منتظر کاراکتر بعدی می ماند تا دریافت شود ؛ جز اینکه getc به عنوان یک ماکرو در فایل سرآیند stdio تعریف شده است و با هر بار فراخوانی ، فایل فرستاده شده به خود را دوباره می خواند و اگر کد به درستی نوشته نشود باعث ایجاد باگ مخصوصاً باگ امنیتی و رخنهپذیری می شود ؛ در حالی که fgetc اینگونه نیست و امن می باشد . fgetc را می توانید به عنوان یک آرگومان به تابع دیگری بفرستید و فضای حافظه کمتری را اشغال می کند اما چون fgetc به صورت یک تابع در stdio تعریف شده است کمی کندتر از getc می باشد . شکل کلی ایجاد تابع fgetc بدین صورت می باشد :
{{چپچین}}
fgetc(FILE * stream);
{{پایان چپچین}}
یک فایل را به fgetc می فرستید تا از اولین کاراکتر آن شروع به خواندن کند و منتظر کاراکتر بعدی بماند و به آن اشاره کند تا در ادامه اگر باز هم فراخوانده شد آن را نیز دریافت نماید . تابع fgetc در صورت موفقیتآمیز بودنِ عملکرد خود ، کاراکتری را که خوانده است مقدار عددی صحیح آن را باز می گرداند و در صورت عدم موفقیت EOF را باز می گرداند که با تابعهای feof و ferror که تابعهای تعریف شده در stdio هستید می توان پی برد که فایل به پایان رسیده یا خطایی وجود دارد . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main ()
{
FILE *fp;
int ch;
fp = fopen("alphabet.txt", "r");
ch = fgetc(fp);
while(ch != EOF)
{
putchar(ch);
ch = fgetc(fp);
}
fclose(fp);
return(0);
}
</syntaxhighlight>
{{پایان چپچین}}
'''توضیح برنامه :''' برنامه یک متغیر از نوع صحیح با نام ch دارد که مقدار آن تابع fgetc با دریافت فایل fp می باشد که اولین کاراکتر فایل alphabet.txt را می خواند ( فایلی که در برنامه قبلی ایجاد کردیم که حروف الفبا را نوشت ) و سپس تا زمانی که ch به آخر فایل نرسیده است ch که کاراکتر alphabet.txt است را بر روی خروجی خطدستوری نمایش داده و سپس دوباره fgetc کاراکتر بعدی را می خواند و در خود ذخیره می کند و در پایان فایل را بسته و تابع اصلی را با موفقیت به پایان رساندهایم
== تابع fputs ==
تابع کتابخانهای fputs سرنام file put string به معنی رشته را در فایل قرار بده یک رشته از کاراکترها را داخل جریان داده و معمولاً فایل فرستاده شده به آن ، می نویسد . شکل ایجاد تابع fputs بدین صورت می باشد :
{{چپچین}}
fputs(const char * str, FILE * stream);
{{پایان چپچین}}
ابتدا یک فایل را آماده ایجاد می کنیم سپس آن را باز کرده و نامی برای آن انتخاب می کنیم و بعد به کمک fputs متنی را داخل آن می نویسیم و سپس فایل را می بندیم تا فضای اشغال شده آزاد شود .ضمناً تابع fputs در صورت موفقیتآمیز بودن عملکرد خود یک مقدار غیر منفی را می فرستد و در صورت خطا EOF را و البته مقادیر دیگری که می توانید توسط ferror و دیگر تابعهای خطا یاب ، خطای آن را بیابید و بر طرف کنید که در ادامه می نویسیم . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main ()
{
FILE *fp;
fp = fopen("mytext.txt", "w");
fputs("Hello World!\n2.71", fp);
fclose(fp);
return(0);
}
</syntaxhighlight>
{{پایان چپچین}}
'''توضیح :''' همان طور که نوشته شد ، فایلی را آماده کردهایم تا ایجاد شود ( fp ) سپس آن را جهت نوشتن ایجاد نمودهایم ( mytext.txt ) و با تابع کتابخانهای fputs در آن نوشتهایم :
!Hello World<br>
2.71
و البته اگر دقت کنید این بار در ایجاد نوشته و رشته ، خط را شکستهایم . حال اگر با یک پیرایشگر متن ، فایل ایجاد شده را باز کنید ، متن را داخل آن ، مشاهده خواهید نمود
== تابع fgets ==
تابع fgets سرنام file get string به معنی رشته کاراکترها را از فایل بگیر ، جهت دریافت یک خط از متن فایل داده شده می باشد . شکل کلی ایجاد تابع fgets بدین صورت می باشد :
{{چپچین}}
fgets(char * str, int limit number, FILE * Stream);
{{پایان چپچین}}
تابع نام یک رشته را دریافت می کند ، سپس تعداد محدودیت تعداد کاراکترهای دریافتی را می نویسیم و سپس ورودی جریان داده که معمولاً جریان فایل است . تابع تا زمانی که به خط شکسته یا تعداد محدود کننده نوشته شده نرسیده باشد ، فایل را می خواند و آن را ذخیره می کند . تابع fgets در صورت داشتن عملکرد موفقیتآمیز ، یک اشارهگر را به رشته خود باز می گرداند و در صورت رسیدن به پایان خط یا خطا در عملکرد یک مقدار نول NULL را می فرستد که با feof می توان فهمید که به پایان رسیده است یا خیر و در صورت خطا می توان با تابع ferror خطای آن را پیدا نمود . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main ()
{
FILE *fp;
fp = fopen("mytext.txt", "r");
char str[20];
fgets(str, 20, fp);
puts(str);
fclose(fp);
return(0);
}
</syntaxhighlight>
{{پایان چپچین}}
توضیح : در صورت کامپایل قطعه کد بالا و اجرای آن تنها !Hello World را از فایل mytext.txt در خروجی خطدستوری خواهیم دید ، چرا که 2.71 در خط بعدی و بعد از شکسته شدن خط وجود دارد . فایل mytext.txt ابتدا آماده و سپس برای خوانده شدن باز شده . آرایه کاراکتری str با ۲۰ عنصر ، اعلان شده است . تابع fgets فایل mytext.txt را باز نموده و از آن ۲۰ کاراکتر خط اول را می خواند و در str ذخیره می کند و سپس توسط تابع puts این رشته در خروجی خطدستوری نمایش داده می شود و سپس فایل بسته شده و تابع اصلی ، با موفقیت به پایان می رسد
برای اینکه به صورت مطمئن از fgets متنی را از ورودی استاندارد دریافت کنید باید به شکل زیر عمل کنید ( چرا که با زدن دکمه ورود Enter یا همان Return داخل صفحهکلید ) کاراکتر خط شکسته را به متن اضافه می کند که در صورتی که بخواهید دستوری را بدهید یا نام فایلی را وارد کنید دچار مشکل خواهید شد . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
fgets(filename, 200, stdin);
filename[strcspn(filename, "\r\n")] = 0;
</syntaxhighlight>
{{پایان چپچین}}
'''توضیح :''' تابع fgets داده یا فایلی را با نام filename دریافت میکند که تعداد آن نهایتاً ۲۰۰ تا است و از ورودی استاندارد ، یعنی صفحهکلید ، داده را وارد میکنیم . سپس تابع strcspn که در فایل سرآیند string تعریف شده است هر جا ورودی به خط جدید ( در ویندوز ) و البته خط شکسته ( در تمام سیستم عاملها ) را پیدا کند ، آن را خالی کرده و حذف می کند
== ماکروی نوع داده size_t ==
ماکروی نوع داده size_t سرنام size type به معنی « اندازه نوع » ، اندازه اشیائی همچون آرایهها ، بلوکهای حافظه ، ساختمانها و رشتهها را به بایت در خود ذخیره می کند . اندازه size_t هرچه که باشد منفی نیست . اندازه size_t در C99 شانزده بیت تعریف شد و در حال حاضر حداکثر مقدار ذخیره شده در کامپایلرها و سیستمهای ۳۲ بیتی قدیمی ۲ بایت و در سیستمهای ۶۴ بیت با کامپایلرها و سیستمهای قدیمیتر ۴ بایت و در سیستمهای جدید ۸ بایت است یعنی به اندازه یک int یا یک long long int بدون علامت . اندازه size_t توسط عملگر sizeof به دست میآید . استفاده از size_t به تخصیص حافظه پویا کمک می کند . ضمناً size_t علاوه بر فایل سرآیند stdio در فایلهای سرآیند stddef و stdlib و string و time و wchar تعریف شده است . '''نکته :''' وقتی می خواهید اندازه شیئای را به دست بیاورید بهتر است از size_t استفاده کنید ؛ همچنین برای تعریف اندازههای بزرگ ، جهت قابل حمل بودن برنامه خود بهتر است از size_t استفاده کنید
مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main()
{
int array[5] = { 1, 2, 3, 4, 5 };
size_t size = sizeof(array);
printf("The size of the array is: %zu\n", size);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
'''توضیح :''' در تابع اصلی برنامه ، یک آرایه صحیح به نام array تعریف نمودهایم که ۵ عنصر دارد و هر صحیح ( int ) در سیستمهای ۶۴ بیتی ۴ بایت است . سپس یک نوع داده size_t با شناسه و نام size تعریف نمودهایم که مقدار آن مقدار array است . سپس در تابع printf در خروجی خطدستوری ، چاپ کردهایم اندازه آرایه مورد نظر به اندازه size می باشد که این کار را با تعیینکننده فرمت z به همراه u که سرنام unsigned می باشد نوشته و آرگومان size را به آن فرستادهایم تا جایگزین شود . در پایان ، تابع اصلی برنامه با موفقیت به پایان می رسد و در صورت کامپایل و اجرای برنامه با اندازه آرایه ۲۰ است ، مواجه خواهیم شد ( ۵ عنصر که هرکدام ۴ بایت را اشغال می کند )
'''دقت کنید :''' در تعاریف استانداردهای قدیمیتر مثل C98/C99 ماکروی نوع داده size_t طوری تعریف شده است که تعیینکننده فرمت آن d یا ul یا ull است و نه zu . بنابراین در هنگام نوشتن کد دقت کنید که کامپایلر شما با چه استانداردی ، مطابقت دارد
== تابع fread ==
تابع fread سرنام file read به معنی « فایل را بخوان » فایل فرستاده شده به خود را به تعدادی که تعیین کردهایم و تعداد بایتهایی که باید یکجا خوانده شوند ، در یک متغیر اشارهگر که عموماً باید یک آرایه باشد ذخیره می کند . شکل کلی ایجاد تابع fread بدین صورت می باشد :
{{چپچین}}
fread(void * buffer, size_t size, size_t count, FILE * stream);
{{پایان چپچین}}
فایل stream به تعداد count و اندازه هر یک بلوک از بایتهای size در buffer ذخیره می شود . تابع fread در صورت موفقیتآمیز بودنِ عملکرد خود ، تعداد نوشتههای خود ( count ) را باز می گرداند ولی در صورتی که از تعداد count کمتر شود یعنی خطایی رخ داده و یا به پایان فایل رسیدهایم ( EOF ) . اگر size و یا count را 0 بنویسید تابع مقدار 0 را باز میگرداند اما اختلالی در جریان فایل و یا دادههایی که فرستادهایم ایجاد نمی شود و برنامه به ادامه خود می پردازد . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
FILE * fp;
char buf[100];
fp = fopen ("alphabet.txt", "r");
fread(buf, 1, 100, fp);
printf("%s\n", buf);
fclose(fp);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال بالا ابتدا فایل fp را آماده ایجاد نمودهایم . بعد از آن ، رشته ۱۰۰ کاراکتری buf را اعلان نمودهایم . سپس فایل fp را تعیین کردهایم تا توسط تابع fopen برای خوانده شدن باز شود که همان فایل alphabet.txt می باشد . تابع fread صد بایت را دانه به دانه ( چون برای size نوشتهایم 1 ) از فایل fp می خواند و در buf ذخیره می کند . سپس تابع printf آن را در خروجی خطدستوری چاپ می کند که همان حروف الفبای انگلیسی است . سپس فایل را بسته و تابع با موفقیت به اتمام می رسد
در نظر داشته باشید که fread قابلیت خواندن فایلها را به صورت عددی نیز دارد و یکی از مهمترین تابعهای کتابخانهای زبان سی C برای خواندن فایلها به صورت عددی می باشد . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main()
{
FILE * fp = fopen("/home/lovelorn/Pictures/post-3.jpeg", "rb");
unsigned char n;
for (int i = 0; i < 100; i++)
{
fread(&n, 1, 1, fp);
printf("%d\n", n);
}
fclose(fp);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال بالا فایل post-3.jpeg از قالب و فرمت JPEG را به صورت عددی باز نمودهایم ( شما میتوانید هر فایلی را که داخل سیستم خود دارید قرار داده و آدرس بدهید ) سپس متغیر کاراکتری بدون علامت n را اعلان نمودهایم تا یک بایت جا را در خود بگیرد . پس از آن با یک حلقه for صد بار تابع fread را فراخواندهایم تا از فایل مورد نظر یک بار یک بایت را بخواند و آن را در n ذخیره کند ؛ دقت کنید که بافر باید یک اشارهگر باشد و چون n اشارهگر نیست ، با عملگر آدرسدهی ، در آن مقادیر را ذخیره کرده و سپس توسط تابع printf در خروجی خطدستوری چاپ نمودهایم . دقت کنید که شما درصورتی که هر واحد را ۴ بایت تعریف کنید هر ۴ بایت یک عدد خوانده می شود و در سیستمهای ۳۲ بیتی قدیمی باید تعیین کننده فرمت lu را بنویسید و در صورتی که داده شما ۸ بایتی باشد که آن را بدون علامت تعیین کنید از فرمت llu و در غیر این صورت با خطای نااندازه بودن حافظه مواجه خواهید شد ( که البته همان طور که در پائین نوشتهایم شما باید دادهها را تبدیل کنید ) . در پایان ، فایل مورد نظر خود را بسته و تابع اصلی برنامه را با موفقیت به پایان می رسانیم . در صورتی که با موفقیت برنامه بالا را کامپایل و اجرا کنید با اعداد ۲۵۵ ، ۲۱۶ ، ۲۵۵ و ... ( وابسته به نسخه استاندارد JPEG ) مواجه خواهید شد ( دقت کنید که اکر تعیینکننده فرمت خود را X بنویسید همانند یک هگزادسیمال ادیتور مقادیر برای شما شانزده شانزدهی و به عبارت دیگر در مبنای ۱۶ نوشته خواهد شد )
'''دقت کنید :''' تابع fread به صورت ویژه برای خواندن فایلها به صورت عددی می باشد و اگر بخواهید یک فایل متنی را عددی بخوانید به مشکلاتی بر می خورید و بهتر است از fscanf و sscanf و یا gets استفاده کنید . همچنین تابع fread مقادیر عددی را که به آن می فرستیم و بزرگتر از ۱ بایت ( برای هر حجم size ) باشد در سیستمهای اندین کوچک ( لیتل اندین Little Endian ) از راست به چپ می خواند و اگر آن را چاپ کنید با عدد برعکس شده ۰ و ۱ آن رو به رو خواهید شد . جهت رفع این مشکل در سیستم عاملهای شبهیونیکس و البته ویندوز تابع ntohs سرنام network to host system به معنی عدد شبکه را به سامانه ( سیستم ) میزبان تبدیل کن ، موجود می باشد ( در شبکه ، اعداد ، اندین بزرگ یا همان بیگ اندین Big Endian هستند ) تا قبل از چاپ نمودن عدد آن را بر عکس کنید تا درست خوانده شود ولی تابع استانداردی برای این کار وجود ندارد
در سیستم عاملهای شبهیونیکس و با رابط پازیکس ( POSIX ) می توانید برنامه را همانند برنامه زیر بنویسید :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
#include <arpa/inet.h>
int main()
{
FILE * fp = fopen("/home/lovelorn/Pictures/post-3.jpeg", "rb");
unsigned short n;
unsigned short rev;
for (int i = 0; i < 100; i++)
{
fread(&n, 2, 1, fp);
rev = ntohs(n);
printf("%d\n", rev);
}
fclose(fp);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
'''دقت کنید :''' گنجایش ntohs فقط ۲ بایت است و چک کنید که در سیستم شما هم short فقط ۲ بایت جا اشغال می کند . اگر در سیستمهای ۳۲ بیتی قدیمی هستید int هم ۲ بایت است . همچنین این مشکل در سیستمهای اندین کوچک ( لیتل اندین Little Endian ) مثل معماریهای x86 یا بعضاً ARM ( که در گذشته دو اندینه بود و در حال حاضر اندین کوچک است ) وجود دارد و در سیستمهای اندین بزرگ ( بیگ اندین Big Endian ) وجود ندارد . از سویی برخی از سیستمها فایل سرآیند netinet/in.h را به جای arpa/inet.h برای استفاده از ntohs نیاز دارند و باید آن را ضمیمه برنامه خود کنید و همچنین در ویندوزهای قدیمی تا نسخه ۸.۱ فایل سرآیند winsock.h و در ویندوزهای جدید باید Winsock2.h را ضمیمه فایل برنامه خود کنید
'''توضیح :''' این برنامه همانند برنامه قبلی نوشته شده است با این تفاوت که نوع داده short را انتخاب نمودهایم که ۲ بایت است و یک متغیر دیگر rev مخفف reversed اعلان نموده و دادههای خود را با ntohs در آن ذخیره نمودهایم و سپس مقدار rev را در خروجی خطدستوری چاپ نمودهایم . اگر مقادیر فایل را ۲ بایت به ۲ بایت به مبنای ۱۰ تبدیل کنید خواهید دید که ارقام و مقادیر صحیح و درست هستند و دیگر برعکس نیستند
== تابع fwrite ==
تابع fwrite سرنام file write به معنی « فایل را بنویس » دادههای تحویل داده شده به تابع را داخل یک فایل می نویسد . شکل کلی ایجاد تابع fwrite بدین صورت می باشد :
{{چپچین}}
fwrite(const void * ptr, size_t size, size_t nmemb, FILE * fp);
{{پایان چپچین}}
یک داده اشارهگر به اندازه بلوکهای بایتی size و به تعداد nmemb در داخل فایل fp نوشته می شود . تابع fwrite در صورت موفقیتآمیز بودنِ عملکرد خود تعداد nmemb را باز خواهد گرداند و در غیر این صورت پیام خطایی را خواهد فرستاد که توسط تابع ferror می توانید ایراد را پیدا کرده و رفع کنید . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
FILE * fp;
int num[100];
int number;
fp = fopen("myfile.bin", "wb");
for (number = 0; number < 100; ++number)
{
num[number] = number;
}
fwrite(num, 4, 100, fp);
fclose(fp);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
'''توضیح :''' فایل fp آماده ساختن شده است . یک آرایه از نوع متغیر صحیح با ۱۰۰ عنصر و با نام num اعلان شده است . همچنین یک متغیر صحیح با نام number اعلان شده است . تعیین کردهایم که فایلی که می خواهیم به صورت عددی بنویسیم myfile.bin نام دارد و باید ساخته شود و یا بازنویسی شود . با یک حلقه for متغیر number به عنوان اندیس num از مقدار ۰ شروع کرده و تا ۹۹ ادامه می یابد و البته قبل از اجرای حلقه number یک بار افزایش خواهد یافت چون عملگر افزایش پیش از number نوشته شده است . num[0] مقداری نمی گیرد ، بنابراین توسط کامپایلر مقدار 0 را خواهد گرفت . در چهار بایت بعدی num[1] برابر مقدار 1 است و سپس 2 و الی آخر . تابع fwrite متغیر آرایهای num را که ۱۰۰ عنصر ۴ بایتی دارد را هر ۴ بایت به ۴ بایت ، ۱۰۰ بار در فایل fp که همان myfile.bin است می نویسد . سپس فایل را بسته و تابع main را با موفقیت به پایان می رسانیم . برای مشاهده نتیجه ، یک پیرایشگر فایل یا همان پیرایشگر هگزادسیمال ( Hex Editor یا همان Hexadecimal Editor ) نیاز دارید که برای تمام سیستم عاملها موجود است
== تابع ungetc ==
شکل کلی فراخواندن تابع کتابخانهای ungetc که سرنام unget character می باشد به معنی کاراکتر را نگیر بدین صورت است :
{{چپچین}}
ungetc(int ch, FILE * fp);
{{پایان چپچین}}
تابع ungetc بر خلاف getc عمل می کند و تضمین شده است که حداقل یک کاراکتر را که وارد یا خوانده شده است به جریان داده یا جریان فایل بفرستد تا آماده خواندن شود ( دقت کنید که برخی به کارگیرندهها تعداد بیشتری را می فرستند که به ترتیب عکس ذخیره می شود ، یعنی آخرین کاراکتر فرستاده شده ، اولین کاراکتر برای جریان داده یا جریان فایل است که خوانده شود ) همچنین ungetc تنها ورودی getc را به جریان داده و یا فایل باز نمی گرداند و شامل دیگر گیرندهها نظیر scanf نیز می شود . مهم است بدانید که کامپایلر ، کاراکتر تعریف شده توسط ungetc از نوع صحیح int را به نوع داده unsigned char تبدیل می کند . شما می توانید به جای نوشتن متغیری جهت فرستاده شدن به جریان ، یک کاراکتر نوشتاری را نیز بفرستید . نتیجه هر دو این است که زمانی که یک تابع بخواهد از جریان ورودی داده یا فایل ، کاراکتری را بخواند ، کاراکتر فرستاده شده از ungetc را جهت نوشتن به خروجی می فرستد . تابع ungetc در صورت موفقیتآمیز بودن عملکرد خود ، کاراکتری را که به جریان داده و یا فایل فرستاده است ، باز می گرداند و در غیر این صورت مقدار EOF را . اگر ch مقدار EOF را بگیرد ، تنها EOF را باز می گرداند که البته طبق استاندارد نباید به ungetc مقدار EOF را فرستاد . کاراکتری که شما با ungetc بازگشت می زنید برای جریان ، لازم نیست همان کاراکتری باشد که بار آخر ، توسط جریان خوانده شده است و در واقع ضرورتی ندارد که کاراکترهایی را از جریان داده بخوانید که قبل از آن توسط ungetc بازگشت خورده و خوانده نشدهاند . اما این کار در نوشتن برنامه تقریباً بیهوده و عجیب است . معمولاً از ungetc برای نخواندن یک کاراکتر که از همان جریان داده یا فایل برای خواندن استفاده شده ، استفاده می شود . شما مجاز به چند بار استفاده مکرر از ungetc به صورت پشت سر هم بدون تابعهای خواندن از ورودی استاندارد ( صفحه کلید Keyboard ) یا فایل نیستید . اما برخی به کارگیرندهها این اجازه را می دهند . بازگرداندن کاراکترها توسط ungetc فایل را تغییر نمی دهد . اگر از یک تابع جهت تغییر مکان خواندن فایل مثل fseek یا fseeko یا rewind یا حتی fflush ( که در ادامه خواهند آمد ) استفاده شود ungetc نادیده گرفته می شود . نخواندن یک کاراکتر توسط ungetc در فایلی که به انتهای خود رسیده ، علامت انتهای فایل را پاک می کند چون یک کاراکتر را جهت ورود آماده می کند ولی بعد از آنکه کاراکتر را خواندید اگر دوباره بخواهید بخوانید با انتهای فایل EOF مواجه خواهید شد . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include<stdio.h>
int main(void)
{
int ch = 0;
FILE * fr;
fr = fopen("alphabet.txt", "r");
while(ch != EOF)
{
ch = getc(fr);
putchar(ch);
ungetc(ch, fr);
printf("\n%c", ch);
break;
}
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
'''توضیح :''' یک متغیر که قرار است نقش یک کاراکتر را ایفا کنید با نام ch تعریف کردهایم . فایل fr را آماده ایجاد نمودهایم . سپس توسط تابع fopen فایل alphabet.txt را که در همین صفحه ایجاد کردیم ، چهت خواندن باز می کنیم . سپس حلقه while تا زمانی که به پایان فایل نرسیدهایم ch را توسط getc از فایل fr دریافت می کند و سپس آن را چاپ می کند . تابع ungetc آخرین کاراکتر خوانده شده را به جریان می فرستد . و بعد از آن با تابع printf یک بار خط را شکسته و آخرین مقدار باقیمانده در جریان را که همان A می باشد چاپ می کند . سپس حلقه را می شکنیم چرا که در صورتی که آن را نشکنیم ، مقداری که توسط ungetc به جریان ورودی می فرستد باقی می ماند و تا بی نهایت چاپ می شود A در صورتی که حالا فقط ۲ A در خطهای جداگانه داریم
'''نکته :''' اگر یک یا چند بار دیگر تلاش کنید تا ch را چاپ کنید باز هم با مقدار A رو به رو خواهید شد ؛ چرا که در ذخیرهگاه جریان داده یا فایل ، A ذخیره شده است و ungetc آن را به ذخیرهگاه ( buffer ) که در ادامه نوشته خواهد شد فرستاده است
== تابع fflush ==
شکل کلی فراخواندن تابع fflush سرنام file flush به معنی فایل را خالی کن بدین صورت می باشد :
{{چپچین}}
fflush(FILE * stream)
{{پایان چپچین}}
در کرنل سیستم عامل قسمتی وجود دارد که ذخیرهگاه جریان ورودی/خروجی دادهها و فایلها می باشد که به آن بافر Buffer گفته می شود . با بسته شدن فایل یا خروجی موفقیتآمیز برنامه خود به خود بافر ، تخلیه می شود اما گاهی ممکن است برنامه دچار اشکال شود و متوقف گردیده و بدین صورت فایل نوشته نشود . در این صورت ، اگر شما از تابع کتابخانهای fflush استفاده کرده باشید ، فایل بر روی دیسک و یا خروجی استاندارد نوشته خواهد شد . در استاندارد C تابع fflush برای ورودی ، تعریف نشده است ( و فقط برای خروجی فایل است ) ولی برخی از پیادهسازها از آن پشتیبانی می کنند . اما قبل از اینکه برای ورودی از آن استفاده کنید ، راهنمای کامپایلر خود را مطالعه کنید ؛ چرا که ممکن است با یک رفتار تعریفنشده مواجه شوید . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main()
{
int c;
FILE * fr;
fr = fopen("alphabet.txt", "r");
c = getc(fr);
ungetc(c, fr);
c = getc(fr);
printf("Character read after ungetc: %c\n", c);
fflush(fr);
c = getc(fr);
printf("Character read after fflush: %c\n", c);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال بالا یک کاراکتر از فایل الفبا یک بار خوانده می شود . سپس توسط ungetc به ذخیرهگاه ( بافر ) فرستاده می شود . دوباره کاراکتر را دریافت کرده و آن را در خروجی خطدستوری چاپ می کنیم . حالا از تابع fflush برای خالی کردن ذخیرهگاه استفاده می کنیم و بار دیگر از فایل می خوانیم و آن را در خروجی خطدستوری چاپ می کنیم که عملاً هیچ چیز نیست . چون ذخیرهگاه خالی شده است ( یعنی ungetc بی اثر شده است )
مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int * program_crash = 0;
int main(void)
{
FILE * fp;
fp = fopen("testfile.txt", "w");
printf("Enter a number : \n");
int num = 0;
scanf("%d", &num);
fprintf(fp, "The number is : %d\n", num);
fflush(fp);
*program_crash = 5;
fclose(fp);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال بالا یک اشارهگر خالی تعریف نمودهایم . سپس فایلی را با نام testfile.txt به معنی فایل امتحانی با پسوند txt سرنام text به معنی متن ساده آماده نوشتن کردهایم . سپس در خروجی خطدستوری ، چاپ نمودهایم تا کاربر یک عدد را وارد کند . عدد را دریافت نموده و سپس توسط تابع fprintf در فایل مورد نظر نوشتهایم : The number is و سپس عدد وارد شده توسط کاربر را که همان num می باشد در فایل خواهیم نوشت به معنی عدد وارد شده شما اینقدر می باشد . پس از آن ذخیرهگاه را تخلیه نمودهایم تا هر آنچه در ذخیرهگاه فایل موجود است نوشته شود . سپس به اشارهگر program_crash مقدار غیر استاندارد 5 را دادهایم که مجاز به این کار نیستیم ( مراجعه شود به مبحث اشارهگرها در فصل دادهها ) و برنامه متوقف می شود . اما فایل ما با موفقیت نوشته شده است و شما می توانید آن را در یک پیرایشگر متن مشاهده کنید . تابع fflush در صورت موفقیتآمیز عمل کردن مقدار 0 را باز می گرداند و مقدار EOF نشانگر وجود یک اختلال است که موفقیتآمیز عمل نکرده است . با نوع داده ماکروی errno می توانید مقادیر اضافهتری دریافت کنید که نشان می دهد خطای ایجاد شده از کجاست تا آن را بر طرف کنید
'''نکته :''' پیام خطای Segmentation Fault که به نام Core Dump نیز معروف است زمانی رخ می دهد که بر روی حافظه ضروری کرنل بخواهیم چیزی بنویسیم و یا دادهای را وارد حافظه کنیم که اندازه آن بزرگتر از مقدار حافظه می باشد
== تابع remove ==
این تابع کتابخانهای ، همان طور که از اسمش پیداست فایلی را که به آن بفرستیم ، حذف می کند . شکل کلی ایجاد تابع remove بدین صورت می باشد :
{{چپچین}}
remove(const char* filename);
{{پایان چپچین}}
داخل جفت پرانتزهای باز و بسته تابع ، یک رشته می نویسیم که نام فایلی است که می خواهیم حذف شود . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
remove("testfile.txt");
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
حتماً به یاد دارید که یک فایل در دایرکتوری کامپایلر ( فولدر کامپایلر ) به نام testfile.txt ایجاد نمودیم . حال اگر برنامه بالا را بنویسید و آن را کامپایل کرده و اجرا کنید ، فایل مذکور حذف می شود . تابع remove در صورت موفقیتآمیز بودن عملکرد خود مقدار 0 را باز می گرداند و یک مقدار غیر 0 در صورت وجود اختلال . با استفاده از نوع داده ماکروی errno می توانید مقادیر اختلال و مشکل را دریافت نموده و اختلال را رفع کنید
== تابع rename ==
تابع کتابخانهای rename نیز همان طور که از نامش پیداست ، برای یک فایل یا دایرکتوری ( فولدر ) ، نام جدیدی را که به آن دستور دادهایم قرار می دهد و نام آن را عوض می کند . شکل کلی ایجاد تابع rename بدین صورت می باشد :
{{چپچین}}
rename(const char * oldfilename, const char * newfilename);
{{پایان چپچین}}
ابتدا نام فایلی را که موجود است می نویسیم و سپس نام فایل جدیدی را که قرار است پس از تعویض داشته باشد می نویسیم . این تابع ، در صورت عملکرد موفقیتآمیز خود مقدار 0 را باز می گرداند و در صورت اختلال مقدار دیگری را که البته با نوع داده ماکروی errno با مقدار بازگردانده شده ما می توانیم اختلال را بر طرف کنیم . دقت کنید که برخی پیادهسازها و سیستم عاملها به شما اجازه می دهند تا در صورتی که آدرسی دیگر ، نسبت به فایل موجود بنویسید ، آن را نام نویسی جدید نمایند و آن را انتقال دهند به دایرکتوری و آدرس داده شده در حالی که مابقی خطا می گیرند ؛ همین طور برخی اجازه می دهند تا اگر نامی که می خواهید بدهید در دایرکتوری موجود است آن را جایگزین فایل مشابه کنید و مابقی این اجازه را نمی دهند و خطا می گیرند . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main()
{
rename("oldfile.txt", "newfile.txt");
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
یک فایل متنی با نام oldfile ایجاد کرده و در صورت تمایل ، داخل آن ، متنی بنویسید و سپس برنامه بالا را نوشته و کامپایل کرده و اجرا کنید . نام آن به newfile.txt تغیییر پیدا خواهد نمود
== تابع fseek ==
تابع fseek سرنام file seek به معنی جستجو در فایل ، جهت اشاره به قسمت معینی از فایل است که بخواهیم در آن چیزی بنویسیم یا آن را بخوانیم . شکل کلی ایجاد تابع fseek بدین صورت می باشد :
{{چپچین}}
fseek(FILE * filepointer, long int offset, int position);
{{پایان چپچین}}
تابع fseek ابتدا اشارهگر فایل را پذیرا می باشد ؛ سپس باید تعداد جایگاهی که می خواهیم جا به جایی در فایل صورت بگیرد (offset) را می نویسیم و در پایان مقادیر از پیش تعیین شده ( position ) استاندارد فایل را می نویسیم که در هر دفعه فقط می تواند یکی از مقادیر زیر باشد :
{{چپچین}}
SEEK_SET
{{پایان چپچین}}
برای رفتن به ابتدای فایل
{{چپچین}}
SEEK_CUR
{{پایان چپچین}}
سرنام Seek Current که می شود همان جایی که فایل در حال استفاده بوده است ، به همان جا اشاره کند و فایل را آماده استفاده نماید
{{چپچین}}
SEEK_END
{{پایان چپچین}}
که به پایان فایل می رود
'''نکته :''' در صورتی که به ابتدای فایل بروید و بعد مقداری را بدهید که به عقب بازگردید ( یعنی عدد منفی بنویسید ) اجرای تابع ناموفق خواهد بود ؛ ضمناً اگر به انتهای فایل بروید و بخواهید مقداری بدهید که به جلوتر برود و دادههایی را بنویسید طبق استاندارد به انتهای فایل ، مقادیر تهی ( 00 در شانزده شانزدهی Hexadecimal ) و مقادیر متناظر در مبناهای دیگر به آخر فایل اضافه می شود
'''دقت کنید :''' بهتر است در صورتی که نمی خواهید عدد خیلی بزرگی که در نوع داده بلند long جا می شود را بنویسید حتماً از تعیین کننده نوع L جهت تعیین بزرگی عدد استفاده کنید و توصیه می شود حتی برای اعداد بزرگ نیز استفاده کنید تا دچار خطایی نشوید
تابع fseek در صورت موفقیتآمیز عمل کردن ، مقدار 0 را باز می گرداند و در صورت بازماندن از عملکرد درست ، مقدار غیر صفر را باز می گرداند
مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
FILE * fp = fopen("test.txt", "r");
fseek(fp, 5L, SEEK_SET);
char str[15];
fgets(str, 15, fp);
printf("%s\n", str);
fclose(fp);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
یک فایل متنی را با متن ! This is a test file ایجاد کنید ( در صورت تمایل از متن دیگری استفاده کنید ) و حتماً فایل را در دایرکتوری و یا فولدری که برنامه کامپایل می شود ذخیره کنید ؛ در غیر این صورت در باز کردن فایل ، آدرس آن را بنویسید . سپس قطعه کد بالا را در یک فایل با پسوند c ذخیره کرده و پس از کامپایل اجرا کنید . فایل test.txt جهت خوانده شدنِ متنی ، باز شده است . سپس تابع fseek به ابتدای فایل رفته و ۵ کاراکتر ( و در فایلهای دودویی ، بایت ) به جلو می رود . آرایه کاراکتری str که همان رشته می باشد با ۱۵ عنصر اعلان شده است . سپس توسط تابع fgets از رشته مورد نظر ۱۵ کاراکتر را از فایل fp که همان فایل test.txt می باشد خواندهایم و آن در در خروجی خطدستوری چاپ کردهایم . در پایان ، فایل خودمان را بستهایم . اگر این قطعه کد را کامپایل و اجرا کنید با متن ! is a file مواجه خواهید شد ( چرا که This چهار کاراکتر دارد و جلوی آن نیز یک فاصله خالی وجود دارد که می شود ۵ تا و ما ۵ کاراکتر در فایل ، جلو رفتهایم و کاراکترهای قبلتر خوانده نشدهاند )
== تابع ftell ==
تابع ftell سرنام file tell به ما جایی که در حال حاضر ، فایل تعیین شده ، قرار دارد ( برای نوشتن یا خواندن ) اعلام می کند . شکل کلی ایجاد تابع ftell بدین صورت می باشد :
{{چپچین}}
ftell(FILE * filepointer);
{{پایان چپچین}}
تابع ftell در صورت موفقیت آمیز بودن عملکرد خود ، شماره بایتی که فایل در حال استفاده است را باز می گرداند و در صورت عملکرد ناموفق مقدار منفی یک را یعنی 1- . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main ()
{
printf("Enter file name :\n");
char name[200];
scanf("%s", name);
FILE * fp;
fp = fopen(name, "rb");
fseek(fp, 0L, SEEK_END);
long size = ftell(fp);
printf("%ld\n", size);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال بالا از کاربر خواستهایم تا نام فایل را وارد کند . آرایه کاراکتری name با ۲۰۰ عنصر اعلان شده تا نام فایل ، در آن ذخیره شود . با تابع scanf نام را از کاربر می گیریم . سپس ماکروی نوع داده FILE یک اشارهگر فایل را با نام fp آماده ایجاد شدن کرده است . با تابع fopen اشارهگر فایل fp فایلی را با نام name برای خوانده شدن دودویی ( باینری ) باز می کند . با تابع fseek به انتهای فایل می رویم و پیش روی نیز نمی کنیم ( 0L ) سپس چون نوع داده تاع ftell از نوع بلند long است یک داده بلند با نام size ایجاد نمودهایم تا وقتی به انتهای فایل رفتیم و جایگاه اشاره به فایل را بررسی نمودیم ، به این شکل ، اندازه ( size ) فایل را به دست بیاوریم . در پایان با printf همان اندازه را در خروجی خطدستوری ، چاپ نمودهایم . یکی از متداولترین استفادههای ftell میزان عملیات بر روی فایل است ؛ عملیاتی مثل کپی کردن . وقتی کپی می کنید مدام با حلقه هم می خوانید و هم هر چه نوشتید بررسی می کنید تا ببینید چند در صد فایل ، نوشته شده است ( نسبت به اصل فایل که می خواهید آن را کپی کنید و اندازه آن را به دست آوردهاید )
== تابع rewind ==
تابع کتابخانهای rewind به معنی بازگرد به ابتدا ، جهت بازگرداندن اشارهگر جریان فایل به ابتدای آن است . شکل کلی فراخوانی تابع rewind بدین صورت است :
{{چپچین}}
rewind( FILE * filepointer );
{{پایان چپچین}}
مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main()
{
FILE * fp;
fp = fopen("mytext.txt", "r");
int text;
while((text=fgetc(fp)) != EOF)
{
printf("%c", text);
}
rewind(fp);
text=fgetc(fp);
printf("Read character is : %c\n", text);
fclose(fp);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال بالا ، فایل متنی mytext که قبلاً آن را ایجاد نمودیم ( با پسوند txt ) را جهت خواندن ، باز می کنیم . سپس یک صحیح با شناسه text اعلان نمودهایم تا با تابع fgetc تا زمانی که به انتهای فایل نرسیدهایم آن را بخوانیم و با تابع printf آن را در خروجی خطدستوری ، چاپ کنیم . سپس به ابتدای فایل برگشته ( توسط همین تابع ، یعنی rewind ) و یک کاراکتر را که اولین آن خواهد بود میخوانیم و آن را با printf در خروجی خطدستوری ، چاپ میکنیم که همان H است . سپس فایل را بسته و تابع اصلی برنامه ( main ) را با موفقیت به پایان می رسانیم
'''دقت کنید :''' تابع rewind هیچ مقداری را باز نمی گرداند ( چه در صورت موفقیت و چه در صورت وجود خطا ) و همچنین تمام دادههای پیدا کردن خطا در عملکرد آن و خواندن یا نوشتن فایل را پاک می کند . بنابراین توصیه می شود که برای بازگشتن به ابتدای فایل نیز همچنان از fseek استفاده کنید
== تابع ferror ==
تابع کتابخانهای ferror سرنام find error به معنی خطا را بیاب ، اگر در جریان داده فایل ، هنگام خواندن یا نوشتن ، خطایی رخ دهد مقداری را بازگردانده و نشانگر خطا را با مقداردهی ماکروی errno تعیین می کند تا برنامهنویس بتواند خطا را برطرف کند . تابع ferror در صورت موفقیتآمیز بودن عملکرد خود ( یعنی خطایی در جریان داده فایل موجود نباشد ) ، مقدار 0 را باز میگرداند و در غیر این صورت ( یعنی وجود خطا ) مقداری غیر 0 را باز خواهد گرداند . شکل کلی فراخوانی تابع ferror بدین صورت است :
{{چپچین}}
ferror(FILE * stream);
{{پایان چپچین}}
مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main()
{
FILE * fp;
fp = fopen("myexample.txt", "w");
if (fp == NULL)
{
printf("File doesn't exist\n");
return 1;
}
fputs("This is an example\n", fp);
fclose(fp);
fputs("This text won't be written on file\n", fp);
if (ferror(fp))
printf("Error during writing to file\n");
fp = fopen("myexample.txt", "a");
fputs("This will append to the end of file\n", fp);
if (ferror(fp))
printf("Error during writing to file\n");
else
printf("The writing operation was successful\n");
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال بالا در هنگام کامپایل ، احتمالاً کامپایلر به شما هشدار خواهد داد که اشارهگر فایل ، پس از بسته شدن فایل ، مورد استفاده قرار گرفته است . اما این مثال ساده ، فقط جهت درک کارآمدی تابع ferror می باشد . '''توضیح :''' ابتدا با اشارهگرِ نوع داده FILE ، فایل fp را آماده ایجاد شدن نمودهایم . سپس fp فایلی متنی را با نام myexample.txt جهت ایجاد و نوشتن ، بازکرده است . چک کردهایم که اگر فایل به هر دلیلی موجود نیست ( NULL ) پیغام خطای فایل موجود نیست را در خروجی خطدستوری ، چاپ کند و برنامه با عدم موفقیت ، به اتمام برسد . سپس داخل فایل خود نوشتهایم This is an example یعنی این یک مثال است و خط را شکستهایم . سپس فایل را بستهایم و نوشتهایم This text won't be written on file یعنی این متن در فایل نوشته نخواهد شد ( چرا که فایل را بستهایم و دیگر نمیتوانیم در آن ، بنویسیم یا حتی آن را بخوانیم ) . سپس با دستور if چک کردهایم که اگر ferror مقداری دارد ( که یعنی خطایی رخ داده ) در خروجی خطدستوری ، چاپ کنید : خطایی در حین نوشتن در فایل وجود دارد . ( چون فایل ، بسته شده است ) که همین اتفاق ، رخ خواهد داد . سپس دوباره فایل را جهت اضافه نمودن ( a که همان طور که در بالاتر نوشتیم سرنام append است ) باز کردهایم و نوشتهایم : This will append to the end of file یعنی این متن در ادامه فایل ، اضافه خواهد شد . سپس دوباره با تابع ferror چک کردهایم که آیا خطایی وجود دارد یا خیر که در صورت وجود خطا چاپ کند : Error during writing to file یعنی در هنگام نوشتن در فایل ، خطایی رخ داده است و خط را بشکند اما خطایی وجود نخواهد داشت ( مگر اینکه فایل را پاک کنید یا قفل کنید یا سیستم عامل شما مخصوصاً در صورت آلوده بودن ، فایل را قفل کند ) و در غیر این صورت چاپ کند : The writing operation was successful یعنی عملیات نوشتن با موفقیت ، انجام شد . سپس برنامه با موفقیت به پایان می رسد
'''دقت کنید :''' در صورتی که چک نکنید اشارهگرِ فایل ، تهی است ( NULL ) و ferror با خطای NULL مواجه شود ، رفتاری تعریفنشده بروز خواهد داد و البته برخی کامپایلرها به جدای از استاندارد ، ماکروها و توابعی را در نظر گرفتهاند تا این خطا را شناسایی کرده و بر طرف کنید ولی بهتر است همیشه در ابتدا چک کنید که فایل موجود است و اشارهگرِ فایل ، تهی نیست
'''دقت کنید :''' تابع ferror خطای جریان داده آخرین فایل باز شده را بررسی کرده و نشانگر خطا را مقداردهی میکند و در صورتی که فایل را ببندید یا از تابع rewind یا تابع clearerr که به معنی خطا را پاک کن می باشد ، استفاده کنید نشانگر خطا خالی می شود ( تابع clearerr را در ادامه همین مبحث ، می نویسیم )
== ماکروی مقدار EOF ==
ماکروی مقدار EOF سرنام End Of File به معنی پایان سند یا همان فایل ، مقداری است که اگر بازگردانده شود ؛ یعنی تابع ( مثل getc یا fread ) جهت خواندن سند ، به انتهای آن رسیده است و یا بعضاً در همان تابعها خطایی در خواندن فایل ایجاد شده است . مقدار بازگردانده شده توسط EOF طبق استاندارد باید یک صحیح منفی باشد اما مقدار دقیق آن ، تعیین نشده است اما بسیاری از پیادهسازها ( کامپایلرها ) مقدار منفی یک 1- را باز میگردانند . برنامهنویسان میتوانند از ماکروی EOF جهت خواندن کامل و صحیح اسناد یا همان فایلها استفاده کنند که تا به همین جای مبحث چند بار از آن استفاده نمودهایم و شما نیز آنها را دیدهاید . ماکروی EOF هم در stdio تعریف شده است و هم در stdlib که موضوع بعدی کثاب است و فرقی با هم ندارند ( تعریف EOF )
مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include<stdio.h>
int main(void)
{
FILE * fr = fopen("test.txt", "r");
int ch;
ch = getc(fr);
while(ch != EOF)
{
putchar(ch);
ch = getc(fr);
}
printf("\n");
fclose(fr);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در مثال بالا که همانند مثال دیگری در همین مبحثِ stdio میباشد یک کاراکتر از فایل test.txt را که پیشتر ایجاد نمودیم می خوانیم و سپس توسط حلقه while تا زمانی که مقدار متغیر ch انتهای سند نیست ، مرتب یک کاراکتر که دریافت شده را در خروجی خطدستوری چاپ می کنیم و سپس کاراکتر بعدی را می خوانیم تا جایی که به انتهای سند می رسیم که شرط حلقه برقرار نیست و حلقه می شکند که در خروجی خطدستوری چاپ می شود : ! This is a test file که محتوای سند test.txt می باشد ( که پیشتر آن را در همین مبحث ایجاد نمودیم ) . سپس خط را شکسته ، پرونده را میبندیم و تابع main را با موفقیت به پایان می رسانیم
'''دقت کنید :''' استفاده از تابعهای rewind و fsetpos و fseek یا clearerr ماکروی مقدار EOF را پاک می کنند
== تابع feof ==
تابع feof سرنام find end of file ماکروی مقدار EOF را در تابعهایی که آن را باز می گردانند بررسی می کند تا پیدا کند که آیا واقعاً به پایان فایل رسیدهایم یا نه . اگر به پایان فایل رسیده باشیم ، مقداری غیر 0 را باز می گرداند و در غیر این صورت مقدار 0 را . دقت کنید که یک خطای مرسوم وجود دارد که برای کنترل یک حلقه از ()feof! استفاده می شود تا بررسی شود که تا زمانی که به پایان فایل نرسیدهایم ، توسط تابعهای مربوطه ، فایل خوانده شود اما چون feof بررسی می کند که بعد از انتهای فایل ، می شود خواند یا نه ، این خطر وجود دارد که یک داده اضافه و زباله ، خوانده شود و یا خطایی ایجاد شود که شما را گمراه کند . شکل کلی فراخوانی تابع feof بدین صورت می باشد :
{{چپچین}}
feof(FILE * stream);
{{پایان چپچین}}
که اشارهگر فایل را به آن می فرستیم ( فایلی که توسط برنامه ، باز شده و در حال خوانده شدن است )
مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include<stdio.h>
int main(void)
{
FILE * fr = fopen("test.txt", "r");
int ch;
ch = getc(fr);
while(1)
{
if(feof(fr))
break;
putchar(ch);
ch = getc(fr);
}
fclose(fr);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
'''توضیح :''' فایل fr را با تابع fopen که فایل test.txt می باشد جهت خوانده شدن به صورت متنی ، باز نمودهایم . سپس یک کاراکتر از آن را خواندهایم . بعد از آن با حلقه بی نهایت while ( که مقدار 1 را در آن گذاشتهایم تا همیشه صحیح و برقرار باشد ) ابتدا بررسی نمودهایم که اگر feof مقدار دارد ( چون fr را می خواند ) که یعنی به پایان فایل رسیدهایم ( مقدار غیر 0 ) بشکند که اگر شرط برقرار نباشد ادامه خواهد یافت و کاراکترِ خوانده شده را در خروجی خطدستوری نمایش خواهد داد و سپس به سراغ کاراکتر بعدی می رود که این حلقه یک جا به پایان فایل می رسد و feof مقدار 0 را باز می گرداند . در ادامه فایل fr را بسته و تابع اصلی برنامه را با موفقیت به پایان رساندهایم
== تابع clearerr ==
تابع clearerr سرنام clear error به معنی نشانگر خطا را خالی کن یا پاک کن ، مقدار خطای errno برای نوع خطای خواندن یا نوشتن در فایل و EOF برای انتهای فایل را برای اشارهگرِ فایلی که به آن فرستاده شده ، خالی و پاک می کند . زمانی که در خواندن یا نوشتن فایل ، خطایی رخ می دهد یا به انتهای فایل می رسیم نشانگر خطا و انتهای فایل ( به ترتیب برای هرکدام یعنی errno و EOF ) ایجاد و مقداردهی می شوند ( به اصطلاح سِت می شوند ) ، برای اینکه بعد از رفع خطا و یا بعد از رسیدن به انتهای فایل ، در ادامه فایلِ مورد استفاده ، دادههایی را بنویسیم و دوباره خطایابی کنیم یا بررسی کنیم که به انتهای فایل رسیدهایم یا نه باید نشانگر خطای فایل یا انتهای فایل را پاک کرده و دوباره به کار خود ادامه دهیم که این کار را می توانیم توسط تابع clearerr انجام دهیم . نشانگر خطا و یا انتهای فایل پس از مقدار یافتن در برنامه ، باقی می مانند و گفتیم که اگر فایل را ببندیم یا از fseek استفاده کنیم ، نشانگر خطا پاک می شود ؛ ولی این روش حرفهای برای پاک کردن و خالی کردن نیست ؛ چون بهتر است خطا یا انتهای فایل را ابتدا پیدا نموده ، رفع خطا کنیم و در ادامه فایل ، چیزی بنویسیم و سپس آنها را خالی کرده و به ادامه کار خود در مورد فایل بپردازیم که برای این کار بهتر است از تابع clearerr استفاده کنیم . تابع clearerr هیچ مقداری را باز نمی گرداند . شکل کلی فراخوانی تابع clearerr بدین صورت می باشد :
{{چپچین}}
clearerr(FILE * Stream);
{{پایان چپچین}}
مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include<stdio.h>
int main(void)
{
FILE * fr = fopen("test.txt", "r");
if(fr == NULL)
{
printf("File not found\n");
return 1;
}
int ch;
ch = getc(fr);
while(ch != EOF)
{
putchar(ch);
ch = getc(fr);
}
printf("We Reached EOF\n");
clearerr(fr);
if(feof(fr) != 0)
printf("EOF still set\n");
else
printf("EOF is cleared\n");
fclose(fr);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
'''توضیح :''' فایل test.txt را که پیشتر ایجاد نمودیم جهت خوانده شدن به صورت متنی ، باز می کنیم . چک می کنیم تا در صورت عدم وجود ، در خروجی خطدستوری ، چاپ شود : فایل موجود نیست و تابع main با خطا پایان یابد . متغیر ch را از نوع صحیح ایجاد نموده و یک کاراکتر از فایل خود را خوانده و در آن ذخیره می کنیم . سپس تا زمانی که به پایان فایل نرسیدهایم فایل test را به صورت کاراکتری ، یک به یک ، خوانده و در خروجی خطدستوری ، چاپ می کنیم . سپس چاپ کردهایم به پایان فایل رسیدهایم ( همان EOF ) سپس تابع clearerr را فراخواندهایم تا ماکروی علامت EOF پاک شود . سپس چک کردهایم تا اگر EOF وجود دارد و feof مقدار 0 ندارد چاپ شود EOF still set یعنی علامت پایان فایل همچنان سِت شده است و در غیر این صورت چاپ کند EOF is cleared یعنی علامت پایان فایل پاک شده است که همین طور است ؛ چون با clearerr ماکروی علامت EOF پاک شده است و feof مقدار 0 را می گیرد ( یعنی به پایان فایل نرسیدهایم که البته رسیدهایم و این تمرین مناسبی نیست ، مگر آنکه در ادامه سند یا همان فایل بخواهید متن یا مقادیر دیگری بنویسید ) سپس فایل را بسته و تابع main را با موفقیت به پایان رساندهایم
== ماکروی stderr ==
ماکروی stderr سرنام standard error یکی دیگر از ماکروهای استاندارد ورودی و خروجی همانند stdin و stdout است که برای چاپ پیام خطا در خروجی خطدستوری به کار می رود و می توان از تابعهایی که در خروجی فایل متنی می نویسند استفاده کرد تا به جای نوشتن خطا در فایل ، آن را در خروجی خطدستوری چاپ کند . همانند تابع perror سرنام print error که در همین مبجث آن را می نویسیم و مخصوص چاپ پیام خطاست و هیچ آرگومانی نمی پذیرد ، stderr نیز برای چاپ پیام خطاست . ما می توانیم هر متن خطایی را که خواستیم با stdout آن را چاپ کنیم اما تفاوت stdout و stderr در این است که stdout در بافر buffer سیستم عامل ، ذخیره می گردد اما stderr در بافر نوشته نمی شود و تنها در ترمینال سیستم عاملهای مبتنی بر یونیکس یا شبهیونیکس و خطدستور command prompt ویندوز وجود دارد و به محض بسته شدن آن ، تمام محتوای آن ، پاک می شود . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include<stdio.h>
int main(void)
{
fprintf(stderr, "This is an error\n");
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
توضیح این مثال بسیار ساده است و ما با تابع کتابخانهای fprintf که در فایل متنی می نویسد ، در خروجی خطدستوری ، چاپ کردهایم : این یک خطاست و خط را شکستهایم اما '''دقت کنید''' که تابع ، دیگر آرگومانی نمی تواند بپذیرد و به جای اشارهگر فایل خود می نویسیم stderr
== ماکروی نوع داده fpos_t و تابعهای fgetpos و fsetpos ==
در سیستم عامل قدرتمندی همچون گنو/لینوکس fseek که پیشتر آن را نشریح کردیم می تواند تعداد کاراکترها را نیز در فایل متنی بخواند و به همان جا اشاره کند . اما سیستم عاملهای دیگری نظیر ویندوز در گذشته این قابلیت را نداشتند . ضمناً برخی از فایلها حجمشان از تعداد بایتهای قابل ذخیره در یک صحیح بلند long int بیشتر است . برای همین در استانداردهای C 98/99 و نوینتر از آن ، نوع داده fpost_t به عنوان یک ماکروی نوع داده شیئ کامل تعریف شد که یک آرایه نیست و می تواند به یک رکورد اشاره کند ؛ '''نکته :''' در دانش برنامهنویسی ، یک آرایه ، مجموعهای از عناصرِ فقط یک نوع داده است اما یک رکورد می تواند مجموعهای از عناصرِ انواع مخلف باشد که هر کدام ، یک نام دارند و از طریق آن نام ، می توان به محتوای آن دسترسی پیدا کرد .
ماکروی نوع داده شیئ کامل fpost_t یک داده را اعلان می کند که به انتهای فایل اشاره می کند . پس از آن تابع fgetpos هر جا که در فایل بنویسیم یا از آن بخوانیم و داده اعلان شده را در آن ، قرار دهیم به داده اعلان شده مقدار می دهد و هر جا که تابع fsetpos را به همراه داده مقداردهی شده به کار ببریم ، اشارهگر فایل را به همان جا می برد . شکل کلی استفاده از این ماکرو و تابعها بدین صورت می باشد :
{{چپچین}}
fpos_t pos;
{{پایان چپچین}}
نام pos یک نام اختیاری برای fpos_t است که سرنام file position type و به معنی نوع جای فایل ، می باشد
{{چپچین}}
fgetpos(FILE *stream, fpos_t *pos);
{{پایان چپچین}}
تابع کتابخانهای fgetpos سرنام file get position به معنی جای فایل را به دست بیاور ، یک اشارهگر به فایل را به همراه داده اعلان شده توسط fpos_t می گیرد و آن را مقداردهی می کند . این تابع در صورت موفقیت آمیز بودن عملکرد خود ، مقدار 0 را باز می گرداند و در غیر این صورت مقداری دیگر را باز می گرداند و ضمناً متغیر خطایاب errno را مقداردهی می کند که مقدار آن در هر پیادهساز ، تعریف خود را دارد
{{چپچین}}
fsetpos(FILE *stream, fpos_t *pos);
{{پایان چپچین}}
تابع کتابخانهای fsetpos سرنام file set position به معنی جای فایل را قرار بده ( ست کن ) ، یک اشارهگر به فایل را به همراه داده مقداردهی شده توسط fgetpos می گیرد و نمایانگر یا همان اشارهگر فایل را به همان جا می فرستد . دقت کنید که پیش از استفاده از fgetpos باید با fgetpos جای فایل را تعیین کنید ، در غیر این صورت نمی توانید به درستی از آن استفاده کنید و در برنامه شما خطایی رخ می دهد چرا که جای فایل ، تعیین نشده است . این تابع ، در صورت موفقیتآمیز بودن عملکرد خود مقدار 0 را باز می گرداند و EOF را پاک می کند و ضمناً تمام کاراکترهایی که توسط ungetc به عقب رانده شدهاند را نادیده می گیرد و در غیر این صورت مقداری غیر از 0 را باز می گرداند و متغیر خطایاب errno را مقداردهی می کند
مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
FILE * fp;
fp = fopen("example.txt", "w+");
if(fp == NULL)
{
printf("Error during open file\n");
return 1;
}
fputs("1st sentence\n2nd sentence\n3rd Sentence", fp);
fpos_t pos;
rewind(fp);
char str[25];
fgets(str, sizeof(str), fp);
printf("1 : %s", str);
fgetpos(fp, &pos);
fgets(str, sizeof(str), fp);
printf("2 : %s", str);
fsetpos(fp, &pos);
fgets(str, sizeof(str), fp);
printf("After getting same position : %s", str);
fgetpos(fp, &pos);
fgets(str, sizeof(str), fp);
printf("3 : %s", str);
fclose(fp);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
:توضیح : در مثال بالا فایلی به نام example.txt را جهت نوشتن و خواندن متنی ، ایجاد نمودهایم . سپس در آن نوشتهایم : جمله اول ، جمله دوم و جمله سوم ؛ که در هر کدام خط را شکستهایم . سپس fpos_t یک داده را به نام pos اعلان کرده است که به انتهای فایل ، اشاره می کند . پس به ابتدای فایل باز می گردیم ( با تابع rewind ) . با نوشتن شماره ۱ ، جمله اول را در خروجی خطدستوری ، چاپ کردهایم .
:پس اشارهگر فایل به ابتدای خط دوم می رود و با fgetpos آن را مقداردهی کردهایم تا ابتدای خط دوم مقدار pos شود . خط دوم را خواندهایم و در خروجی خطدستوری ، چاپ کردهایم : ۲ : جمله دوم . سپس با fsetpos مقداری را که fgetpos تعیین کرده بود برای pos تعیین می کنیم که همان ابتدای خط دوم است و دوباره خط دوم را خوانده و در خروجی خطدستوری چاپ کردهایم : بعد از رسیدن به همان جا : خط دوم .
:ما به ابتدای خط سوم می رسیم اما هنوز pos مقدار دهی مجدد نشده است دوباره با fgetpos مقدار pos را به روزرسانی کردهایم که ابتدای خط سوم است و از فایل خود ، خط سوم را خوانده و در خروجی خطدستوری چاپ می کنیم : ۳ : جمله سوم .
:البته این کار ضروری نیست ، چون به خودی خود ، pos به ابتدای خط سوم اشاره می کند اما اگر بخواهیم حتما به جای خاصی از فایل برویم باید با fgetpos مقدار pos را به روزرسانی کنیم . در پایان فایل را بسته و تابع اصلی برنامه را با موفقیت به پایان می رسانیم
== نکته : میانگیری یا بافرینگ ==
بافرینگ ( Buffering ) یا با برگردان فرهنگستان به میانگیری به روشی می گویند که دادهها یا اجسام و موادّ در جایی به صورت موقت ، انباشه می شوند تا بعد از پردازش و یا پیرایش به جای دیگری فرستاده شوند که باعث دست نخوردگی و پایداری ( استیبل شدن Stable ) و یا تسریع در روند آن می شود . اما ما فعلاً فقط به میانگیری یا بافرینگ دادهها در علوم رایانه می پردازیم . میانگیری در علوم رایانه ۳ کاربرد دارد :
۱ - تسریع در روند پردازش دادهها و ورودی/خروجی : در همین کتاب و در همین مبحث بارها مثالهایی را از خواندن و نوشتن و کپی ( Copy کاپی ) کردن فایل نوشتهایم . در برخی از آنها یک بایت به یک بایت ( که عموماً به آن کاراکتر می گوئیم - در تابعهایی مثل fgetc و fputc - اما هر کاراکتری در استاندارد انسی ANSI که کاراکترست ASCII ازکی است را شامل می شود و به صورت دودویی هر مقداری را می توان خواند و نوشت ) خواندهایم و نوشتهایم . تقریباً تمام سیستم عاملها در هسته خود ( Core ) شامل کرنل Kernel و اجزاء کمکی آن ( Core Components ) میانگیر یا بافر ( Buffer ) دارند و عمل ورودی/خروجی ( I/O ) را تسریع می کنند اما اگر برنامه نویس یک بایت به یک بخواهد بخواند و بنویسید ، در زبان C به سیستم عامل تحمیل و دستور داده می شود تا به همان شکل عمل کند ( فراموش نکنید که زبان سی ، زبان اصلی اکثر کرنلهاست و تمام سیستم عاملها کتابخانههایی را برای اجرای برنامهها به زبان سی و/یا سیپلاسپلاس دارند - چه در زمانی که برای سیستم عامل کامپایل می کنید و چه یک برنامه نویس برای نوشتن کرنل خود از یک کامپایلر و کتابخانههای آن استفاده کند این تحمیل و دستور وجود دارد ) اما اگر به جای آن ، یک آرایه بسازیم که مثلاً هزار عنصر داشته باشد و یا ده هزار عنصر ، و بعد به اندازه آن از فایل ، بخوانیم و به همان اندازه بنویسیم در واقع میانگیری کردهایم و سرعت کپی کردن خود و یا هر نوع خواندن و نوشتن را بالا بردهایم
۲ - پیمانهای کردن دادهها و تنظیم سرعت : این روش در علوم بسیاری ، از جمله الکترونیک و مخابرات و همچنین همین علوم رایانه ، کاربرد پایدار کردن ( استیبل کردن Stabilization ) و تنظیم سرعت را دارد . نمی خواهیم از بحث خارج شویم ولی این مثال به درک نحوه میانگیر کردن کمک بزرگی می کند . در یاختههای مهرهداران و یا حتی دیگر جانداران پریاختهای ، در یاختههای مخصوصی در انباشتگاههای خودشان ( Buffer یا میانگیر ) اسید و باز ، انباشت می کنند تا در صورتی که خون و یا بدن جانور از حدی اسیدیتر شد و pH پهاش آن پائین آمد ، بازِ انباشت شده در خود را آزاد کنند و یا خلاف جهت آن ؛ اگر از حدی بازیتر شد و pH آن بالاتر رفت ، اسید خود را آزاد کنند که در این صورت اسید و باز با هم ترکیب میشوند ( و نمک و آب می سازند که نمک ، توسط تصفیه کننده خون ، مثل کلیهها در برخی از پستانداران ، دفع می گردد ) و در نتیجه پهاش pH خون و بدن ثابت باقی می ماند . در علوم رایانه و الکترونیک ، میانگیر کردن به همین شکل به پایداری عملکرد سیستم ، کمک می کند . به عنوان مثال ، پخش کردن ویدئو و یا صدا را در نظر بگیرید . کاربران قدیمی رایانه به خوبی به یاد خواهند داشت و یا حتی هم اکنون نیز ممکن است با چنین پدیدهای مواجه شوید که سرعت ارتبط شما با شبکه ( کانکشن Connection ) پائین باشد ( در گذشته اتصال به اینترنت اکثراً از طریق مودمهای تماسی Dial-Up امکانپذیر بود که سرعت بسیار بسیار پائینی داشت ) و شما بخواهید یک فایل ویدوئی را تماشا کرده و بشنوید و یا فایل صدایی ( صوتی ) را گوش بدهید . در چنین مواقعی اگر به اندازه سرعت شما قابهای ویدئو ( فریمها Frames - واحد سازنده هر ویدئو یا انیمیشن که پشت سر هم و با سرعت معین به تصویر متحرک تبدیل می شوند و به صورت متحرک دیده می شوند ) و یا نمونه-بیتها ( بیت سمپلها Bit Samples واحد سازنده هر فایل صدایی - یا همان صوتی ) را نشان دهد و/یا پخش کند شما نمیتوانید عملاً آن فایل را تماشا کرده و گوش دهید . برای همین برنامهنویسان ، فایل را میانگیر می کنند و هر مثلاً یک یا دو یا سه ثانیه از ویدئو یا صدا را انباشت میکنند و بعد از رسیدن به آن مقدار ، ویدئو و صدا را برای شما پخش می کنند یا اینکه فرض کنید سیستم شما چندان به روز و قدرتمند نیست و شما می خواهید یک فیلم سینمایی با کیفیت ۱۰۸۰ پیکسلی ( که ارتفاع قابهای آن - فریمهای آن - ۱۰۸۰ پیکسل و یا نزدیک به آن است ) تماشا کنید . اگر قرار باشد پخش کننده رسانه Media Player بخواهد کل فایل را رمزگشایی و سپس در حافظه موقت ( Memory که همان رم RAM است ) بارگذاری کند ( Loading ) سیستم شما یا قفل خواهد کرد و مجبور به راه اندازی مجدد سیستم خواهید شد یا اینکه اگر سیستم عامل شما قدرتمند باشد پس از چند ثانیه ، سیستم عامل ، برنامه را پایان می دهد ( Termination ) بنابراین پخش کنندههای رسانه یک یا دو دقیقه از فیلم و ویدئو را رمزگشایی ( دکود Decode ) می کنند و بر روی حافظه موقت بارگذاری می کنند و آن را پخش می کنند و حتی اگر بخواهید فیلم را ۵ دقیقه یا مثلاً نیم ساعت جلو ببرید ، یک یا دو دقیقه قبلی را از حافظه موقت پاک می کنند و سپس دوباره آن قسمت از فیلم و ویدئو را که شما دستور داده بودید پخش کند بارگذاری می کنند . به همین شکل ممکن است سرعت دستگاههای الکترونیکی رایانه ( که میانگیر کردن در خود الکترونیک نیز به کار می رود اما ما در اینجا به آن نمی پردازیم ) و یا در شبکههای مختلف رایانه مثل شبکه اینترنت و پروتکلهای آن ، تداخل پیش بیاید و سرعتهای دادهها نسبت به هم و یا میزبان/میهمان و یا حجم دادهها در آنها نسبت به سرعت میهمان بیشتر باشد ( و یا حتی بعضاً حجم درخواستهای میهمانها از سرعت میزبان بیشتر باشد ) در چنین مواقعی ، پیمانهای عمل کردن برنامهها و یا میانافزارها و سختافزارها ، کمک می کند تا کم کم ، ورودی دریافت شده و به خروجی فرستاده شود و چه سرعت ورودی کم یا زیاد باشد و یا سرعت خروجی کم یا زیاد باشد ، سامانه دچار مشکل و قفل شدن نمی شود
۳ - دادههای موقتی : یکی دیگر از کاربردهای میانگیر کردن ، ساخت یک داده موقتی است ( که این داده از هر نوعی و در هر اندازهای ممکن است باشد ) که دو کاربرد دارد : ۱ - بخواهیم همان زمان با ساخت داده موقت ، بر روی آن پردازش و پیرایش انجام دهیم . به عنوان مثال ، در گذشتهها پیرایشگرهای تصاویر رستر ( Raster Graphics گرافیکهای مبتنی بر پیکسل Pixel ) وقتی فایلی را باز می کردند پیرایشها را بر روی خود همان فایل انجام میدادند و اگر حتی پیرایشهای خود را ملغا ( Undo ) می کردید و آن را ذخیره ( Save ) می کردید باز هم فایل شما دستخوش تغییر قرار می گرفت ( چون تصویر ، پیرایش شده بود و فقط توسط رمزنگار برنامه مجدداً مانند اولش نوشته می شد اما اگر از یک فایل ادیتور یا همان هگزادسیمال ادیتور Hexadecimal Editor استفاده می کردید ، مشاهده می کردید که فایل تغییر پیدا کرده است ) به این روش ویرانگر یا Destructive گفته می شود . اما امروزه برنامههای پیرایشگر رستر به روش ناویرانگر Non Destructive عمل می کنند و هر فایلی که باز می کنید یک فایل کپی موقت ( Temporary ) از روی آن می سازند و بعد از رمزگشایی و بارگذاری بر روی حافظه تغییرات را بر روی آن اعمال می کنند و بدین صورت فایل شما دست نخورده باقی می ماند و هر وقت که خواستید می توانید آن را در فایلی جدید ذخیره ( Save ) و یا جایگزین همان فایل خودتان کنید . همین تکنیک در مورد پیرایش فایلهای ویدئویی نیز به کار می رود ۲ - گاهی نیاز پیدا خواهید کرد تا فایل موقتی بسازید و چند بار بر روی آن پردازش انجام دهید که غیر متوالی هستند . در این صورت فایل را میانگیر می کنید و هر موقع نیاز داشتید آن را پردازش کرده و به سراغ فایلهای دیگر می روید و یا کارهای دیگری انجام می دهید و سپس دوباره به پردازش فایل میانگیر شده خود ( Buffer ) باز می گردید
در مجموع ، میانگیر کردن و ساخت یک میانگیر ( بافر Buffer ) در نوشتن برنامههای شبکه و پروتکلهای آن ، پخش کنندههای رسانه ( میانافزاری و نرمافزاری ) و هسته سیستم عامل ، مخصوصاً کرنل آن در کنار بسیاری دیگر از بخشهای مهندسی نرمافزار و برنامهنویسی ، ضروری و حیاتی است
== تابع setbuf و ماکروی مقدار BUFSIZ ==
گاهی در برنامهنویسی پیشرفته ، امکان دستی ، تعیین کردن میانگیر یا بافر ناممکن و یا بسیار سخت است ( مخصوصاً در برنامهنویسی سطح پائین ) که ما هنوز به این مرحله نرسیدهایم . اما تابع قدیمی setbuf سرنام set buffer به معنی میانگیر را تعیین کن ، با ماکروی اندازه حداقل به اندازه BUFSIZ سرنام Buffer Size به معنی اندازه میانگیر ( بافر ) که امروزه منسوخ شده است و به جای آن در استاندارد سی C تابع setvbuf تعریف شده است ، می تواند میانگیر را برای شما ایجاد کند تا هم فایل را به صورت موقت در حافظه RAM نگهداری کنید و به پردازش آن بپردازید و هم عملیاتهای خواندن/نوشتن را پیمانهای می کند . دقت کنید : ۱ - تابع setbuf باید برای فایلی تعیین شود که باز شده است ۲ - تابع setbuf باید قبل از هر عملی بر روی فایل برای خواندن و نوشتن ، اعمال شود ۳ - اگر مقدار میانگیر را که باید تعیین کنید ، در یک حوزه محلی ، تعیین کنید پس از اتمام بلوکِ آن میانگیر ، همانند یک متغیر معمولی ، میانگیر و بافر ، خالی می شود و دیگر موجود نخواهد بود . اگر می خواهید میانگیر را توسط تابعهای زبان سی C و کامپایلر بسازید ، بهتر است آن مقدار آن را ( مثل مقدار BUFSIZ ) با حوزه سراسری تعیین کنید . در غیر این صورت برنامه شما رفتار تعریفنشدهای بروز خواهد داد ۴ - مقدار میانگیر (بافر ) ، طبق استاندارد باید حداقل به اندازه ماکروی مقدار BUFSIZ که در فایل سرآیند stdio تعریف شده است باشد ( استاندارد ، مقدار آن را تعیین نکرده است ولی در کامپایلری مثل GCC مقدار آن 8192 بایت است ) اگر کامپایلر شما از مقدار کوچکتر پشتیبانی نکند و شما مقداری کوچکتر تعیین کنید با خطا در برنامه مواجه خواهید شد
در صورتی که می خواهید فایل بزرگی را میانگیر کنید بهتر است مقداری بزرگتر از BUFSIZ استفاده کنید و باز هم بهتر است مقدار آن ، مقدار از توان ۲ باشد ؛ مثل : 16384 یا 32768 و ... ) . شکل کلی استفاده از تابع setbuf بدین صورت می باشد :
{{چپچین}}
setbuf(FILE *stream, char *buffer);
{{پایان چپچین}}
باید اشارهگر فایلی را که می خواهید میانگیر کنید را به آن بفرستید و یک آرایه کاراکتری با اندازه حداقل BUFSIZ تا به همان اندازه ، فایل شما را میانگیر کند . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
#include <time.h>
int main()
{
clock_t start, end;
double time_passed;
char buf[BUFSIZ];
start = clock();
FILE * fp, * fp2;
fp = fopen("post-1.jpeg", "rb");
fseek(fp, 0, SEEK_END);
long int size = ftell(fp);
fseek(fp, 0, SEEK_SET);
unsigned char fr[size];
setbuf(fp, buf);
fread(fr, size, 1, fp);
fclose(fp);
fp2 = fopen("copy.jpeg", "wb");
setbuf(fp2, buf);
fwrite(fr, size, 1, fp2);
fclose(fp2);
end = clock();
time_passed = ((double) (end - start)) / CLOCKS_PER_SEC;
printf("Program execution time: %lf seconds\n", time_passed);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در این برنامه از فایل سرآیند time که هنوز به مبحث آن نرسیدهایم استفاده نمودهایم . به معنی زمان می باشد و دارای تابعها و ماکروهایی برای تعیین زمان و سنجش آن می باشد . ابتدا توسط ماکروی clock_t دو متغیر به نام آغاز و پایان اعلان نمودهایم و هر دو را یک بار در آغاز برنامه و یک بار در پایان برنامه با تابع clock که زمان را تعیین می کند مقداردهی نمودهایم . '''دقت کنید :''' ما در این برنامه از دو روش فایلی را با نام post-1.jpeg میانگیر کردهایم . یک بار توسط پیمانه size که به اندازه فایل خودمان ( که شما میتوانید هر فایلی را که در دایرکتوریِ برنامه کامپایل شده خودتان قرار دارد بنویسید ) آن را خواندهایم و به همان اندازه نوشتهایم . یک بار هم توسط تابع setbuf آن را میانگیر و بافر کردهایم . در پایان برنامه مقدار زمان پایان برنامه را منهای مقدار زمان آغاز برنامه نموده و با دقت دو برابر اعشار در خروجی خطدستوری چاپ نمودهایم . دقت کنید که در این برنامه کارکرد setbuf به حداقل خود رسیده است چون به اندازه فایل ، خواندهایم و آن را در حافظه موقت ( RAM ) نوشتهایم سپس فایل را بر روی حافظه دائمی ( مثل H.D.D یا S.S.D ) نوشتهایم . اما اگر اندازه فایل بزرگتر از مقدار قابل سنجش می بود ( مثل نوشتن برنامه سامانه فایلبندی File System ) عملکرد setbuf با مقدار بززگ ، کاملاً چشمگیر می شد
== تابع setvbuf و ماکروهای IOFBF_ و IOLBF_ و IONBF_ ==
تابع setvbuf همانند تابع setbuf می باشد با این تفاوت که نوع میانگیر کردن و اندازه میانگیر ، در دست برنامهنویس است . شکل کلی فراخوانی تابع setvbuf بدین صورت می باشد :
{{چپچین}}
setvbuf(FILE * stream, char * buffer, int mode, size_t size);
{{پایان چپچین}}
ابتدا نام جریان فایل را می نویسیم ، سپس آرایه کاراکتری خود را و سپس نوع میانگیر کردن را که یکی از سه ماکروی نوشته شده است و در نهایت اندازه میانگیر کردن را . سه ماکروی نوشته شده که نوع میانگیر را تعیین می کنند بدین قرار هستند :
IOFBF_ سرنام Input/Output Full Buffer به معنی میانگیر کردن کامل ورودی/خروجی
IOLBF_ سرنام Input/Output Line Buffer به معنی میانگیر کردن خط در ورودی/خروجی
و
IONBF_ سر نام Input/Output Not Buffer به معنی عدم میانگیر کردن ورودی/خروجی
'''دقت کنید :''' در صورتی که بخواهید میانگیر کردن را از کار بیاندازید و از IONBF_ استفاده کنید باید حتماً به جای آرایه کاراکتری از ماکروی مقدار تهی NULL نول استفاده کنید و اندازه را 0 تعیین کنید ؛ در غیر این صورت در هر گونه میانگیر کردن باید اندازهای بزرگتر از 0 داشته باشد . تابع setvbuf در صورت موفقیتآمیز بودن عملکرد خود مقدار 0 را باز می گرداند و در غیر این صورت مقداری غیر 0 را . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
char buf[30];
if(setvbuf(stderr, buf, _IOFBF, sizeof buf))
{
printf("failed to change the buffer of stdout");
return 1;
}
fprintf(stderr, "He");
fflush(stderr);
if(setvbuf(stdout, NULL, _IONBF, 0))
{
printf("failed to change the buffer of stdout");
return 1;
}
printf("llo w");
if(setvbuf(stdout, buf, _IOLBF, sizeof buf))
{
printf("failed to change the buffer of stdout");
return 1;
}
printf("orld!");
putchar('\n');
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
این قطعه کد را مشابه قطعه کد مثال setvbuf در ویکی کتاب انگلیسی نوشتهام ؛ چرا که بسیار زیبا و کارآمد نوشته شده است . یک آرایه کاراکتری با ۳۰ عنصر ، اعلان نمودهایم که نقش میانگیر ما را ایفا می کند . سپس در داخل شرط ، میانگیر کامل خود را بر روی stderr اعمال نمودهایم تا میانگیر و بافر شود . اگر به یاد داشته باشید گفتیم که stderr در داخل بافر سیستم عامل یا کرنل ، نوشته نمی شود . ولی با این کار می توانیم stderr را نیز میانگیر کنیم . در صورت خطا ، پیغامی ، چاپ خواهد شد و تابع اصلی برنامه با خطا به کار خود خاتمه خواهد داد اما در غیر این صورت He در بافر سیستمعامل یا کرنل ( بسته به اینکه برای سیستم عامل ، برنامه می نویسیم و یا سطح پائین و برای سیستم ) می نویسد و سپس آن را خالی می کنیم . سپس بدون میانگیر کردن در خروجی خط دستوری چاپ می کنیم : llo w و در ادامه با میانگیر کردن خط در محیط خطدستوری مثل ترمینال در سیستمعاملهای یونیکس و شبه یونیکس و command prompt در ویندوز و همچنین خطدستور در برنامههای سطح پائین ( مثل بارگذار بوت یا کرنل یا هسته سیستمعامل ) چاپ می کنیم : !orld و در ادامه خط را می شکنیم تا میانگیر شود . دقت کنید اگر خط ، شکسته نشود ، میانگیر ما در حافظه موقت ، تخلیه نمی شود و به جای حروف نوشته شده به احتمال زیاد ، حروف دیگری نمایش داده می شوند ( می توانید امتحان کنید و putchar(\n) را کامنت کنید یا حذف کنید و کامپایل و لینک کرده و سپس اجرا کنید و دوباره آن را اضافه کنید و کامپایل و لینک و اجرا کنید تا نتیجه را ببینید )
== تابع perror ==
تابع perror سرنام print error به معنی خطا را چاپ کن ، خطایی را که در عملیات ورودی/خروجی پیش آمده است را به خروجی استاندارد که معمولاً محیط خطدستوری است می فرستد و نمایش می دهد . شکل کلی استفاده از perror بدین صورت می باشد :
{{چپچین}}
perror(const char * string);
{{پایان چپچین}}
شما مجاز هستید تا درون تابع ، پیامی را به صورت یک رشته یا حتی یک کاراکتر بنویسید تا نمایش داده شود و در این صورت ابتدا پیام شما نمایش داده شده و سپس با یک دو نقطه ( : ) و یک فاصله خالی ( اسپیس Space ) perror پیام خطای سیستم را که در آخرین ورودی/خروجی پیش آمده در stderr می نویسد . ولی اگر داخل تابع یک کاراکتر با مقدار ماکروی تهی ( نول NULL ) قرار بدهید و یا رشته را خالی بگذارید ، تنها پیام خطای سیستم ، نمایش داده می شود . '''دقت کنید :''' هر جا که امکان وجود خطا در ورودی/خروجی پیش آمد perror را بنویسید و گرنه errno با مقدار و پیام خطای دیگری که پیش بیاید جایگزین می شود . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
FILE * file = fopen("imaginary_file.bin", "rb");
if(file == NULL)
{
perror("Error on opening file");
return 1;
}
else
fclose(file);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
'''توضیح :''' در تابع اصلی برنامه ( main ) تلاش کردهایم تا فایلی را که وجود ندارد ( دقت کنید تا در جایی که برنامه را اجرا می کنید فایلی با این نام وجود نداشته باشد تا کارایی مثال بالا را متوجه شوید ) با نام فایل خیالی ( imaginary_file ) با پسوند bin که نشان می دهد فایل از نوع اجرایی و دودویی است ( binary ) با حالت خواندن دودویی rb باز کنیم و اگر فایل موجود نبود پیام خطا چاپ شود : خطا در باز کردن فایل و سپس سیستم ، پیام خطای خود را چاپ می کند که چیزی شبیه به No Such File or Directory یا دقیقاً همین پیام است . در غیر این صورت فایل با موفقیت باز شده و سپس بسته می شود ولی اگر این فایل را در دایرکتوری ( که در ویندوز با اصطلاح فولدر Folder شناخته می شود ) برنامه کامپایل شده بالا ایجاد نکنید ، پیام خطا را مشاهده خواهید نمود
== تابع tmpnam و ماکروهای TMP_MAX و L_tmpnam ==
تابع tmpnam سرنام temporary name به معنی نام موقت برای ایجاد نامی تصادفی و موقت و معمولاً برای سندها ( فایلها ) است که هنوز تصمیمی برای انتخاب نامی برای آن نداریم و البته این نام ، توسط پیادهساز ، نامی ساخته می شود که در سند برنامه و یا دایرکتوری سندهای موقت ، موجود نباشد . اما TMP_MAX سرنام Temporary Maximum به معنی حداکثر (نام ) موقت ، یک ماکرو است که نشان می دهد پیادهساز ( کامپایلر ) تا چند ، نام موقت را می تواند بسازد و ماکروی L_tmpnam سرنام Length of temporary name به معنی طول نام موقت است که حداکثر تعداد کاراکترهایی که پیادهساز می تواند برای نام موقت ، بسازد چند کاراکتر است . جهت متوجه شدن این مسئله به راحتی میتوانید از printf استفاده کنید . یعنی :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
printf("longest name generated is %d and maximum number of random names are : %d\n", L_tmpnam, TMP_MAX);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
در پیادهسازهای محتلف و سیستم عاملهای مختلف و البته با توجه به اندازه حافظه موجود در سیستم شما این اعداد می توانند متفاوت باشند . به طور مثال در سیستم عامل گنو/لینوکس و کامپایلر GCC در یک افراز ( پارتیشن Partition ) ۵۱۲ گیگابایتی این مقادیر ۲۰ و ۲۳۸۳۲۸ است ؛ یعنی طولانیترین نامی که GCC می سازد ۲۰ کاراکتر دارد و نهایتاً می تواند ۲۳۸ هزار و ۳۲۸ نام تصادفی ، تولید کند
شکل کلی استفاده از تابع tmpnam بدین صورت می باشد :
{{چپچین}}
tmpnam(char * str);
{{پایان چپچین}}
در ابتدا دقت کنید که شما برای مقدار دهی tmpnam یا باید از ماکروی مقدار تهی NULL استفاده کنید که تابع ، یک اشارهگر به میانگیر ( بافر Buffer ) ایستای سیستم را باز می گرداند و نام می تواند در یک رشته ذخیره شود یا اینکه یک رشته می سازید که تعداد عنصرهای آرایه باید '''حداقل''' به تعداد L_tmpnam باشد و tmpnam را فرا می خوانید تا آن را مقدار دهی کند . ضمناً اگر بخواهید از این نامها برای ایجاد سند ( فایل ) استفاده کنید کامپایلر ، سندها را در دایرکتوری موقت سیستم عامل می سازد . این دایرکتوری در گنو/لینوکس و دیگر شبهیونیکسها همچون سیستم عاملهای مکینتاش ( Mac OS X , OS X , macOS ) در نشانی tmp/ یعنی در فولدر یا دایرکتوری tmp در ریشه ( root ) قرار دارد و در سیستم عاملهای جدید مایکروسافت ویندوز در :
C:\Users\LocalUser\AppData\Local\Temp\
'''دقت کنید :''' یکم اینکه در گذشته ، ویندوز ، همانند سیستم عاملهای شبهیونیکس برای نشانیدهی از اسلش / استفاده میکرد ولی از ویندوز XP به بعد از بک اسلش ( Back Slash ) \ استفاده می کند . دوم اینکه این آدرس در ویندوزهای قدیمی ، متفاوت است و سوم اینکه از ویندوز ۷ به بعد هر افراز ( پارتیشن ) ـی که بر روی آن ویندوز حاضر و فعلی نصب باشد C نام میگیرد ( ممکن است شما دو ویندوز نصب کنید و یکی بر روی افراز D باشد ولی وقتی آن را آغاز کنید - Start Up - نام آن به C تغییر پیدا میکند )
ضمناً این دایرکتوری برای برنامهنویسی حرفهای ، بسیار کاربرد دارد . فرض کنید میخواهید یک پخش کننده چند رسانهای ( Multimedia Player ) یا هر برنامه دیگری بنویسید و هر سندی ( فایلی File ) که باز شد را در فهرست آخرین سندها نگه دارید و به درخواست کاربر ، هر موقع که خواست آن را پاک کنید . برای این کار ، یک فایل در دایرکتوری موقت Temporary می سازید و آن را با سندهایی که باز می شوند ، پیرایش کرده و به روز رسانی می کنید و هر موقع کاربر به برنامه دستور داد که تخلیه شود آن را پاک می کنید و از نو آغاز می کنید . یا مثلاً یک پیرایشگر متن ( Text Editor ) یا واژه پرداز ( Word Processor ) می نویسید و برای آن می خواهید هر ۵ یا ۱۰ دقیقه ( به طور نمونه ) یک بار یک نسخه پشتیبانی ( Backup ) از سند ( File ) یا پرونده ( Document در واژه پرداز ) ایجاد شود ؛ بنابراین آن را در دایرکتوری موقت ، می نویسید . بدین ترتیب اگر برنامه قفل کند یا متوقف شود ، پس از گشودن مجدد برنامه ، حداقل بخش بزرگی از سند یا پرونده ذخیره شده است
'''دقت کنید :''' تابع tmpnam با هر بار فراخوانی ، نام جدیدی را می سازد ؛ پس اگر هنوز نام ساخته شده را ذخیره نکرده باشید و دوباره آن را فرا بخوانید نام قبلی از بین می رود
تابع tmpnam در صورت موفقیت آمیز عمل کردن خود ، یک اشارهگر به نام ساخته شده خود باز می گرداند که اگر آرگومان آن NULL باشد یک اشارهگر به بافر ایستای سیستم ، بازمیگرداند و اگر یک رشته باشد یک رشته را باز میگرداند و اگر در هر صورتی ، کامپایلر ، موفق به ساخت نام موقت نشود یک اشارهگر تهی NULL باز میگرداند . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
char * buf1 = tmpnam(NULL);
char buf2[L_tmpnam];
tmpnam(buf2);
char buf3[30];
tmpnam(buf3);
FILE * fp1 = fopen(buf1, "w");
fputs("first file", fp1);
FILE * fp2 = fopen(buf2, "w");
fputs("second file", fp2);
FILE * fp3 = fopen(buf3, "w");
fputs("third file", fp3);
fclose(fp1);
fclose(fp2);
fclose(fp3);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
'''توضیح :''' یک رشته با نام buf1 تعریف کردهایم که مقدار آن را تابع tmpnam با آرگومان NULL مقداردهی می نماید . یک رشته دیگر با نام buf2 اعلان کردهایم که تعداد عنصرهای آن به اندازه L_tmpnam که اندیس آن می باشد است و سپس آن را با tmpnam مقداردهی کردهایم . سپس یک رشته با نام buf3 با ۳۰ عنصر ، اعلان کردهایم . دقت کنید چون GCC حداقل طول قابل پذیرشش ۲۰ است باید مقداری بزرگتر از آن را بنویسیم ( که در همین مبحث ، کمی بالاتر نوشتیم ؛ شما نیز مقداری بزرگتر از L_tmpnam در کامپایلر خود بنویسید ) سپس ۳ فایل ایجاد نمودهایم که نامهای آنها همان نامهای ایجاد شده توسط تابع tmpnam است ( به ترتیب ) و آنها را به صورت متنی برای نوشتن ، باز کردهایم و در هر کدام از آنها به ترتیب نوشتهایم : سند اول ، سند دوم و سند سوم و سپس فایلها را بستهایم و تابع اصلی برنامه را با موفقیت به پایان رساندهایم ( اگر به دایرکتوری - فولدر - موقت سیستم عامل خود مراجعه کنید ، آنها را خواهید یافت - Visual Studio در ویندوز تماماً آنها را تصادفی میسازد و GCC در گنو/لینوکس با پیشنام file )
'''نکته :''' تابع tmpnam از نظر امنیت زنجیره ، امن است البته اگر آرگومان آن NULL نباشد ؛ برای همین سیستمعاملهای شبهیونیکس و حتی ویندوز هر کدام تابعهایی غیر استاندارد دارند که فرآیند ساخت نامها کاملاً ایمن باشد . برای اطلاع از تابعهای موجود در کامپایلر و سیستم عامل خود به راهنمای آن مراجعه کنید
== ماکروی FOPEN_MAX ==
این ماکرو در فایل سرآیند stdio فقط یک مقدار ثابت دارد که سرنام File Open Maximum به معنی بیشینه ( حداکثر ) تعداد فایل می باشد و نشان می دهد که مطابق با سیستم عامل شما و کامپایلر شما ، در هر سند متن برنامه ، شما چند فایل را پشت سر هم می توانید بدون بسته شدن ، باز کنید . این مقدار باید حداقل طبق استاندارد ۸ باشد ولی به طور مثال در سیستم عامل گنو/لینوکس و کامپایلر GCC این مقدار ۱۶ است . برای اینکه این مقدار را که در فایل stdio کامپایلر شما تعریف شده است بیابید ، قطعه کد زیر را بنویسید و کامپایل و پیوند ( لینک ) کنید و سپس آن را اجرا کنید :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
printf("%d\n", FOPEN_MAX);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
'''توضیح :''' همانند مثالهای پیشین در این مبحث ، پس از تشریحهای فراوان دیگر در مباحث پیشین ، وقت را هدر نداده و قطعه کد را تشریح نمی کنیم . تابع کتابخانهای printf یک مقدار دسیمال ( دهدهی ) را که آرگومانش به آن فرستاده شود در خروجی خطدستوری ، نمایش می دهد و آرگومان آن ، ماکروی FOPEN_MAX می باشد که پس از اجرا می بینید که بیشینه فایلهایی را که در هر برنامه مجاز هستید تا پشت سر هم و بدون بستن فایلهای قبلی باز کنید چه تعداد می باشد
== ماکروی FILENAME_MAX ==
این ماکروی استاندارد که سرنام Maximum File Name می باشد به معنی بیشینه طول نام فایل ، بیشترین مقدار صحیحی که سیستم عامل اجازه می دهد برای هر نام فایل استفاده شود را نشان می دهد . دقت کنید که این مقدار صحیح ثابت است و در فایل سرآیند stdio تعریف می شود تا برنامهنویس بداند که بیشینه مقدار ، چه قدر است که این مقدار فقط تعداد کاراکترهای تعیین شده در ازکی ASCII می باشد ( منهای یکی ؛ چون آخرین مقدار ، تهی است ) و اگر از کاراکترهای یونیکد استفاده شود تعداد کاراکترهای قابل استفاده کاهش می یابد ( مثلاً در UTF-8 که زبانهای مختلف و شکلکها -ایموجیها - پشتیبانی می شوند هر کاراکتر غیر انگلیسی و ازکی ، چهار بایت اشغال می کند ) . این مقدار در حال حاضر در تقریباً تمامیِ سیستم عاملها و سامانههای فایلبندی ۲۵۶ بایت است که چون آخرین بایت آن ، تهی است می شود ۲۵۵ کاراکتر . برای مشاهده این مقدار در سیستم خود از قطعه کد زیر استفاده کنید :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
printf("%d\n", FILENAME_MAX);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
'''نکته :''' هرگز فراموش نکنید که برای برنامه خود در نوشتن آن برای تعیین نامهای فایلها از آرایهای با اندیس این ماکرو استفاده نکنید یعنی char fn[FILENAME_MAX] کاملاً '''خطاست''' . کامپایلر نه از شما خطا می گیرد و نه هشدار می دهد اما چون یک رشته می سازید که مقدار آن در سیستمهای مختلف مقادیر مختلف و بعضاً بزرگی دارد که باید پشت سرهم باشند ( رجوع کنید به مبحث آرایه ) برنامه شما به راحتی مرتکب خطا خواهد شد . بهتر است در صورتی که قصد دارید از این ماکرو برای تعیین نام فایلها استفاده کنید از ترفند تخصیص حافظه پویا که در مباحث بعدی مطرح می شود استفاده نمائید
== تابع tmpfile ==
تابع کتابخانهای tmpfile سرنام temporary file به معنی سند موقت ، یک فایل موقت می سازد که با بستن فایلِ آن یا تمام شدن اجرای برنامه ، حذف می شود . در سیستم عاملهای شبهیونیکس ، معمولاً در دایرکتوری tmp/ ساخته می شود که همین امر باعث می شود سیستم عامل از شما مجوزی برای اجرای برنامه نخواهد . ولی در سیستم عاملی مثل ویندوز Windows در نسخههای نوین آن پوشه (فولدر موقت temporary folder ) داخل فولدرهای اصلی ویندوز موجود است ؛ بنابراین یا باید به عنوان Admin مدیر ، وارد ویندوز شده باشید و یا گذرواژه ( پسورد Password ) آن را بدانید تا بتوانید برنامه را اجرا کنید . فایل موقت به صورتِ پیشفرض به حالت خواندن/نوشتنِ خام یا همان دودویی ( باینری Binary ) باز می شود اما شما می توانید به راحتی در آن ، متن را نیز بنویسید . شکل کلی فراخوانی تابع tmpfile بدین صورت می باشد :
{{چپچین}}
FILE * tmpfile(void);
{{پایان چپچین}}
سند ، توسط یک ماکروی اشارهگر نوع فایل آماده می شود و سپس با نوشتن ;()tmpfile ایجاد می گردد ( دقت کنید که این تابع ، آرگومانی نمی پذیرد و باید آن را خالی بگذارید و حتی اجازه نوشتن void را داخل آن ندارید ) . این تابع در صورت موفقیتآمیز بودن عمل خود ، اشارهگری را به فایل ساخته شده باز می گرداند و در صورت هر گونه عدم موفقیت ، یک اشارهگر تهی ( نول NULL ) را باز می گرداند . مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
FILE *fp, *tmpf;
fp = fopen("copy.txt", "w+");
tmpf = tmpfile();
if (tmpf == NULL)
{
perror("System failed to make temporary file");
return 1;
}
char tmpstr[100];
fgets(tmpstr, 100, stdin);
fputs(tmpstr, tmpf);
char str[100];
for(int i = 0; i <= 100; i++)
{
str[i] = tmpstr[i];
}
fputs(str, fp);
fclose(fp);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
'''توضیح :''' دو اشارهگر فایل را به نامهای fp و tmpf ساختهایم و آمادهایم تا فایلهای آنها را بسازیم . اولی به صورت متنی در فایلی با نام copy.txt ساخته می شود . دومی فایل موقت است که اگر موفق به ساخت آن نشویم پیام خطا را چاپ می کند که سامانه ، موفق به ایجاد فایل موقت ، نشد . سپس یک رشته را از ورودی استاندارد ( صفحهکلید Keyboard ) به طول نهایتاً ۱۰۰ کاراکتر دریافت می کند و داخل خود می نویسد ( آنچه را که کاربر بنویسد و در نهایت دکمه ورود Enter را بزند ) سپس رشته دیگری به همان اندازه ساخته می شود و متن فایل موقت را در خود کپی ( کاپی Copy ) می کند و آن را در copy.txt می نویسد و فایل copy.txt بسته می شود و با پایان برنامه فایل موقت نیز پاک می شود . دقت کنید این ، سادهترین شکل گرفتن فایل پشتیبانی Backup از فایل اصلیِ کاربر است . برنامه gEdit به همین شکل ، کاراکتر به کاراکتر ، متن را داخل سند ، ذخیره می کند و بسیار کند است اما روش مطمئنی است که دادهای از دست نرود ( به همین شکل نیز پشتیبانی آن ، کند است ) . در صورتی که بخواهید با سرعت بالایی سند خود را ذخیره کنید باید از روشها و ترفندهای دیگری استفاده کنید که در مباحث بعدی به آنها می رسیم . اما فعلاً برای کپی کردن یک رشته در رشته دیگر چارهای جز این نداشتیم
== تابع freopen ==
تابع کتابخانهای freopen سرنام file re-open به معنی دوباره فایل را باز کن ؛ در صورتی که فایلی باز شده باشد ( توسط fopen ) و اشارهگر فایل باز شده را به آن بفرستیم ، جریان فایل قبلی را می بندد ( دیگر نیازی به fclose نخواهد داشت ) و دوباره آن را باز می کند و در صورتی که فایلی باز نشده باشد و یا اشارهگر فایلِ آن را به freopen نفرستیم باید از جریان ورودی/خروجی استاندارد stdin و stdout و stderr استفاده کنیم تا از فایلی متنی ، بخوانیم یا داخل آن ، متنی را بنویسیم . طبق استاندارد ، استفاده از حالت دودویی ، تعریف نشده است و پیادهسازها در شبهیونیکسها آن را نادیده گرفته و ویندوز نیز تنها به نادیده گرفتن شکسته شدن خط در پایان هر خط متن ، بسنده می کند ( البته برخی سیستم عاملها از آن پشتیبانی می نمایند )
شکل کلی استفاده از تابع freopen بدین صورت می باشد :
{{چپچین}}
freopen(const char * filename, const char * mode, FILE * stream);
{{پایان چپچین}}
می شود گفت همانند fopen است و mode های آن ( یعنی حالتهای باز کردن فایل آن ) همانند fopen در همین مبحث فایل سرآیند stdio می باشد ( با این تفاوت که همان طور که گفته شد حالت دودویی و خام باز نمیکند و البته می تواند از ورودی خروجی استاندارد جهت نوشتن و یا خواندن استفاده کند )
مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
FILE *fp, *fp2;
fp = fopen("example.txt", "r");
if (fp == NULL)
{
perror("File couldn't be opened");
return 1;
}
fp2 = freopen("example.txt", "a", fp);
fputs("4th sentence", fp2);
fclose(fp2);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
'''توضیح :''' در مثال بالا ۲ اشارهگر فایل را آماده ایجاد نموده و اولی را با باز کردن فایل متنی example.txt که کمی پیشتر آن را ایجاد نمودیم با حالت خواندن متنی به پایان رساندهایم . اشارهگر فایل دوم با freopen با حالت اضافه کردن باز شده است و سپس توسط تابع fputs جمله 4th sentence در خط چهارم اضافه شده است و سپس fp2 را بستهایم و نیازی به بستن fp نیست چون freopen آن را بسته است . تابع اصلی برنامه با موفقیت به پایان رسیده است . اگر فایل متنی example.txt را باز کنید حالا به جای ۳ خط ، ۴ خط دارد
مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main()
{
FILE * fp = freopen("copy.txt", "w", stdout);
if (fp == NULL)
{
perror("File couldn't be open");
return 1;
}
printf("This text will replace content of copy.txt");
fclose(fp);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
'''توضیح :''' فایل copy.txt را که در قسمت قبل ، ایجاد کردیم را جهت نوشته شدن مجدد با حالت نوشتن و جریان خروجی استاندارد جهت خارج کردن - نوشتن - متن به فایل باز کردهایم . از اینجا به بعد هر آنچه که در خروجیخط دستوری ، دستور بدهیم تا نمایش داده شود در فایل copy.txt نوشته خواهد شد تا زمانی که اشارهگر فایل خود را ببندیم که ما نیز همین کار را کردهایم . حال اگر فایل متنی copy.txt را باز کنید در آن نوشته شده است : This text will replace content of copy.txt یعنی « این متن ، جایگزین محتوای فایل copy.txt خواهد شد » و اگر فایل را باز کنید همین متن را خواهید دید . تابع اصلی برنامه را با موفقیت به پایان رساندهایم
مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include<stdio.h>
int main()
{
FILE * fp = freopen("example.txt", "r", stdin);
if (fp == NULL)
{
perror("File couldn't be found");
return 1;
}
char text[150];
while(fgets(text, sizeof(text), stdin) != NULL)
{
printf("%s", text);
}
fclose(fp);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
'''توضیح :''' فایل example.txt را جهت خوانده شدن و با جریان ورودی - خواندن - استاندارد stdin باز نمودهایم تا از فایل وارد کنیم . رشته text را با ۱۵۰ عنصر ، اعلان نمودهایم . با حلقه while تابع fgets را اجرا نمودهایم تا متن بخواند و تا زمانی که مقدار دریافتی آن تهی ( نول NULL ) نباشد در خروجی خطدستوری ، متن را نمایش دهد که همان ۴ خطی است که در مثال پیشتر از پیش آن را بازنویسی کردیم و خط چهارم را نیز به آن اضافه نمودیم . سپس فایل fp را بسته و تابع را با موفقیت به پایان رساندهایم
== تابع snprintf ==
تابع کتابخانهای snprintf سرنام string number of arguments print formatted به معنی چاپ قالببندی شده ( فرمتشده ) رشته به اندازه تعداد آرگومانها ؛ همانند تابع printf است جز اینکه متن چاپ شده ، داخل یک میانگیر ( بافر Buffer ) ذخیره می گردد تا یک تابع که عمل خروجیِ چاپ را در خروجی خطدستوری ، انجام می دهد چاپ کند
شکل کلی استفاده از تابع snprintf بدین صورت می باشد :
{{چپچین}}
snprintf(char * buffer, size_t number of characters, const char * formatted-string, arguments-list);
{{پایان چپچین}}
ابتدا باید یک رشته میانگیر ( بافر ) اعلان کنیم تا بتوانیم آن را در تابع snprintf به کار ببریم که کاراکترها در آن ذخیره شوند ؛ سپس تعداد کاراکترهایی که قرار است ذخیره شوند را می نویسیم که اگر کوچکتر از تعداد کاراکترهای نوشته شده باشد ، مابقی ، نادیده گرفته خواهند شد ؛ سپس رشته خود را به همراه قالببندیکنندهها و ... می نویسیم و در پایان اگر تعیینکننده آرگومانی را در رشته قالببندیشده نوشته باشیم ، شناسه ( نام ) دادههای متناظر آن را می نویسیم تا ذخیره شوند
تابع snprintf هر مقدار و موجودیای را که دریافت کند یک ماکروی مقدار NULL در پایان آن قرار می دهد که یعنی رشته ، به پایان رسید . این تابع در صورت موفقیتآمیز بودن عملکرد خود تعداد کاراکترهایی که در میانگیر ذخیره کرده است را باز می گرداند و در صورت هر گونه اختلال و خطا یک مقدار منفی را باز می گرداند . ضمناً در بازگرداندن تعداد کاراکترها NULL را در نظر نگرفته و آن را نمی شمارد
مثال :
{{چپچین}}
<syntaxhighlight lang=c>
#include <stdio.h>
int main(void)
{
char buff[150];
long long int lightyear = 9460730000000;
long double planck = 6.62607015;
snprintf(buff, sizeof(buff), "The passed distance by light in a year is about %lld kilometer and Planck constant is : %Lf * 10^-34\n", lightyear, planck);
printf("%s", buff);
return 0;
}
</syntaxhighlight>
{{پایان چپچین}}
'''توضیح :''' یک رشته با نام buff اعلان نمودهایم که میانگیر ( بافر ) ما می باشد . سپس یک داده صحیح خیلی بلند ایجاد نمودهایم که به صورت تقریبی میزان طول سال نوری ( مقدار مسافتی که نور در عرض یک سال می پیماید ) را به کیلومتر در آن ذخیره کردهایم و متغیر ، تعریف شده است . سپس عدد ثابت پلانک ( که بر حسب ژول در ثانیه می باشد و در محاسبه میزان انرژی نور که توسط ماکس پلانک کشف شد مورد استفاده قرار می گیرد ) را در یک داده اعشاری با دقت خیلی زیاد نوشتهایم و متغیر را تعریف نمودهایم . سپس تابع snprintf متن و آرگومانهای فرستاده شده به خود را در buff ذخیره می کند و تعداد نوشته شده برای آن هم تعداد عنصرهای آرایه buff می باشد و نوشتهایم میزان مسافتی که نور ، در یک سال می پیماید lld% است که به آن lightyear را فرستادهایم و عدد ثابت پلانک برابر با Lf% می باشد که به آن planck را فرستادهایم که البته عدد بسیار کوچکی است و مقدار تقریبی نوشته شده در ده به توان منفی ۳۴ نوشته می شود . سپس با تابع printf موجودیِ ذخیره شده در buff را که نوشتیم ، در خروجی خطدستوری ، چاپ نموده و تابع را با موفقیت به پایان می رسانیم
== تابعهای وابسته و اختصاصی ==
در این فصل ، تمام ماکروها و تابعهای استاندارد زبان سی نوشته شدند جز اینکه برخی از تابعها وابسته هستند و باید از فایلهای سرآیند دیگر نیز استفاده کرد تا بتوان در کنار stdio تابعهای مورد نظر را به کار بست که در فصلهای مرتبط نوشته خواهند گردید . همچنین بسیاری از سیستمعاملها علاوه بر رابط برنامهنویسی پازیکس POSIX ( برای برنامهنویسی در سیستمهای شبهیونیکسی ) از تابعها و ماکروهای اختصاصی برخورداند ( همچون Windows یا Linux ) که ما آنها را نمینویسیم و فقط سی استاندارد را مینویسیم . اگر بخواهید از تابعهای اختصاصی سیستمعاملها استفاده کنید کار شما راحتتر میشود و کمتر نیاز پیدا خواهید کرد تا کد بزنید ولی در هر صورت آنها استاندارد نیستند و ما در اینجا تنها سی استاندارد را مینویسیم اما اگر راهنمای کامپایلر خود را در سیستم عامل مد نظر خود ، بخوانید مابقی تابعها و ماکروها نیز نوشته شدهاند
[[رده:زبان برنامه نویسی سی]]
3kptel9wcrrpvp00svbkm9b152242gc
بحث کاربر:Fwldom
3
39167
135052
134979
2026-09-19T18:25:22Z
Fwldom
26269
/* خوش بازگشتید */ پاسخ
135052
wikitext
text/x-wiki
<div style="float:center;">
{{جعبه بایگانی|
[[/بایگانی۱|بایگانی۱]] <br>
[[/بایگانی۲|بایگانی۲]] <br>
[[/بایگانی۳|بایگانی۳]] <br>
[[/بایگانی۴|بایگانی۴]] <br>
{{سخ}}
}}
</div>
==میزان توسعه کتاب های شما==
درود. [[ویکیکتاب:ایبوکها بر حسب وضعیت تکمیلشدگی|وضعیت توسعه کتابهایی که در دست تکمیل دارید]] به شرح زیر برآورد شده است:
{|class="wikitable sortable"
|-
! نام کتاب!! میزان توسعه!! موضوع!! مشارکت کنندگان
|-
| [[زبان برنامهنویسی گو]]
|۲۵٪
|رایانه
| Fwldom
|-
| [[برنامه نویسی PSP]]
|۷۵٪
|رایانه
| Fwldom
|-
| [[مبانی شبکههای کامپیوتری و سختافزار]]
|۱۰۰٪
|رایانه
| Fwldom
|} [[کاربر:Doostdar|دوستدار ایران بزرگ]] [[بحث کاربر:Doostdar|☎]] یکشنبه،۴ شهریور ۱۴۰۳، ساعت ۱۲:۵۸ (ایران) ۲۵ اوت ۲۰۲۴، ساعت ۰۸:۲۸ (UTC)
:درود کتاب های برنامه نویسی psp و مبانی شبکه های کامپیوتری و سخت افزار تکمیل شده اند فقط کافیست چند مثال و عکس بهشون اضافه کنم.
:باسپاس [[کاربر:Fwldom|Fwldom]] ([[بحث کاربر:Fwldom|بحث]]) ۲۵ اوت ۲۰۲۴، ساعت ۱۰:۵۰ (UTC)
::صفحه های زیر خالی هستند
::* [[برنامه نویسی PSP/مدیریت خطا]]
::* برنامه نویسی PSP/فهرست راهنمای تکراری
::[[کاربر:Doostdar|دوستدار ایران بزرگ]] [[بحث کاربر:Doostdar|☎]] چهارشنبه،۷ شهریور ۱۴۰۳، ساعت ۰۰:۲۵ (ایران) ۲۷ اوت ۲۰۲۴، ساعت ۱۹:۵۵ (UTC)
::در صفحه [[برنامه نویسی PSP/راه اندازی ابزار]] وابستگی ها به چه معناست؟ [[کاربر:Doostdar|دوستدار ایران بزرگ]] [[بحث کاربر:Doostdar|☎]] چهارشنبه،۷ شهریور ۱۴۰۳، ساعت ۰۰:۵۹ (ایران) ۲۷ اوت ۲۰۲۴، ساعت ۲۰:۲۹ (UTC)
:::اصلاح شد.
:::کتاب یک صفحه اش رو کامل کردم و یک صفحه اضافی را در فهرست حذف کردم.
:::کتاب کامل است. [[کاربر:Fwldom|Fwldom]] ([[بحث کاربر:Fwldom|بحث]]) ۳۱ اوت ۲۰۲۴، ساعت ۱۸:۰۷ (UTC)
::::مفاهیم گنگ برای خوانندگان را توضیح بدهید. منبع نوشته ها کجاست؟ [[کاربر:Doostdar|دوستدار ایران بزرگ]] [[بحث کاربر:Doostdar|☎]] چهارشنبه،۱۴ شهریور ۱۴۰۳، ساعت ۱۳:۵۷ (ایران) ۴ سپتامبر ۲۰۲۴، ساعت ۰۹:۲۷ (UTC)
:::::این مفهوم گنگ نیست زنجیره ابزار pspdev برای اجرا برنامه های psp نیاز به چند وابستگی دارد همین.
:::::منبع ها را گفتم شما هم پایین کتاب اضافه کردید.
:::::اگر دوباره نگاه بيندازيد میبینید.
:::::بدرود [[کاربر:Fwldom|Fwldom]] ([[بحث کاربر:Fwldom|بحث]]) ۴ سپتامبر ۲۰۲۴، ساعت ۱۰:۰۱ (UTC)
::::::این مطالب جدید رو هم از همان منابع قبلی برداشته اید؟ [[کاربر:Doostdar|دوستدار ایران بزرگ]] [[بحث کاربر:Doostdar|☎]] جمعه،۱۶ شهریور ۱۴۰۳، ساعت ۰۲:۳۹ (ایران) ۵ سپتامبر ۲۰۲۴، ساعت ۲۲:۰۹ (UTC)
:::::::بله و کد رو هم خودم نوشتم اما نام ابزار ها از pspdev.github.io بود و ویکی کتاب انگلیسی [[کاربر:Fwldom|Fwldom]] ([[بحث کاربر:Fwldom|بحث]]) ۶ سپتامبر ۲۰۲۴، ساعت ۰۸:۲۷ (UTC)
::::::::وابستگی یک نوع افزونه رایانهای است؟ [[کاربر:Doostdar|دوستدار ایران بزرگ]] [[بحث کاربر:Doostdar|☎]] شنبه،۱۷ شهریور ۱۴۰۳، ساعت ۱۲:۱۵ (ایران) ۷ سپتامبر ۲۰۲۴، ساعت ۰۷:۴۵ (UTC)
:::::::::شاید بشه گفت افزونه نرم افزاری رایانه.
:::::::::یعنی برای مثال شما میخواید یک نرم افزار نصب کنید نیاز به پکیج DirectX دارید به پکیچ DirectX میگن وابستگی [[کاربر:Fwldom|Fwldom]] ([[بحث کاربر:Fwldom|بحث]]) ۷ سپتامبر ۲۰۲۴، ساعت ۱۰:۰۲ (UTC)
== ایجاد الگوهای زاید ==
درود. چرا الگوهایی میسازید که هبچ جا استفاده نشده مثل [[:الگو:راهنمای تعاملی|این]]؟ [[کاربر:Doostdar|دوستدار ایران بزرگ]] [[بحث کاربر:Doostdar|☎]] چهارشنبه،۱۴ شهریور ۱۴۰۳، ساعت ۱۴:۰۸ (ایران) ۴ سپتامبر ۲۰۲۴، ساعت ۰۹:۳۸ (UTC)
:درود
:برای کتاب های برنامه نویسی که کد را مرحله به مرحله بررسی میکنند.
:مفید است [[کاربر:Fwldom|Fwldom]] ([[بحث کاربر:Fwldom|بحث]]) ۴ سپتامبر ۲۰۲۴، ساعت ۰۹:۴۵ (UTC)
:بعد الگو های دیگری که ایجاد کردم همگی کاربردی یا تا حدود کمی مهم بودند.
:یک نکته مهم بود که بهتر از الگو نکته هست.
:یک کاربر زن زندگی آزادی بود که فکر نکنم زائد باشد.
:یک کاربر کوروش بزرگ بود که آن هم برای کاربران است و تا حالا نمونه اش رو نداشتیم.
:یک الگو چای که برای کسانی که ویرایش های زیادی دارند میتوانید در بحث شان بگذارید.
:فقط این الگو راهنمای تعاملی ممکن است کمی کم استفاده باشد فقط برای کتاب های خاص. [[کاربر:Fwldom|Fwldom]] ([[بحث کاربر:Fwldom|بحث]]) ۴ سپتامبر ۲۰۲۴، ساعت ۰۹:۵۶ (UTC)
== درخواست همزمان برای خوبیدگی و برگزیدگی ==
درود. این کار [[ویکیکتاب:خرابکاری|خرابکاری]] است. در صورت مشاهده دوباره حساب کاربری شما بسته خواهد شد. [[کاربر:Doostdar|دوستدار ایران بزرگ]] [[بحث کاربر:Doostdar|☎]] چهارشنبه،۱۴ شهریور ۱۴۰۳، ساعت ۱۴:۱۰ (ایران) ۴ سپتامبر ۲۰۲۴، ساعت ۰۹:۴۰ (UTC)
:من نمیدونستم نمیتوانم این کار را انجام بدم و خرابکاری تلقی میشود. [[کاربر:Fwldom|Fwldom]] ([[بحث کاربر:Fwldom|بحث]]) ۴ سپتامبر ۲۰۲۴، ساعت ۰۹:۴۹ (UTC)
== Notice of expiration of your rollbacker right ==
<div dir="ltr">Hi, as part of [[:m:Global reminder bot|Global reminder bot]], this is an automated reminder to let you know that your permission "rollbacker" (واگردانان) will expire on 2024-12-16 20:04:29. Please renew this right if you would like to continue using it. <i>In other languages: [[:m:Global reminder bot/Messages/default|click here]]</i> [[کاربر:Leaderbot|Leaderbot]] ([[بحث کاربر:Leaderbot|بحث]]) ۱۰ دسامبر ۲۰۲۴، ساعت ۱۹:۴۳ (UTC)</div>
== میزان توسعه کتاب های شما (دوباره) ==
درود. چه قدر کتاب هایی رو که شروع کردید تونستید تکمیل کنید؟ [[کاربر:Doostdar|دوستدار ایران بزرگ]] [[بحث کاربر:Doostdar|☎]] چهارشنبه،۱۷ اردیبهشت ۱۴۰۴، ساعت ۱۱:۰۱ (ایران) ۷ مهٔ ۲۰۲۵، ساعت ۰۶:۳۱ (UTC)
:درخواست شما در [[ویکیکتاب:گزیدن کتابهای خوب]] جمعبندی شد. --[[کاربر:Doostdar|دوستدار ایران بزرگ]] [[بحث کاربر:Doostdar|☎]] چهارشنبه،۳۱ اردیبهشت ۱۴۰۴، ساعت ۱۵:۱۹ (ایران) ۲۱ مهٔ ۲۰۲۵، ساعت ۱۰:۴۹ (UTC)
==میزان توسعه کتاب های شما (مرداد ۱۴۰۴)==
درود. [[ویکیکتاب:ایبوکها بر حسب وضعیت تکمیلشدگی|وضعیت توسعه کتابهایی که در دست تکمیل دارید]] به شرح زیر برآورد شده است:
{|class="wikitable sortable"
|-
! نام کتاب!! میزان توسعه!! موضوع!! مشارکت کنندگان
|-
| [[سیاساس]]
|۷۰٪
|رایانه
| Fwldom
|-
| [[زبان برنامهنویسی گو]]
|۲۵٪
|رایانه
| Fwldom
|-
| [[برنامه نویسی PSP]]
|۱۰۰٪
|رایانه
| Fwldom
|-
| [[مبانی شبکههای کامپیوتری و سختافزار]]
|۱۰۰٪
|رایانه
| Fwldom
|} [[کاربر:Doostdar|دوستدار ایران بزرگ]] [[بحث کاربر:Doostdar|☎]] دوشنبه،۳۰ تیر ۱۴۰۴، ساعت ۱۲:۱۲ (ایران) ۲۱ ژوئیهٔ ۲۰۲۵، ساعت ۰۷:۴۲ (UTC)
==میزان توسعه کتاب های شما (شهریور ۱۴۰۴)==
درود. [[ویکیکتاب:ایبوکها بر حسب وضعیت تکمیلشدگی|وضعیت توسعه کتابهایی که در دست تکمیل دارید]] به شرح زیر برآورد شده است:
{|class="wikitable sortable"
|-
! نام کتاب!! میزان توسعه!! موضوع!! مشارکت کنندگان
|-
| [[سیاساس]]
|۱۰۰٪
|رایانه
| Fwldom
|-
| [[زبان برنامهنویسی گو]]
|۲۵٪
|رایانه
| Fwldom
|-
| [[برنامه نویسی PSP]]
|۱۰۰٪
|رایانه
| Fwldom
|-
| [[مبانی شبکههای کامپیوتری و سختافزار]]
|۱۰۰٪
|رایانه
| Fwldom
|} [[کاربر:Doostdar|دوستدار ایران بزرگ]] [[بحث کاربر:Doostdar|☎]] دوشنبه،۳ شهریور ۱۴۰۴، ساعت ۱۳:۴۰ (ایران) ۲۵ اوت ۲۰۲۵، ساعت ۰۹:۱۰ (UTC)
== خوش بازگشتید ==
درود. بازگشت شما را خجسته باد میگویم. خیلی خوش بازگشتید. امیدوارم ویرایش هایتان بهتر از پیش شوند. کتاب سیاساس را پیشتر کامل کرده بودید با این حال از اینکه باز هم در جهت بهتر کردن مطالب آن کوشش کردید خرسندم. سعی کنید در شرایطی که در یک کتاب ویرایش نکردهاید و از موضوع آگاه نیستید درباره مطالب کاربران دیگر نظر ندهید. در مورد سوگیری و اسپم مطلب هم سعی کنید خودتان سوگیری انجام ندهید و از منابع معتبر استفاده کنید. درباره ویرایشهای کاربرهای این ویکی بدون اجازه من نیتخوانی نکنید. همچنین به صفحه نظرخواهی بروید و رای بدهید تا مدیر شوم. برای اینکه دسترسی به شما بدهم دست کم پانصد ویرایش جدید انجام بدهید تا سپس وضعیت شما را بررسی کنم. در صورت خوب بودن ویرایش ها میتوانم دسترسی بیشتر به شما بدهم. [[کاربر:Vivairan2|Vivairan2]] ([[بحث کاربر:Vivairan2|بحث]]) ۱۷ سپتامبر ۲۰۲۶، ساعت ۱۸:۴۸ (UTC)
:درود بر شما، سپاس بیکران
:بنده نیتخوانی یا قضاوتی انجام ندادم و صرفا بر اساس قوانین ویکیکتاب (بنیاد ویکی مدیا) نکتهای را گوشزد کردم تا بدست مراتب بالاتر اصلاح شود.
:اگر بنده سوگیری ناخواستهای انجام دادم میتوانید گوشزد کنید تا اصلاح کنم. خیر همچین کاری نخواهم کرد و دلایل را قبلا به در صفحه نظرخواهی گفتم و دلیلی برای تغییر نظراتم مشاهده نمیکنم.
:دسترسی نیاز ندارم و اگر نیاز داشته باشم از مدیر جدید که به زودی تعیین خواهد شد خواهم گرفت و همچنین ترجیح میدونم یک کاربر ساده ویرایش بدون سوگیری در مطالب باشم. [[کاربر:Fwldom|Fwldom]] ([[بحث کاربر:Fwldom|بحث]]) ۱۹ سپتامبر ۲۰۲۶، ساعت ۱۸:۲۵ (UTC)
i4961dit41ywcumdwdp77x0v50t2l51
کاربر:Fwldom
2
39169
135053
134960
2026-09-19T18:36:18Z
Fwldom
26269
/* آمار */ اصلاح نشانی وب، اصلاح ارقام
135053
wikitext
text/x-wiki
{{نشان نگهبان}}
{{نشان گشت خودکار}}
نشان های من: >>>
{{نشان واگردان}}
{{نشان گشتزن}}
{{خوش آمد گویی صفحه کاربری}}
{{جعبه رنگیشده
| background-content-color = gold
| text-color = gold
| title = درود بر شما
| content = {{شعر|نستعلیق}}
{{ب|بیا تا جهان را به بد نسپریم|به کوشش همه دست نیکی بریم}}
{{ب|نباشد همی نیک و بد ، پایدار|همان به که نیکی بود یادگار}}
{{پایان شعر}}
}}
== کتاب های ایجاد شده توسط من ==
*[[آموزش کامل خط فرمان ویندوز]]
*[[مبانی شبکههای کامپیوتری و سختافزار|مبانی شبکههای کامپیوتری و سخت افزار]]
*[[برنامه نویسی PSP]]
*[[زبان برنامهنویسی گو]]
*[[سیاساس|CSS]]
===همکاری در کتاب های: ===
*[[پیاچپی|پی اچ پی]]
*[[آموزش کار با تریدی مکس]]
*[[اچتیامال]]
=== آمار ===
* الگو ها: ۳
* کتاب کامل: ۴
* کتاب ناقص: ۱
* [[کاربر:Fwldom/آمار|آمار کاربر]]
{{کاربر کوروش بزرگ}}
[[رده:کاربران ایران|{{PAGENAME}}]]
5smhyesck4236tl6853wasqo7w7s9fj
زبان برنامهنویسی گو
0
39985
135034
134939
2026-09-19T15:23:23Z
Vivairan2
28134
/* دربارهٔ کتاب */
135034
wikitext
text/x-wiki
{{وضعیت|25%}}
{{در دست ویرایش ۲|ماه=می|روز=۱۲|سال=۲۰۲۵}}
== دربارهٔ کتاب ==
این کتاب به آموزش جامع و گامبهگام زبان برنامهنویسی '''گو''' (به انگلیسی: ''Go'') میپردازد. زبان برنامهنویسی گو که توسط شرکت گوگل توسعه یافته است، به دلیل سادگی، سرعت بالا و پشتیبانی قوی از همزمانی (Concurrency) بهسرعت به یکی از زبانهای محبوب در حوزهٔ توسعهٔ نرمافزار، بهویژه در زمینهٔ سامانههای مقیاسپذیر و برنامههای تحت وب، تبدیل شده است.
این کتاب با زبانی روان و آموزشی تهیه شده و تلاش شده است تا علاوه بر بیان مفاهیم نظری، نمونهکدهای کاربردی و مثالهای عملی نیز ارائه گردد. هدف از نگارش این اثر آن است که خوانندگان با مفاهیم پایه تا مباحث پیشرفتهٔ این زبان آشنا شوند و توانایی استفادهٔ عملی از آن را در پروژههای مختلف به دست آورند.
مطالعهٔ این کتاب به علاقهمندان برنامهنویسی، دانشجویان، و همچنین برنامهنویسان حرفهای توصیه میشود که قصد دارند زبان گو را بهعنوان ابزاری قدرتمند برای توسعهٔ نرمافزار بیاموزند و در عمل بهکار گیرند.
== فهرست ==
{{Stages}}
<!--
* [[پرونده:00%.svg]]
* [[پرونده:25%.svg]]
* [[پرونده:50%.svg]]
* [[پرونده:75%.svg]]
* [[پرونده:100 percent.svg]]
-->
=== فصل نخست [[پرونده:100 percent.svg]] ===
* [[زبان برنامهنویسی گو/مقدمه|مقدمه]] [[پرونده:100 percent.svg]]
* [[زبان برنامهنویسی گو/اولین برنامه|اولین برنامه و اجرای آن]] [[پرونده:100 percent.svg]]
* [[زبان برنامهنویسی گو/ساختارکد|ساختار کد زبان برنامه نویسی گو]] [[پرونده:100 percent.svg]]
* [[زبان برنامهنویسی گو/عناصر لغوی|عناصر لغوی ]] [[پرونده:100 percent.svg]]
=== فصل ۲: مبانی[[پرونده:100 percent.svg]]===
* [[زبان برنامهنویسی گو/متغیرها|متغیرها]] [[پرونده:100 percent.svg]]
* [[زبان برنامهنویسی گو/ثابتها|ثابتها]] [[پرونده:100 percent.svg]]
* [[زبان برنامهنویسی گو/تایپها (نوعها)|تایپها (نوعها)]] [[پرونده:100 percent.svg]]
=== فصل ۳: شرط ها و بلوک ها [[پرونده:100 percent.svg]] ===
* [[زبان برنامهنویسی گو/بلوکهای کد|بلوکهای کد]] [[پرونده:100 percent.svg]]
* [[زبان برنامهنویسی گو/عملگرها و عبارات|عملگرها و عبارات]] [[پرونده:100 percent.svg]]
* [[زبان برنامهنویسی گو/شرط ها if , else , switch|شرط ها در گو]] [[پرونده:100 percent.svg]]
=== فصل ۴: ساختارهای دادهای پایه آرایهها [[پرونده:50 percent.svg]] ===
*[[زبان برنامهنویسی گو/اسلایسها|اسلایسها (Slices)]] [[پرونده:100 percent.svg]]
*[[زبان برنامهنویسی گو/نقشهها (Maps)|نقشهها (Maps)]] [[پرونده:100 percent.svg]]
*[[زبان برنامهنویسی گو/ساختارها (Structs)|ساختارها (Structs)]] [[پرونده:00 percent.svg]]
*[[زبان برنامهنویسی گو/اشارهگرها (Pointers)|اشارهگرها (Pointers)]] [[پرونده:00 percent.svg]]
=== فصل ۵: توابع [[پرونده:100 percent.svg]] ===
* [[زبان برنامهنویسی گو/تعریف و استفاده از توابع|تعریف و استفاده از توابع]] [[پرونده:100 percent.svg]]
* [[زبان برنامهنویسی گو/آرگومانها و مقادیر بازگشتی|آرگومانها و مقادیر بازگشتی]] [[پرونده:100 percent.svg]]
* [[زبان برنامهنویسی گو/توابع ناشناس و توابع به عنوان مقادیر|توابع ناشناس و توابع به عنوان مقادیر]] [[پرونده:100 percent.svg]]
* [[زبان برنامهنویسی گو/متدها و دریافتکنندهها|متدها و دریافتکنندهها (Receivers)]] [[پرونده:100 percent.svg]]
=== فصل ۶: بستهها و ماژولها ===
* [[زبان برنامهنویسی گو/ساختار و نحوه استفاده از بستهها|ساختار و نحوه استفاده از بستهها (Packages)]] [[پرونده:100 percent.svg]]
* [[زبان برنامهنویسی گو/مدیریت وابستگیها با استفاده از ماژولها|مدیریت وابستگیها با استفاده از ماژولها (Modules)]] [[پرونده:00 percent.svg]]
* [[زبان برنامهنویسی گو/استفاده از بستههای استاندارد گو|استفاده از بستههای استاندارد Go]] [[پرونده:00 percent.svg]]
* [[زبان برنامهنویسی گو/ایجاد و استفاده از بستههای شخصیسازی شده|ایجاد و استفاده از بستههای شخصیسازی شده]] [[پرونده:00 percent.svg]]
=== فصل ۷: برنامهنویسی همزمان (Concurrency) ===
* [[زبان برنامهنویسی گو/مفاهیم همزمانی|مفاهیم همزمانی در Go]] [[پرونده:00 percent.svg]]
* [[زبان برنامهنویسی گو/گوروتینها|گوروتینها (Goroutines)]] [[پرونده:00 percent.svg]]
* [[زبان برنامهنویسی گو/کانالها|کانالها (Channels)]] [[پرونده:00 percent.svg]]
* [[زبان برنامهنویسی گو/الگوهای همزمانی|الگوهای پیشرفته همزمانی]] [[پرونده:00 percent.svg]]
=== فصل ۸: مدیریت خطا و تست [[پرونده:50 percent.svg]] ===
* [[زبان برنامهنویسی گو/مدیریت خطاها|مدیریت خطاها در Go]] [[پرونده:100 percent.svg]]
* [[زبان برنامهنویسی گو/اصول نوشتن کدها|اصول نوشتن کدهای ایمن]] [[پرونده:100 percent.svg]]
* [[زبان برنامهنویسی گو/تست واحد|تست واحد (Unit Testing)]] [[پرونده:00 percent.svg]]
* [[زبان برنامهنویسی گو/تست یکپارچگی|تست یکپارچگی (Integration Testing)]] [[پرونده:00 percent.svg]]
* [[زبان برنامهنویسی گو/ابزارهای تست|ابزارهای تست در Go]] [[پرونده:00 percent.svg]]
=== فصل ۹: برنامهنویسی پیشرفته در Go ===
* اینترفیسها و پلیمورفیسم
* بازتاب (Reflection)
* کار با فایلها و سیستمعامل
* برنامهنویسی شبکه (Networking)
* کار با دیتابیسها
=== فصل ۱۰: بهینهسازی و ابزارهای کاربردی ===
* بهینهسازی عملکرد و حافظه
* پروفایلینگ و دیباگینگ
* استفاده از ابزارهای توسعه Go
* مدیریت پروژههای بزرگ
=== فصل ۱۱: پروژههای کاربردی ===
* ساخت یک وبسرویس ساده
* ساخت یک ابزار خط فرمان (CLI)
* توسعه یک برنامه توزیعشده با Go
=== فصل ۱۲: منابع بیشتر و مسیرهای یادگیری [[پرونده:25 percent.svg]] ===
* [[زبان برنامهنویسی گو/منابع آموزشی آنلاین|منابع آموزشی آنلاین]] [[پرونده:100 percent.svg]]
* جامعههای برنامهنویسی Go [[پرونده:00 percent.svg]]
* پروژههای متنباز برای مشارکت [[پرونده:00 percent.svg]]
* پیوستها [[پرونده:00 percent.svg]]
* مرجع دستورات Go [[پرونده:00 percent.svg]]
* سوالات متداول [[پرونده:00 percent.svg]]
* [[زبان برنامهنویسی گو/حل تمرینها|حل تمرینها]] [[پرونده:50 percent.svg]]
[[رده:زبان برنامهنویسی گو]]
351b8gdak0l965slm0ozd9sed1z90g8
135044
135034
2026-09-19T16:12:03Z
Vivairan2
28134
/* فصل ۹: برنامهنویسی پیشرفته در Go */
135044
wikitext
text/x-wiki
{{وضعیت|25%}}
{{در دست ویرایش ۲|ماه=می|روز=۱۲|سال=۲۰۲۵}}
== دربارهٔ کتاب ==
این کتاب به آموزش جامع و گامبهگام زبان برنامهنویسی '''گو''' (به انگلیسی: ''Go'') میپردازد. زبان برنامهنویسی گو که توسط شرکت گوگل توسعه یافته است، به دلیل سادگی، سرعت بالا و پشتیبانی قوی از همزمانی (Concurrency) بهسرعت به یکی از زبانهای محبوب در حوزهٔ توسعهٔ نرمافزار، بهویژه در زمینهٔ سامانههای مقیاسپذیر و برنامههای تحت وب، تبدیل شده است.
این کتاب با زبانی روان و آموزشی تهیه شده و تلاش شده است تا علاوه بر بیان مفاهیم نظری، نمونهکدهای کاربردی و مثالهای عملی نیز ارائه گردد. هدف از نگارش این اثر آن است که خوانندگان با مفاهیم پایه تا مباحث پیشرفتهٔ این زبان آشنا شوند و توانایی استفادهٔ عملی از آن را در پروژههای مختلف به دست آورند.
مطالعهٔ این کتاب به علاقهمندان برنامهنویسی، دانشجویان، و همچنین برنامهنویسان حرفهای توصیه میشود که قصد دارند زبان گو را بهعنوان ابزاری قدرتمند برای توسعهٔ نرمافزار بیاموزند و در عمل بهکار گیرند.
== فهرست ==
{{Stages}}
<!--
* [[پرونده:00%.svg]]
* [[پرونده:25%.svg]]
* [[پرونده:50%.svg]]
* [[پرونده:75%.svg]]
* [[پرونده:100 percent.svg]]
-->
=== فصل نخست [[پرونده:100 percent.svg]] ===
* [[زبان برنامهنویسی گو/مقدمه|مقدمه]] [[پرونده:100 percent.svg]]
* [[زبان برنامهنویسی گو/اولین برنامه|اولین برنامه و اجرای آن]] [[پرونده:100 percent.svg]]
* [[زبان برنامهنویسی گو/ساختارکد|ساختار کد زبان برنامه نویسی گو]] [[پرونده:100 percent.svg]]
* [[زبان برنامهنویسی گو/عناصر لغوی|عناصر لغوی ]] [[پرونده:100 percent.svg]]
=== فصل ۲: مبانی[[پرونده:100 percent.svg]]===
* [[زبان برنامهنویسی گو/متغیرها|متغیرها]] [[پرونده:100 percent.svg]]
* [[زبان برنامهنویسی گو/ثابتها|ثابتها]] [[پرونده:100 percent.svg]]
* [[زبان برنامهنویسی گو/تایپها (نوعها)|تایپها (نوعها)]] [[پرونده:100 percent.svg]]
=== فصل ۳: شرط ها و بلوک ها [[پرونده:100 percent.svg]] ===
* [[زبان برنامهنویسی گو/بلوکهای کد|بلوکهای کد]] [[پرونده:100 percent.svg]]
* [[زبان برنامهنویسی گو/عملگرها و عبارات|عملگرها و عبارات]] [[پرونده:100 percent.svg]]
* [[زبان برنامهنویسی گو/شرط ها if , else , switch|شرط ها در گو]] [[پرونده:100 percent.svg]]
=== فصل ۴: ساختارهای دادهای پایه آرایهها [[پرونده:50 percent.svg]] ===
*[[زبان برنامهنویسی گو/اسلایسها|اسلایسها (Slices)]] [[پرونده:100 percent.svg]]
*[[زبان برنامهنویسی گو/نقشهها (Maps)|نقشهها (Maps)]] [[پرونده:100 percent.svg]]
*[[زبان برنامهنویسی گو/ساختارها (Structs)|ساختارها (Structs)]] [[پرونده:00 percent.svg]]
*[[زبان برنامهنویسی گو/اشارهگرها (Pointers)|اشارهگرها (Pointers)]] [[پرونده:00 percent.svg]]
=== فصل ۵: توابع [[پرونده:100 percent.svg]] ===
* [[زبان برنامهنویسی گو/تعریف و استفاده از توابع|تعریف و استفاده از توابع]] [[پرونده:100 percent.svg]]
* [[زبان برنامهنویسی گو/آرگومانها و مقادیر بازگشتی|آرگومانها و مقادیر بازگشتی]] [[پرونده:100 percent.svg]]
* [[زبان برنامهنویسی گو/توابع ناشناس و توابع به عنوان مقادیر|توابع ناشناس و توابع به عنوان مقادیر]] [[پرونده:100 percent.svg]]
* [[زبان برنامهنویسی گو/متدها و دریافتکنندهها|متدها و دریافتکنندهها (Receivers)]] [[پرونده:100 percent.svg]]
=== فصل ۶: بستهها و ماژولها ===
* [[زبان برنامهنویسی گو/ساختار و نحوه استفاده از بستهها|ساختار و نحوه استفاده از بستهها (Packages)]] [[پرونده:100 percent.svg]]
* [[زبان برنامهنویسی گو/مدیریت وابستگیها با استفاده از ماژولها|مدیریت وابستگیها با استفاده از ماژولها (Modules)]] [[پرونده:00 percent.svg]]
* [[زبان برنامهنویسی گو/استفاده از بستههای استاندارد گو|استفاده از بستههای استاندارد Go]] [[پرونده:00 percent.svg]]
* [[زبان برنامهنویسی گو/ایجاد و استفاده از بستههای شخصیسازی شده|ایجاد و استفاده از بستههای شخصیسازی شده]] [[پرونده:00 percent.svg]]
=== فصل ۷: برنامهنویسی همزمان (Concurrency) ===
* [[زبان برنامهنویسی گو/مفاهیم همزمانی|مفاهیم همزمانی در Go]] [[پرونده:00 percent.svg]]
* [[زبان برنامهنویسی گو/گوروتینها|گوروتینها (Goroutines)]] [[پرونده:00 percent.svg]]
* [[زبان برنامهنویسی گو/کانالها|کانالها (Channels)]] [[پرونده:00 percent.svg]]
* [[زبان برنامهنویسی گو/الگوهای همزمانی|الگوهای پیشرفته همزمانی]] [[پرونده:00 percent.svg]]
=== فصل ۸: مدیریت خطا و تست [[پرونده:50 percent.svg]] ===
* [[زبان برنامهنویسی گو/مدیریت خطاها|مدیریت خطاها در Go]] [[پرونده:100 percent.svg]]
* [[زبان برنامهنویسی گو/اصول نوشتن کدها|اصول نوشتن کدهای ایمن]] [[پرونده:100 percent.svg]]
* [[زبان برنامهنویسی گو/تست واحد|تست واحد (Unit Testing)]] [[پرونده:00 percent.svg]]
* [[زبان برنامهنویسی گو/تست یکپارچگی|تست یکپارچگی (Integration Testing)]] [[پرونده:00 percent.svg]]
* [[زبان برنامهنویسی گو/ابزارهای تست|ابزارهای تست در Go]] [[پرونده:00 percent.svg]]
=== فصل ۹: برنامهنویسی پیشرفته در Go ===
* [[زبان برنامهنویسی گو/اینترفیسها و پلیمورفیسم|اینترفیسها و پلیمورفیسم]] [[پرونده:25 percent.svg]]
* [[زبان برنامهنویسی گو/بازتاب|بازتاب (Reflection)]] [[پرونده:25 percent.svg]]
* [[زبان برنامهنویسی گو/کار با فایلها و سیستمعامل|کار با فایلها و سیستمعامل]] [[پرونده:25 percent.svg]]
* [[زبان برنامهنویسی گو/برنامهنویسی شبکه|برنامهنویسی شبکه (Networking)]] [[پرونده:25 percent.svg]]
* [[زبان برنامهنویسی گو/کار با دیتابیسها|کار با دیتابیسها]] [[پرونده:25 percent.svg]]
=== فصل ۱۰: بهینهسازی و ابزارهای کاربردی ===
* بهینهسازی عملکرد و حافظه
* پروفایلینگ و دیباگینگ
* استفاده از ابزارهای توسعه Go
* مدیریت پروژههای بزرگ
=== فصل ۱۱: پروژههای کاربردی ===
* ساخت یک وبسرویس ساده
* ساخت یک ابزار خط فرمان (CLI)
* توسعه یک برنامه توزیعشده با Go
=== فصل ۱۲: منابع بیشتر و مسیرهای یادگیری [[پرونده:25 percent.svg]] ===
* [[زبان برنامهنویسی گو/منابع آموزشی آنلاین|منابع آموزشی آنلاین]] [[پرونده:100 percent.svg]]
* جامعههای برنامهنویسی Go [[پرونده:00 percent.svg]]
* پروژههای متنباز برای مشارکت [[پرونده:00 percent.svg]]
* پیوستها [[پرونده:00 percent.svg]]
* مرجع دستورات Go [[پرونده:00 percent.svg]]
* سوالات متداول [[پرونده:00 percent.svg]]
* [[زبان برنامهنویسی گو/حل تمرینها|حل تمرینها]] [[پرونده:50 percent.svg]]
[[رده:زبان برنامهنویسی گو]]
gfy2305h9u8r52pkzgxk0nyf1krge9n
زبان برنامهنویسی گو/مقدمه
0
40000
135054
127697
2026-09-19T18:44:37Z
Fwldom
26269
135054
wikitext
text/x-wiki
{{سرصفحه
| عنوان = مقدمه
| قسمت =
| قبلی = [[زبان برنامهنویسی گو|زبان برنامهنویسی گو]]
| بعدی = [[زبان برنامهنویسی گو/اولین برنامه|اولین برنامه]]
| یادداشت = [[زبان برنامهنویسی گو]]
}}
== گو چیست؟ ==
* Go یک زبان برنامه نویسی متن باز و چند پلتفرمی است.
* Go میتواند برای ایجاد برنامههای کاربردی با کارایی بالا استفاده شود.
* Go یک زبان سریع، تایپ ایستا و کامپایل شده است که به دلیل سادگی و کارایی خود شناخته شده است.
* Go توسط رابرت گریزمر، راب پایک و کن تامپسون در سال '''۲۰۰۷''' در '''گوگل''' توسعه یافت.
* سینتکس Go شبیه C است.
* گو برای توسعه اپلیکیشنهای وب (سمت سرور)، برنامههای مبتنی بر شبکه، برنامههای کاربردی سازمانی بین پلتفرمی، بومی ابری ، ... استفاده میشود.
== نصب گو و شروع توسعه ==
* نیازمندی های قبل شروع :
** یک محیط توسعه مانند Vscode
** یک کامپایلر، مانند GCC، برای ترجمه کد Go به زبانی که کامپیوتر آن را بفهمد.
* نصب گو
** ابتدا به سایت https://golang.org/dl/ بروید و گو را دانلود و نصب کنید.
** برای مطمئن شدن از نصب گو در خط فرمان
go version
باید ورژن گو به شما نمایش داده شود و گرنه باید گو را دوباره نصب کنید.
* نصب محیط توسعه و آماده سازی آن برای Go:
** وی اس کد را از https://code.visualstudio.com/ دانلود و نصب کنید.
** به بخش extension بروید و Go را جستجو کنید و افزونه را نصب کنید.
** CTRL + SHIFT + P را نگه دارید و
Go: Install/Update Tools
را تایپ کنید و اینتر را بزنید.
*اکنون Go نصب شده و محیط توسعه برنامه آماده است.
[[رده:زبان برنامهنویسی گو]]
cyd8czlp6i0by9tn8ukaek6y68up71s
زبان برنامهنویسی گو/اولین برنامه
0
40038
135035
127698
2026-09-19T15:33:08Z
Vivairan2
28134
توضیح ناقص بود. همه مراحل باید توضیح داده شود.
135035
wikitext
text/x-wiki
{{سرصفحه
| عنوان = اولین برنامه
| قسمت =
| قبلی = [[زبان برنامهنویسی گو/مقدمه|مقدمه]]
| بعدی = [[زبان برنامهنویسی گو/ساختارکد|ساختارکد]]
| یادداشت = [[زبان برنامهنویسی گو]]
}}
== ساخت اولین ==
برای ساخت اولین برنامه ابتدا ویرایشگر خود را باز کرده و یک فایل جدید مثلا با نام main با همراه پسوند .go درست میکنیم.<br>
و کد برنامه را داخل آن مینویسم:
<div dir='ltr'>
package main
import "fmt"
func main() {
fmt.Println("Hello world!!!")
}
<div/>
در انتها، فایل ساخته شده را ذخیره میکنیم و حالا یک فایل گو با عنوان main.go داریم.
== اجرای اولین برنامه ==
<div dir='rtl'>
برای اجرای برنامه در دایرکتوری که فایل را ساختیم cmd را باز میکنیم.و متن زیر را تایپ کرده و اینتر میزنیم:
go run main.go
go به معنای فراخوانی زبان برنامه نویسی است.<br>
run برای اجرای برنامه استفاده میشود.<br>
main.go اسم فایلی است که ساختیم توجه کنید فایل های کد زبان گو با پسوند .go هستند.
<div/>
برنامه بالا یک پیغام با محتوای "!!!Hello world" در کنسول چاپ میکند.
[[رده:زبان برنامهنویسی گو]]
krw5mvshrfks6englghxngm8en65md5
135036
135035
2026-09-19T15:33:42Z
Vivairan2
28134
/* ساخت اولین */
135036
wikitext
text/x-wiki
{{سرصفحه
| عنوان = اولین برنامه
| قسمت =
| قبلی = [[زبان برنامهنویسی گو/مقدمه|مقدمه]]
| بعدی = [[زبان برنامهنویسی گو/ساختارکد|ساختارکد]]
| یادداشت = [[زبان برنامهنویسی گو]]
}}
== ساخت اولین ==
برای ساخت اولین برنامه ابتدا ویرایشگر خود را باز کرده و یک فایل جدید مثلا با نام main با همراه پسوند .go درست میکنیم.<br>
و کد برنامه را داخل آن مینویسم:
<div dir='ltr'>
package main
import "fmt"
func main() {
fmt.Println("Hello world!!!")
}
<div/>
<div/>
در انتها، فایل ساخته شده را ذخیره میکنیم و حالا یک فایل گو با عنوان main.go داریم.
== اجرای اولین برنامه ==
<div dir='rtl'>
برای اجرای برنامه در دایرکتوری که فایل را ساختیم cmd را باز میکنیم.و متن زیر را تایپ کرده و اینتر میزنیم:
go run main.go
go به معنای فراخوانی زبان برنامه نویسی است.<br>
run برای اجرای برنامه استفاده میشود.<br>
main.go اسم فایلی است که ساختیم توجه کنید فایل های کد زبان گو با پسوند .go هستند.
<div/>
برنامه بالا یک پیغام با محتوای "!!!Hello world" در کنسول چاپ میکند.
[[رده:زبان برنامهنویسی گو]]
9y1u2orrs9tewz2lukpyeg6fjhlmu3q
135037
135036
2026-09-19T15:34:18Z
Vivairan2
28134
/* ساخت اولین */
135037
wikitext
text/x-wiki
{{سرصفحه
| عنوان = اولین برنامه
| قسمت =
| قبلی = [[زبان برنامهنویسی گو/مقدمه|مقدمه]]
| بعدی = [[زبان برنامهنویسی گو/ساختارکد|ساختارکد]]
| یادداشت = [[زبان برنامهنویسی گو]]
}}
== ساخت اولین ==
برای ساخت اولین برنامه ابتدا ویرایشگر خود را باز کرده و یک فایل جدید مثلا با نام main با همراه پسوند .go درست میکنیم.<br>
و کد برنامه را داخل آن مینویسم:
<div dir='ltr'>
package main
import "fmt"
func main() {
fmt.Println("Hello world!!!")
}
</div>
<div>
در انتها، فایل ساخته شده را ذخیره میکنیم و حالا یک فایل گو با عنوان main.go داریم.
== اجرای اولین برنامه ==
<div dir='rtl'>
برای اجرای برنامه در دایرکتوری که فایل را ساختیم cmd را باز میکنیم.و متن زیر را تایپ کرده و اینتر میزنیم:
go run main.go
go به معنای فراخوانی زبان برنامه نویسی است.<br>
run برای اجرای برنامه استفاده میشود.<br>
main.go اسم فایلی است که ساختیم توجه کنید فایل های کد زبان گو با پسوند .go هستند.
<div/>
برنامه بالا یک پیغام با محتوای "!!!Hello world" در کنسول چاپ میکند.
[[رده:زبان برنامهنویسی گو]]
b8zcw5evdkm6vs1drowu36iwzv7bybd
135055
135037
2026-09-19T18:45:42Z
Fwldom
26269
/* ساخت اولین */
135055
wikitext
text/x-wiki
{{سرصفحه
| عنوان = اولین برنامه
| قسمت =
| قبلی = [[زبان برنامهنویسی گو/مقدمه|مقدمه]]
| بعدی = [[زبان برنامهنویسی گو/ساختارکد|ساختارکد]]
| یادداشت = [[زبان برنامهنویسی گو]]
}}
== ساخت اولین ==
برای ساخت اولین برنامه ابتدا ویرایشگر خود را باز کرده و یک فایل جدید مثلا با نام main با همراه پسوند .go درست میکنیم.<br>
و کد برنامه را داخل آن مینویسم:
<syntaxhighlight lang='golang'>
package main
import "fmt"
func main() {
fmt.Println("Hello world!!!")
}
</syntaxhighlight >
در انتها، فایل ساخته شده را ذخیره میکنیم و حالا یک فایل گو با عنوان main.go داریم.
== اجرای اولین برنامه ==
<div dir='rtl'>
برای اجرای برنامه در دایرکتوری که فایل را ساختیم cmd را باز میکنیم.و متن زیر را تایپ کرده و اینتر میزنیم:
go run main.go
go به معنای فراخوانی زبان برنامه نویسی است.<br>
run برای اجرای برنامه استفاده میشود.<br>
main.go اسم فایلی است که ساختیم توجه کنید فایل های کد زبان گو با پسوند .go هستند.
<div/>
برنامه بالا یک پیغام با محتوای "!!!Hello world" در کنسول چاپ میکند.
[[رده:زبان برنامهنویسی گو]]
3cpuupofpda6tb83uhts48zn0m3ovsy
135056
135055
2026-09-19T18:47:25Z
Fwldom
26269
135056
wikitext
text/x-wiki
{{سرصفحه
| عنوان = اولین برنامه
| قسمت =
| قبلی = [[زبان برنامهنویسی گو/مقدمه|مقدمه]]
| بعدی = [[زبان برنامهنویسی گو/ساختارکد|ساختارکد]]
| یادداشت = [[زبان برنامهنویسی گو]]
}}
== ساخت اولین ==
برای ساخت اولین برنامه ابتدا ویرایشگر خود را باز کرده و یک فایل جدید مثلا با نام main با همراه پسوند .go درست میکنیم.<br>
و کد برنامه را داخل آن مینویسم:
<syntaxhighlight lang='golang'>
package main
import "fmt"
func main() {
fmt.Println("Hello world!!!")
}
</syntaxhighlight>
در انتها، فایل ساخته شده را ذخیره میکنیم و حالا یک فایل گو با نام main.go داریم.
== اجرای اولین برنامه ==
<div dir='rtl'>
برای اجرای برنامه در دایرکتوری که فایل را ساختیم cmd را باز میکنیم.و متن زیر را تایپ کرده و اینتر میزنیم:
<syntaxhighlight lang='cmd'>
go run main.go
</syntaxhighlight>
go به معنای فراخوانی زبان برنامه نویسی است.<br>
run برای اجرای برنامه استفاده میشود.<br>
main.go اسم فایلی است که ساختیم توجه کنید فایل های کد زبان گو با پسوند .go هستند.
<div/>
برنامه بالا یک پیغام با محتوای "!!!Hello world" در کنسول چاپ میکند.
[[رده:زبان برنامهنویسی گو]]
mnu3hy9qz4w2v26in6992j22nqtczbv
135057
135056
2026-09-19T18:47:55Z
Fwldom
26269
135057
wikitext
text/x-wiki
{{سرصفحه
| عنوان = اولین برنامه
| قسمت =
| قبلی = [[زبان برنامهنویسی گو/مقدمه|مقدمه]]
| بعدی = [[زبان برنامهنویسی گو/ساختارکد|ساختارکد]]
| یادداشت = [[زبان برنامهنویسی گو]]
}}
== ایجاد اولین برنامه (سلام دنیا!) ==
برای ساخت اولین برنامه ابتدا ویرایشگر خود را باز کرده و یک فایل جدید مثلا با نام main با همراه پسوند .go درست میکنیم.<br>
و کد برنامه را داخل آن مینویسم:
<syntaxhighlight lang='golang'>
package main
import "fmt"
func main() {
fmt.Println("Hello world!!!")
}
</syntaxhighlight>
در انتها، فایل ساخته شده را ذخیره میکنیم و حالا یک فایل گو با نام main.go داریم.
== اجرای اولین برنامه ==
<div dir='rtl'>
برای اجرای برنامه در دایرکتوری که فایل را ساختیم cmd را باز میکنیم.و متن زیر را تایپ کرده و اینتر میزنیم:
<syntaxhighlight lang='cmd'>
go run main.go
</syntaxhighlight>
go به معنای فراخوانی زبان برنامه نویسی است.<br>
run برای اجرای برنامه استفاده میشود.<br>
main.go اسم فایلی است که ساختیم توجه کنید فایل های کد زبان گو با پسوند .go هستند.
<div/>
برنامه بالا یک پیغام با محتوای "!!!Hello world" در کنسول چاپ میکند.
[[رده:زبان برنامهنویسی گو]]
caofae6lrd7a0n070xtihvqybxzisfi
زبان برنامهنویسی گو/ساختارکد
0
40039
135038
127700
2026-09-19T15:35:34Z
Vivairan2
28134
حذف مطالب نامرتبط با موضوع کتاب
135038
wikitext
text/x-wiki
{{سرصفحه
| عنوان = ساختارکد
| قسمت =
| قبلی = [[زبان برنامهنویسی گو/اولین برنامه|اولین برنامه]]
| بعدی = [[زبان برنامهنویسی گو/عناصر لغوی|عناصر لغوی]]
| یادداشت = [[زبان برنامهنویسی گو]]
}}
== سینتکس زبان برنامه نویسی چیست؟ ==
سینتکس یا نحوه در برنامهنویسی فرم نوشتن آن را مشخص میکند و هنگامی که یک قسمت از کد زبان برنامهنویسی مشکلی از نظر نحوه قرار گرفتن کلمات و عبارات در کنار یکدیگر به وجود آید و با قوانین نگارشی مطابقت نداشته باشد Syntax Error رخ میدهد.
== سینتکس زبان گو به چه گونه است؟ ==
سینتکس زبان گو به گونهای طراحی شده که ساده و تمیز است و این باعث میشود سریع زبان گو را فرا بگیرید و از همه مهمتر توسعه پروژههای مقیاس پذیر با زبان گو به دلیل سادگی و آشکار بودن مفاهیم سریعتر صورت گیرد.
== پکیجها (بستهها) ==
هر برنامهای که با ساختار گو ایجاد شده باشد، از پکیج(ها) به وجود آمده است. درواقع زبان گو یک زبان بر پایه پکیج (بسته) است. برخلاف برخی دیگر که بر پایه فایل هستند. این به این معنی است که به «مجموعه» ای از ابزارها اعم از ثابتها، متغیرها و عملیات مختلف که زیرمجموعه یک نام تعریف میشوند، پکیج (بسته) میگوئیم. تفاوتی ندارد در یک «فایل» یا «چند» فایل، بشرطی که ابتدای همگی{{سخ}}
package name باشند.{{سخ}}
[[رده:زبان برنامهنویسی گو]]
qi2cgvvcg4topv4g5pwbymh2d4y3033
135058
135038
2026-09-19T18:48:43Z
Fwldom
26269
/* سینتکس زبان برنامه نویسی چیست؟ */
135058
wikitext
text/x-wiki
{{سرصفحه
| عنوان = ساختارکد
| قسمت =
| قبلی = [[زبان برنامهنویسی گو/اولین برنامه|اولین برنامه]]
| بعدی = [[زبان برنامهنویسی گو/عناصر لغوی|عناصر لغوی]]
| یادداشت = [[زبان برنامهنویسی گو]]
}}
== سینتکس زبان برنامه نویسی چیست؟ ==
سینتکس یا نحو در برنامهنویسی فرم نوشتن کدها را مشخص میکند و هنگامی که یک قسمت از کد زبان برنامهنویسی مشکلی از نظر نحوه قرار گرفتن کلمات و عبارات در کنار یکدیگر به وجود آید و با قوانین نگارشی مطابقت نداشته باشد '''Syntax Error''' رخ میدهد.
== سینتکس زبان گو به چه گونه است؟ ==
سینتکس زبان گو به گونهای طراحی شده که ساده و تمیز است و این باعث میشود سریع زبان گو را فرا بگیرید و از همه مهمتر توسعه پروژههای مقیاس پذیر با زبان گو به دلیل سادگی و آشکار بودن مفاهیم سریعتر صورت گیرد.
== پکیجها (بستهها) ==
هر برنامهای که با ساختار گو ایجاد شده باشد، از پکیج(ها) به وجود آمده است. درواقع زبان گو یک زبان بر پایه پکیج (بسته) است. برخلاف برخی دیگر که بر پایه فایل هستند. این به این معنی است که به «مجموعه» ای از ابزارها اعم از ثابتها، متغیرها و عملیات مختلف که زیرمجموعه یک نام تعریف میشوند، پکیج (بسته) میگوئیم. تفاوتی ندارد در یک «فایل» یا «چند» فایل، بشرطی که ابتدای همگی{{سخ}}
package name باشند.{{سخ}}
[[رده:زبان برنامهنویسی گو]]
28ttlpy4jpzeaz78jsp4459nv6jrhao
135059
135058
2026-09-19T18:49:17Z
Fwldom
26269
/* پکیجها (بستهها) */
135059
wikitext
text/x-wiki
{{سرصفحه
| عنوان = ساختارکد
| قسمت =
| قبلی = [[زبان برنامهنویسی گو/اولین برنامه|اولین برنامه]]
| بعدی = [[زبان برنامهنویسی گو/عناصر لغوی|عناصر لغوی]]
| یادداشت = [[زبان برنامهنویسی گو]]
}}
== سینتکس زبان برنامه نویسی چیست؟ ==
سینتکس یا نحو در برنامهنویسی فرم نوشتن کدها را مشخص میکند و هنگامی که یک قسمت از کد زبان برنامهنویسی مشکلی از نظر نحوه قرار گرفتن کلمات و عبارات در کنار یکدیگر به وجود آید و با قوانین نگارشی مطابقت نداشته باشد '''Syntax Error''' رخ میدهد.
== سینتکس زبان گو به چه گونه است؟ ==
سینتکس زبان گو به گونهای طراحی شده که ساده و تمیز است و این باعث میشود سریع زبان گو را فرا بگیرید و از همه مهمتر توسعه پروژههای مقیاس پذیر با زبان گو به دلیل سادگی و آشکار بودن مفاهیم سریعتر صورت گیرد.
== پکیجها (بستهها) ==
هر برنامهای که با ساختار گو ایجاد شده باشد، از پکیج(ها) به وجود آمده است. درواقع زبان گو یک زبان بر پایه پکیج (بسته) است. برخلاف برخی دیگر که بر پایه فایل هستند. این به این معنی است که به «مجموعه» ای از ابزارها اعم از ثابتها، متغیرها و عملیات مختلف که زیرمجموعه یک نام تعریف میشوند، پکیج (بسته) میگوئیم. تفاوتی ندارد در یک «فایل» یا «چند» فایل، بشرطی که ابتدای همگی package name باشند.{{سخ}}
[[رده:زبان برنامهنویسی گو]]
ew5jkjjl8qe2wxuh0hq2dbfww2vaki7
زبان برنامهنویسی گو/عناصر لغوی
0
40070
135039
128589
2026-09-19T15:36:51Z
Vivairan2
28134
/* کامنتها (نظرات یا توضیحات) */ ابرابزار
135039
wikitext
text/x-wiki
{{سرصفحه
| عنوان = عناصر لغوی
| قسمت =
| قبلی = [[زبان برنامهنویسی گو/ساختارکد|ساختار کد برنامهنویسی گو]]
| بعدی = [[زبان برنامهنویسی گو/متغیرها|متغیرها]]
| یادداشت = [[زبان برنامهنویسی گو]]
}}
== کامنتها (نظرات یا توضیحات) ==
کامنتها متنهایی که به قصد یادآوری یا توضیحاتی در مورد موضوعی به کدها اضافه میشوند.
* نکته: کامنتها هیچ وقت اجرا نمیشوند؛ و متنی است برای خوانندگان بعدی کد.
=== روشهای کامنت گذاری ===
* استفاده از // در ابتدای سطرها: به کد زیر نگاه کنید.
{{چپچین}}
<syntaxhighlight lang=go>
// this is a comment
fmt.Println("Hello world!!!")
</syntaxhighlight>
{{پایان چپچین}}
* قرار دادن متن در بلوکی که با */ شروع و با /* پایان یابد. به تیکه کد زیر توجه کنید.
{{چپچین}}
<syntaxhighlight lang=go>
row /* for life */ = "new_val"
fmt.Println("Hello world!!!")
</syntaxhighlight>
{{پایان چپچین}}
=== اهمیت نوشتن کامنت ===
«کامنتها» گزارش «چرایی» کد هست.
یعنی این تیکه کد چکاری انجام میدهد یا برای مثال این تیکه کد اشکال دارد و باید رفع شود.
[[رده:زبان برنامهنویسی گو]]
7qst6mjvht6wgevsj1n8oqgr9ilppn8
135060
135039
2026-09-19T18:50:44Z
Fwldom
26269
/* اهمیت نوشتن کامنت */
135060
wikitext
text/x-wiki
{{سرصفحه
| عنوان = عناصر لغوی
| قسمت =
| قبلی = [[زبان برنامهنویسی گو/ساختارکد|ساختار کد برنامهنویسی گو]]
| بعدی = [[زبان برنامهنویسی گو/متغیرها|متغیرها]]
| یادداشت = [[زبان برنامهنویسی گو]]
}}
== کامنتها (نظرات یا توضیحات) ==
کامنتها متنهایی که به قصد یادآوری یا توضیحاتی در مورد موضوعی به کدها اضافه میشوند.
* نکته: کامنتها هیچ وقت اجرا نمیشوند؛ و متنی است برای خوانندگان بعدی کد.
=== روشهای کامنت گذاری ===
* استفاده از // در ابتدای سطرها: به کد زیر نگاه کنید.
{{چپچین}}
<syntaxhighlight lang=go>
// this is a comment
fmt.Println("Hello world!!!")
</syntaxhighlight>
{{پایان چپچین}}
* قرار دادن متن در بلوکی که با */ شروع و با /* پایان یابد. به تیکه کد زیر توجه کنید.
{{چپچین}}
<syntaxhighlight lang=go>
row /* for life */ = "new_val"
fmt.Println("Hello world!!!")
</syntaxhighlight>
{{پایان چپچین}}
=== اهمیت نوشتن کامنت ===
«کامنتها» گزارش «چرایی» کد هست.
یعنی این تیکه کد چکاری انجام میدهد یا برای مثال این تیکه کد اشکال دارد و باید رفع شود.
در واقع کامنت های به توسعه دهندگان بعدی میگوید عملکرد کد به چه صورت است. ورودی و خروجی کد چه خواهد بود که توسعه دهندگان بعدی راحت تر بتوانند کد را ویرایش کنند و برنامه را توسعه بدهند.
[[رده:زبان برنامهنویسی گو]]
0cezv5ujxmw81g0472fw9pkq88lu33j
زبان برنامهنویسی گو/متغیرها
0
40303
135061
128592
2026-09-19T18:51:48Z
Fwldom
26269
135061
wikitext
text/x-wiki
{{سرصفحه
| عنوان = متغیرها
| قسمت =
| قبلی = [[زبان برنامهنویسی گو/عناصر لغوی|عناصر لغوی]]
| بعدی = [[زبان برنامهنویسی گو/ثابتها|ثابتها]]
| یادداشت = [[زبان برنامهنویسی گو]]
}}
== متغیر چیست؟ ==
متغیرها در برنامهنویسی رایانهای یک مکان در حافظه هستند که حاوی یک نام و مقدار (ارزش) هستند.
در واقع از آنها برای ذخیره اطلاعات در برنامهها استفاده میشود.
== ایجاد یک متغیر در گو ==
<syntaxhighlight lang='golang'>
"var s string = "Hello World
fmt.Println(s)
</syntaxhighlight >
کد بالا یک متغیر با نام s و مقدار Hello World با نوع رشته درست میکند در صفحات بعدی به ثابتها و انواع متغیرها خواهیم پرداخت.
== مقداردهی جدید به متغیر قبلی ==
برای مقدار دهی به متغیر از قبل ساخته شده اسم آن را صدا میزنیم و با علامت = بر جلوی آن دوباره آن را مقدار دهی میکنیم.
<syntaxhighlight lang='golang'>
"s = "newText
</syntaxhighlight>
تیکه کد بالا، متغیر s را با مقدار newText دوباره مقدار دهی میکند.
[[رده:زبان برنامهنویسی گو]]
ar6r3oi0o3y7gadyx2mtg4qf72oa2aq
135062
135061
2026-09-19T18:52:30Z
Fwldom
26269
/* مقداردهی جدید به متغیر قبلی */
135062
wikitext
text/x-wiki
{{سرصفحه
| عنوان = متغیرها
| قسمت =
| قبلی = [[زبان برنامهنویسی گو/عناصر لغوی|عناصر لغوی]]
| بعدی = [[زبان برنامهنویسی گو/ثابتها|ثابتها]]
| یادداشت = [[زبان برنامهنویسی گو]]
}}
== متغیر چیست؟ ==
متغیرها در برنامهنویسی رایانهای یک مکان در حافظه هستند که حاوی یک نام و مقدار (ارزش) هستند.
در واقع از آنها برای ذخیره اطلاعات در برنامهها استفاده میشود.
== ایجاد یک متغیر در گو ==
<syntaxhighlight lang='golang'>
"var s string = "Hello World
fmt.Println(s)
</syntaxhighlight >
کد بالا یک متغیر با نام s و مقدار Hello World با نوع رشته درست میکند در صفحات بعدی به ثابتها و انواع متغیرها خواهیم پرداخت.
== مقداردهی جدید به متغیر قبلی ==
برای مقدار دهی به متغیر از قبل ساخته شده اسم آن را صدا میزنیم و با علامت = بر جلوی آن دوباره آن را مقدار دهی میکنیم.
<syntaxhighlight lang='golang'>
s = "newText"
</syntaxhighlight>
تیکه کد بالا، متغیر s را با مقدار newText دوباره مقدار دهی میکند.
[[رده:زبان برنامهنویسی گو]]
4ox6uclgff0sbee6ocwxoy8da5chckf
135063
135062
2026-09-19T18:52:51Z
Fwldom
26269
/* ایجاد یک متغیر در گو */
135063
wikitext
text/x-wiki
{{سرصفحه
| عنوان = متغیرها
| قسمت =
| قبلی = [[زبان برنامهنویسی گو/عناصر لغوی|عناصر لغوی]]
| بعدی = [[زبان برنامهنویسی گو/ثابتها|ثابتها]]
| یادداشت = [[زبان برنامهنویسی گو]]
}}
== متغیر چیست؟ ==
متغیرها در برنامهنویسی رایانهای یک مکان در حافظه هستند که حاوی یک نام و مقدار (ارزش) هستند.
در واقع از آنها برای ذخیره اطلاعات در برنامهها استفاده میشود.
== ایجاد یک متغیر در گو ==
<syntaxhighlight lang='golang'>
var s string = "Hello World"
fmt.Println(s)
</syntaxhighlight >
کد بالا یک متغیر با نام s و مقدار Hello World با نوع رشته درست میکند در صفحات بعدی به ثابتها و انواع متغیرها خواهیم پرداخت.
== مقداردهی جدید به متغیر قبلی ==
برای مقدار دهی به متغیر از قبل ساخته شده اسم آن را صدا میزنیم و با علامت = بر جلوی آن دوباره آن را مقدار دهی میکنیم.
<syntaxhighlight lang='golang'>
s = "newText"
</syntaxhighlight>
تیکه کد بالا، متغیر s را با مقدار newText دوباره مقدار دهی میکند.
[[رده:زبان برنامهنویسی گو]]
iicnrf6tqee5vant2l3pygddq3in1v0
زبان برنامهنویسی گو/ثابتها
0
40318
135064
128651
2026-09-19T19:03:46Z
Fwldom
26269
135064
wikitext
text/x-wiki
{{سرصفحه
| عنوان = ثابتها
| قسمت =
| قبلی = [[زبان برنامهنویسی گو/متغیرها|متغیرها]]
| بعدی = [[زبان برنامهنویسی گو/تایپها (نوعها)|تایپها (نوعها)]]
| یادداشت = [[زبان برنامهنویسی گو]]
}}
== ثابت (Constant) چیست؟ ==
ثابتها در واقع همانند متغیر ها عمل میکنند فقط با فرق اینکه ثابتها پس از تعریف آن دیگر قابل تغییر نیستند.
* نکته: کاربرد ثابتها در مقادیر ثابت است مثل نرخ مالیات و Pi.
== تعریف ثابت (چگونه) ==
برای تعریف ثابت همانند متغیر ها عمل میکنیم و فقط بجای کلمه کلیدی var از const استفاده میکنیم.
مثال:
<syntaxhighlight lang='golang'>
const Pi int = 3
const pi = 3.3
</syntaxhighlight>
تیکه کد بالا یک ثابت با نام Pi و نوع عددی (int) درست میکند و یک متغیر با نام pi نوع نامشخص درست میکند.
== مثال ها ==
<syntaxhighlight lang=go>
package main
import "fmt"
func main() {
const taxRate float64 = 0.08
var price float64 = 100.0
tax := price * taxRate
fmt.Println("Tax:", tax)
finalPrice := price + tax
fmt.Println("Final Price:", finalPrice)
}
</syntaxhighlight>
در کد بالا به ترتیب عملهای زیر را انجام دادیم:
* تابع main (تابع اصلی برنامه) ایجاد کردیم.
* یک ثابت با نام taxRate (نرخ مالیات) از نوع float64 (اعشاری)ایجاد کردیم با مقدار 0.08.
* یک ثابت با نام price (فیمت) از نوع float64 ایجاد کردیم با مقدار 100.0.
* مقدار مالیات را حساب کردیم و داخل متغیر tax گذاشتیم و آن را چاپ کردیم.
* قیمت را با مالیات جمع کردیم و قیمت جدید را داخل متغیر finalPrice گذاشتیم و آن را چاپ کردیم.
[[زبان برنامهنویسی گو/منابع آموزشی آنلاین#Go_Playground|تست برنامه در Go Playground]]
[[رده:زبان برنامهنویسی گو]]
ojoo1p4nvkwvdk5obowfqpy4r553g1f
زبان برنامهنویسی گو/شرط ها if , else , switch
0
40449
135040
130033
2026-09-19T15:45:13Z
Vivairan2
28134
/* ساختار شروط در زبان برنامه نویسی گو */
135040
wikitext
text/x-wiki
{{سرصفحه
| عنوان = شرط ها if , else , switch
| قسمت =
| قبلی = [[زبان برنامهنویسی گو/عملگرها و عبارات|عملگرها و عبارات]]
| بعدی = [[زبان برنامهنویسی گو/اسلایسها|اسلایسها (Slices)]]
| یادداشت = [[زبان برنامهنویسی گو]]
}}
== ساختار شروط در زبان برنامه نویسی گو ==
برنامهنویسان از شروط برای بررسی یک موقعیت و تصمیم گیری برای اجرای یک کد یا کد دیگر استفاده میکنند.<br>
* برای مثال یک برنامه بنویسید که از کاربر سنش را بپرسد، و اگر (if) سن کاربر بالای 18 بود یک پیغام و در غیر اینصورت (else) پیغام دیگری را نمایش بدهد.
* برای درست کردن یک شرط از عملگرهای مقایسه استفاده میکنیم که دو جواب true یا false به ما برمیگردانند.
*اگر جواب درست (true) باشد، تیکه کد اعلام شده بعد از if اجرا خواهد شد در غیر اینصورت این تیکه را نادیده میگیرد و در صورت وجود else بعد از پایان کد آن را اجرا میکند
<syntaxhighlight lang="go">
package main
import (
"fmt"
)
func main() {
var age int
// گرفتن سن از کاربر
fmt.Print("لطفاً سن خود را وارد کنید: ")
fmt.Scan(&age)
// بررسی سن کاربر و نمایش پیغام مناسب
if age > 18 {
fmt.Println("شما بالای 18 سال هستید، خوش آمدید!")
} else {
fmt.Println("شما زیر 18 سال هستید، دسترسی محدود است.")
}
}
</syntaxhighlight>
کد بالا مراحل زیر را انجام میدهد.
* اول یک متغیر با نام age (سن) میسازد، سپس پیغامی را به کاربر مبنی بر وارد کردن سن نمایش میدهد.
* ورودی را از کاربر میگیرد.
* اگر (if) بالای ۱۸ بود پیغام شما بالای ۱۸ سال هستید را نمایش میدهد.
* در غیر اینصورت پیغام دسترسی محدود است را نمایش میدهد.
* همچنین میتوانید سطحهای دسترسی برای کاربران بر اساس سنشون رو در همین کد پیادهسازی بکنید.
در بعد از (if) else را پاک کنید و از کد زیر استفاده کنید.
<syntaxhighlight lang="go">
else if age > 15 {
fmt.Println("شما با دسترسی محدود به سرویس متصل شدید.")
} else {
fmt.Println("شما زیر 15 سال هستید، شما نمیتوانید از برنامه استفاده کنید.")
}
</syntaxhighlight>
== تمرین ==
* یک برنامه بنویسید که درجه گرمای هوای کاربر را بگیرد و اگر بالای 35 بود، به کاربر بگوید گرم است و اگر پایین تر از 20 درجه بود، به کاربر بگوید سرد است و در غیر اینصورت بگوید هوا متعادل است.
* یک ماشین حساب بنویسید که عمل های + ، - ، / را انجام دهد، از عملگر ها استفاده کنید.
برای پیدا کردن کد تمرین ها به صفحه [[زبان برنامهنویسی گو/حل تمرینها|حل تمرینها]] بروید.
[[رده:زبان برنامهنویسی گو]]
plmbzx38oxl09jeanahge3a5o1issvi
135041
135040
2026-09-19T15:45:41Z
Vivairan2
28134
135041
wikitext
text/x-wiki
{{سرصفحه
| عنوان = شرط ها if , else , switch
| قسمت =
| قبلی = [[زبان برنامهنویسی گو/عملگرها و عبارات|عملگرها و عبارات]]
| بعدی = [[زبان برنامهنویسی گو/اسلایسها|اسلایسها (Slices)]]
| یادداشت = [[زبان برنامهنویسی گو]]
}}
== ساختار شروط در زبان برنامه نویسی گو ==
برنامهنویسان از شروط برای بررسی یک موقعیت و تصمیم گیری برای اجرای یک کد یا کد دیگر استفاده میکنند.<br>
* برای مثال یک برنامه بنویسید که از کاربر سنش را بپرسد، و اگر (if) سن کاربر بالای 18 بود یک پیغام و در غیر اینصورت (else) پیغام دیگری را نمایش بدهد.
* برای درست کردن یک شرط از عملگرهای مقایسه استفاده میکنیم که دو جواب true یا false به ما برمیگردانند.
*اگر جواب درست (true) باشد، تیکه کد اعلام شده بعد از if اجرا خواهد شد در غیر اینصورت این تیکه را نادیده میگیرد و در صورت وجود else بعد از پایان کد آن را اجرا میکند
<syntaxhighlight lang="go">
package main
import (
"fmt"
)
func main() {
var age int
// گرفتن سن از کاربر
fmt.Print("لطفاً سن خود را وارد کنید: ")
fmt.Scan(&age)
// بررسی سن کاربر و نمایش پیغام مناسب
if age > 18 {
fmt.Println("شما بالای 18 سال هستید، خوش آمدید!")
} else {
fmt.Println("شما زیر 18 سال هستید، دسترسی محدود است.")
}
}
</syntaxhighlight>
کد بالا مراحل زیر را انجام میدهد.
* اول یک متغیر با نام age (سن) میسازد، سپس پیغامی را به کاربر مبنی بر وارد کردن سن نمایش میدهد.
* ورودی را از کاربر میگیرد.
* اگر (if) بالای ۱۸ بود پیغام شما بالای ۱۸ سال هستید را نمایش میدهد.
* در غیر اینصورت پیغام دسترسی محدود است را نمایش میدهد.
* همچنین میتوانید سطحهای دسترسی برای کاربران بر اساس سنشون رو در همین کد پیادهسازی بکنید.
در بعد از (if) else را پاک کنید و از کد زیر استفاده کنید.
<syntaxhighlight lang="go">
else if age > 15 {
fmt.Println("شما با دسترسی محدود به سرویس متصل شدید.")
} else {
fmt.Println("شما زیر 15 سال هستید، شما نمیتوانید از برنامه استفاده کنید.")
}
</syntaxhighlight>
== تمرین ==
* یک برنامه بنویسید که درجه گرمای هوای کاربر را بگیرد و اگر بالای ۳۵ بود، به کاربر بگوید گرم است و اگر پایینتر از ۲۰ درجه بود، به کاربر بگوید سرد است و در غیر اینصورت بگوید هوا متعادل است.
* یک ماشین حساب بنویسید که عملهای +، ، / را انجام دهد، از عملگرها استفاده کنید.
برای پیدا کردن کد تمرینها به صفحه [[زبان برنامهنویسی گو/حل تمرینها|حل تمرینها]] بروید.
[[رده:زبان برنامهنویسی گو]]
pgaeawc1v1dqjhy5k2pfa1obc2vh8bz
زبان برنامهنویسی گو/تعریف و استفاده از توابع
0
41330
135043
132081
2026-09-19T16:02:48Z
Vivairan2
28134
افزودن سرصفحه
135043
wikitext
text/x-wiki
{{سرصفحه
| عنوان = تعریف و استفاده از توابع
| قسمت =
| قبلی = [[زبان برنامهنویسی گو/اشارهگرها (Pointers)|اشارهگرها]]
| بعدی = [[زبان برنامهنویسی گو/آرگومانها و مقادیر بازگشتی|آرگومانها و مقادیر بازگشتی]]
| یادداشت = [[زبان برنامهنویسی گو]]
}}
== مقدمه ==
توابع (Functions) در زبان برنامهنویسی Go، بلوکهایی از کد هستند که برای انجام کارهای مشخص تعریف میشوند و میتوانند چندین بار فراخوانی شوند. استفاده از توابع به سازماندهی بهتر کد، جلوگیری از تکرار و افزایش خوانایی کمک میکند.
=== تعریف تابع ===
تابع در Go با کلیدواژه <code>func</code> تعریف میشود. ساختار کلی تابع به شکل زیر است:
<syntaxhighlight lang="go">
func نام_تابع(پارامترها) بازگشتی {
// بدنه تابع
}
</syntaxhighlight>
- <code>نام_تابع</code>: نام تابع که باید با حرف کوچک یا بزرگ شروع شود. توابع با نام بزرگ قابل دسترسی از بستههای دیگر هستند (public).
- <code>پارامترها</code>: لیستی از ورودیهای تابع به صورت نام و نوع (اختیاری).
- <code>بازگشتی</code>: نوع دادهای که تابع بازمیگرداند (اختیاری).
=== مثالهای تعریف و استفاده از تابع ===
تعریف تابع ساده بدون ورودی و خروجی:
<syntaxhighlight lang="go">
func greet() {
println("سلام دنیا!")
}
</syntaxhighlight>
فراخوانی تابع:
<syntaxhighlight lang="go">
func main() {
greet()
}
</syntaxhighlight>
تعریف تابع با پارامتر ورودی:
<syntaxhighlight lang="go">
func greetName(name string) {
println("سلام، " + name + "!")
}
</syntaxhighlight>
فراخوانی تابع با آرگومان:
<syntaxhighlight lang="go">
func main() {
greetName("علی")
}
</syntaxhighlight>
تعریف تابع با مقدار بازگشتی:
<syntaxhighlight lang="go">
func add(a int, b int) int {
return a + b
}
</syntaxhighlight>
استفاده از مقدار بازگشتی:
<syntaxhighlight lang="go">
func main() {
sum := add(3, 5)
println("مجموع:", sum)
}
</syntaxhighlight>
=== توابع با چند مقدار بازگشتی ===
گو اجازه میدهد توابع چند مقدار به صورت همزمان بازگردانند:
<syntaxhighlight lang="go">
func swap(a, b string) (string, string) {
return b, a
}
</syntaxhighlight>
فراخوانی تابع چند خروجی:
<syntaxhighlight lang="go">
func main() {
x, y := swap("سلام", "دنیا")
println(x, y) // خروجی: دنیا سلام
}
</syntaxhighlight>
=== توابع نامدار و ناشناس (Anonymous Functions) ===
میتوان توابع را به صورت ناشناس تعریف کرد و در متغیر ذخیره یا مستقیم فراخوانی کرد:
<syntaxhighlight lang="go">
// تابع ناشناس ذخیره شده در متغیر
var sayHello = func(name string) {
println("سلام، " + name)
}
func main() {
sayHello("علی")
}
</syntaxhighlight>
=== نکات مهم ===
* نام تابع باید با حروف لاتین و مطابق قواعد نامگذاری باشد.
* توابع میتوانند پارامتر و مقدار بازگشتی نداشته باشند.
* توابع در بستهها به عنوان واحدهای جداگانه و قابل استفاده مجدد طراحی میشوند.
* میتوان توابع را در توابع دیگر نیز تعریف کرد (Nested Functions) اما معمولاً کمتر استفاده میشود.
=== جمعبندی ===
توابع از مهمترین بخشهای زبان Go هستند که کد شما را منظم، قابل خواندن و قابل نگهداری میکنند. با تعریف مناسب پارامترها و مقادیر بازگشتی میتوانید رفتارهای پیچیده و کاربردی را به سادگی پیاده کنید.
[[رده:زبان برنامهنویسی گو]]
0ziabggpdu221bojz28cyhvexvl2m9l
زبان برنامهنویسی گو/آرگومانها و مقادیر بازگشتی
0
41493
135045
132717
2026-09-19T16:21:11Z
Vivairan2
28134
135045
wikitext
text/x-wiki
{{سرصفحه
| عنوان = نقشهها (Maps)
| قسمت =
| قبلی = [[زبان برنامهنویسی گو/تعریف و استفاده از توابع|تعریف و استفاده از توابع]]
| بعدی = [[زبان برنامهنویسی گو/توابع ناشناس و توابع به عنوان مقادیر|توابع ناشناس و توابع به عنوان مقادیر]]
| یادداشت = [[زبان برنامهنویسی گو]]
}}
== زبان برنامهنویسی گو: آرگومانها و مقادیر بازگشتی ==
توابع در زبان گو برای دریافت ورودی (آرگومانها) و برگرداندن خروجی (مقادیر بازگشتی) استفاده میشوند. این قابلیت باعث میشود بتوانیم بخشهای مختلف برنامه را ماژولار، قابلاستفاده مجدد و خوانا طراحی کنیم.
== آرگومانها (Arguments) ==
وقتی یک تابع تعریف میکنیم، میتوانیم در پرانتز آن متغیرهایی بهعنوان پارامتر مشخص کنیم. هنگام فراخوانی تابع، باید مقادیر مربوط به این پارامترها را ارسال کنیم.
<syntaxhighlight lang="go">
package main
import "fmt"
func greet(name string, age int) {
fmt.Println("سلام", name, "شما", age, "ساله هستید.")
}
func main() {
greet("علی", 25)
greet("سارا", 30)
}
</syntaxhighlight>
در مثال بالا:
* تابع greet دو آرگومان دارد: یک رشته (string) و یک عدد صحیح (int).
* هنگام فراخوانی تابع در main، مقادیر "علی", 25 و "سارا", 30 جایگزین این پارامترها میشوند.
== مقادیر بازگشتی (Return Values) ==
توابع میتوانند یک یا چند مقدار بازگردانند. برای این کار از کلمهٔ کلیدی return استفاده میشود.
<syntaxhighlight lang="go">
package main
import "fmt"
func add(x int, y int) int {
return x + y
}
func main() {
result := add(5, 7)
fmt.Println("نتیجه جمع:", result)
}
</syntaxhighlight>
در این مثال:
* تابع add دو عدد صحیح دریافت میکند.
* خروجی تابع یک مقدار از نوع int است که حاصل جمع آرگومانهاست.
== چند مقدار بازگشتی ==
یکی از ویژگیهای قدرتمند زبان گو، امکان بازگرداندن چند مقدار از یک تابع است.
<syntaxhighlight lang="go">
package main
import "fmt"
func divide(a int, b int) (int, int) {
quotient := a / b
remainder := a % b
return quotient, remainder
}
func main() {
q, r := divide(17, 5)
fmt.Println("خارج قسمت:", q)
fmt.Println("باقیمانده:", r)
}
</syntaxhighlight>
در این کد:
* تابع divide دو عدد میگیرد و هم خارجقسمت و هم باقیمانده را بازمیگرداند.
* در قسمت main، مقادیر بازگشتی در دو متغیر q و r ذخیره میشوند.
== مقادیر بازگشتی نامگذاری شده ==
در گو میتوان نام متغیرهای بازگشتی را داخل تعریف تابع مشخص کرد. این کار باعث میشود کد خواناتر شود.
<syntaxhighlight lang="go">
package main
import "fmt"
func rectangle(w int, h int) (area int, perimeter int) {
area = w * h
perimeter = 2 * (w + h)
return
}
func main() {
a, p := rectangle(5, 3)
fmt.Println("مساحت:", a)
fmt.Println("محیط:", p)
}
</syntaxhighlight>
اینجا:
* مقادیر بازگشتی (area, perimeter) داخل تعریف تابع نامگذاری شدهاند.
* در پایان فقط return بدون مقدار نوشته میشود، چون گو خودش این متغیرها را بازمیگرداند.
== جمعبندی ==
* با آرگومانها میتوان به توابع ورودی داد.
* با مقادیر بازگشتی میتوان خروجی یک تابع را گرفت.
* گو اجازه بازگرداندن چند مقدار را میدهد.
* استفاده از نامگذاری برای مقادیر بازگشتی باعث شفافتر شدن کد میشود.
[[رده:زبان برنامهنویسی گو]]
ofsumrfxbmaz7wzt7m33fnkr7b6cvmw
135047
135045
2026-09-19T16:22:30Z
Vivairan2
28134
135047
wikitext
text/x-wiki
{{سرصفحه
| عنوان = آرگومانها و مقادیر بازگشتی
| قسمت =
| قبلی = [[زبان برنامهنویسی گو/تعریف و استفاده از توابع|تعریف و استفاده از توابع]]
| بعدی = [[زبان برنامهنویسی گو/توابع ناشناس و توابع به عنوان مقادیر|توابع ناشناس و توابع به عنوان مقادیر]]
| یادداشت = [[زبان برنامهنویسی گو]]
}}
== زبان برنامهنویسی گو: آرگومانها و مقادیر بازگشتی ==
توابع در زبان گو برای دریافت ورودی (آرگومانها) و برگرداندن خروجی (مقادیر بازگشتی) استفاده میشوند. این قابلیت باعث میشود بتوانیم بخشهای مختلف برنامه را ماژولار، قابلاستفاده مجدد و خوانا طراحی کنیم.
== آرگومانها (Arguments) ==
وقتی یک تابع تعریف میکنیم، میتوانیم در پرانتز آن متغیرهایی بهعنوان پارامتر مشخص کنیم. هنگام فراخوانی تابع، باید مقادیر مربوط به این پارامترها را ارسال کنیم.
<syntaxhighlight lang="go">
package main
import "fmt"
func greet(name string, age int) {
fmt.Println("سلام", name, "شما", age, "ساله هستید.")
}
func main() {
greet("علی", 25)
greet("سارا", 30)
}
</syntaxhighlight>
در مثال بالا:
* تابع greet دو آرگومان دارد: یک رشته (string) و یک عدد صحیح (int).
* هنگام فراخوانی تابع در main، مقادیر "علی", 25 و "سارا", 30 جایگزین این پارامترها میشوند.
== مقادیر بازگشتی (Return Values) ==
توابع میتوانند یک یا چند مقدار بازگردانند. برای این کار از کلمهٔ کلیدی return استفاده میشود.
<syntaxhighlight lang="go">
package main
import "fmt"
func add(x int, y int) int {
return x + y
}
func main() {
result := add(5, 7)
fmt.Println("نتیجه جمع:", result)
}
</syntaxhighlight>
در این مثال:
* تابع add دو عدد صحیح دریافت میکند.
* خروجی تابع یک مقدار از نوع int است که حاصل جمع آرگومانهاست.
== چند مقدار بازگشتی ==
یکی از ویژگیهای قدرتمند زبان گو، امکان بازگرداندن چند مقدار از یک تابع است.
<syntaxhighlight lang="go">
package main
import "fmt"
func divide(a int, b int) (int, int) {
quotient := a / b
remainder := a % b
return quotient, remainder
}
func main() {
q, r := divide(17, 5)
fmt.Println("خارج قسمت:", q)
fmt.Println("باقیمانده:", r)
}
</syntaxhighlight>
در این کد:
* تابع divide دو عدد میگیرد و هم خارجقسمت و هم باقیمانده را بازمیگرداند.
* در قسمت main، مقادیر بازگشتی در دو متغیر q و r ذخیره میشوند.
== مقادیر بازگشتی نامگذاری شده ==
در گو میتوان نام متغیرهای بازگشتی را داخل تعریف تابع مشخص کرد. این کار باعث میشود کد خواناتر شود.
<syntaxhighlight lang="go">
package main
import "fmt"
func rectangle(w int, h int) (area int, perimeter int) {
area = w * h
perimeter = 2 * (w + h)
return
}
func main() {
a, p := rectangle(5, 3)
fmt.Println("مساحت:", a)
fmt.Println("محیط:", p)
}
</syntaxhighlight>
اینجا:
* مقادیر بازگشتی (area, perimeter) داخل تعریف تابع نامگذاری شدهاند.
* در پایان فقط return بدون مقدار نوشته میشود، چون گو خودش این متغیرها را بازمیگرداند.
== جمعبندی ==
* با آرگومانها میتوان به توابع ورودی داد.
* با مقادیر بازگشتی میتوان خروجی یک تابع را گرفت.
* گو اجازه بازگرداندن چند مقدار را میدهد.
* استفاده از نامگذاری برای مقادیر بازگشتی باعث شفافتر شدن کد میشود.
[[رده:زبان برنامهنویسی گو]]
kp2sm6roxaqpc0p5mh98vm4ohw3hgkd
زبان برنامهنویسی گو/توابع ناشناس و توابع به عنوان مقادیر
0
41504
135046
132759
2026-09-19T16:22:07Z
Vivairan2
28134
135046
wikitext
text/x-wiki
{{سرصفحه
| عنوان = توابع ناشناس و توابع به عنوان مقادیر
| قسمت =
| قبلی = [[زبان برنامهنویسی گو/آرگومانها و مقادیر بازگشتی|آرگومانها و مقادیر بازگشتی]]
| بعدی = [[زبان برنامهنویسی گو/متدها و دریافتکنندهها|متدها و دریافتکنندهها]]
| یادداشت = [[زبان برنامهنویسی گو]]
}}
== توابع ناشناس و توابع به عنوان مقادیر در Go ==
زبان برنامهنویسی '''Go''' توابع را به عنوان '''مقدارهای درجه اول (First-class Citizens)''' در نظر میگیرد.
این ویژگی به شما اجازه میدهد تا توابع را مانند هر مقدار دیگری (مانند اعداد، رشتهها یا ساختارها) در متغیرها ذخیره کنید،
بهعنوان آرگومان به توابع دیگر ارسال کنید، و حتی بهعنوان خروجی از یک تابع برگردانید.
== توابع ناشناس (Anonymous Functions) ==
توابع ناشناس توابعی هستند که '''نامی ندارند''' و معمولاً به صورت '''inline''' تعریف میشوند.
این توابع برای استفادهی سریع و کوتاهمدت طراحی شدهاند، بهویژه زمانی که نیازی به تعریف یک تابع مستقل و جداگانه وجود ندارد.
=== تعریف تابع ناشناس ===
<syntaxhighlight lang="go">
package main
import "fmt"
func main() {
// تعریف یک تابع ناشناس و اجرای فوری آن
func() {
fmt.Println("سلام از یک تابع ناشناس!")
}()
}
</syntaxhighlight>
== ذخیرهسازی توابع در متغیرها ==
توابع ناشناس و حتی توابع معمولی را میتوان در متغیرها ذخیره کرد و در مواقع لازم اجرا نمود.
<syntaxhighlight lang="go">
package main
import "fmt"
func main() {
// ذخیره تابع ناشناس در متغیر
greet := func(name string) string {
return "سلام، " + name
}
// فراخوانی تابع از طریق متغیر
message := greet("دوست من")
fmt.Println(message)
}
</syntaxhighlight>
== توابع به عنوان آرگومان ==
یکی از کاربردهای مهم توابع به عنوان مقادیر، ارسال آنها به توابع دیگر به عنوان '''آرگومان''' است.
این امکان باعث میشود که بتوانیم الگوهایی مانند '''Higher-Order Functions''' یا '''Callbacks''' را پیادهسازی کنیم.
<syntaxhighlight lang="go">
package main
import "fmt"
// تابعی که یک تابع دیگر را به عنوان آرگومان میگیرد
func processNumbers(numbers []int, operation func(int) int) []int {
var result []int
for _, n := range numbers {
result = append(result, operation(n))
}
return result
}
func main() {
numbers := []int{1, 2, 3, 4, 5}
// ارسال تابع ناشناس به عنوان آرگومان
doubled := processNumbers(numbers, func(n int) int {
return n * 2
})
fmt.Println("اعداد اصلی:", numbers)
fmt.Println("اعداد دو برابر شده:", doubled)
}
</syntaxhighlight>
== توابع به عنوان خروجی ==
توابع میتوانند '''خروجی یک تابع دیگر''' باشند.
این قابلیت برای ساخت '''Closure'''ها و ایجاد توابع سفارشی بسیار پرکاربرد است.
<syntaxhighlight lang="go">
package main
import "fmt"
// تابعی که یک تابع دیگر برمیگرداند
func multiplier(factor int) func(int) int {
return func(n int) int {
return n * factor
}
}
func main() {
double := multiplier(2)
triple := multiplier(3)
fmt.Println("2 * 5 =", double(5))
fmt.Println("3 * 5 =", triple(5))
}
</syntaxhighlight>
== کلوزرها (Closures) ==
یک '''Closure''' تابعی است که به متغیرهای محیطی در محدودهی خودش دسترسی دارد، حتی اگر آن محیط دیگر وجود نداشته باشد.
این ویژگی به ما اجازه میدهد '''حالت (state)''' را درون یک تابع نگهداریم.
<syntaxhighlight lang="go">
package main
import "fmt"
// ایجاد یک شمارنده با کلوزر
func counter() func() int {
count := 0
return func() int {
count++
return count
}
}
func main() {
c1 := counter()
c2 := counter()
fmt.Println(c1()) // 1
fmt.Println(c1()) // 2
fmt.Println(c2()) // 1 (شمارنده مستقل)
}
</syntaxhighlight>
== جمعبندی ==
* در Go، توابع '''مقدارهای درجه اول''' هستند.
* میتوان آنها را در متغیر ذخیره کرد، به توابع دیگر ارسال کرد یا از آنها برگرداند.
* '''توابع ناشناس''' برای استفادههای سریع و موقتی بسیار مناسب هستند.
* '''کلوزرها''' قدرت نگهداری وضعیت داخلی در توابع را فراهم میکنند.
این قابلیتها Go را به زبانی قدرتمند برای طراحی برنامههای انعطافپذیر و ماژولار تبدیل میکند.
[[رده:زبان برنامهنویسی گو]]
nq1feim9jy6lw5t9o2s9zocb2qu91w5
زبان برنامهنویسی گو/متدها و دریافتکنندهها
0
41505
135048
132760
2026-09-19T16:23:38Z
Vivairan2
28134
135048
wikitext
text/x-wiki
{{سرصفحه
| عنوان = متدها و دریافتکنندهها
| قسمت =
| قبلی = [[زبان برنامهنویسی گو/توابع ناشناس و توابع به عنوان مقادیر|توابع ناشناس و توابع به عنوان مقادیر]]
| بعدی = [[زبان برنامهنویسی گو/ساختار و نحوه استفاده از بستهها|ساختار و نحوه استفاده از بستهها]]
| یادداشت = [[زبان برنامهنویسی گو]]
}}
== متدها و دریافتکنندهها در Go ==
در زبان برنامهنویسی '''Go''' علاوه بر توابع عادی، قابلیتی به نام '''متد (Method)''' وجود دارد.
متدها مشابه توابع هستند اما با یک تفاوت مهم: آنها به یک '''نوع (Type)''' خاص مرتبط میشوند.
این ارتباط از طریق چیزی به نام '''دریافتکننده (Receiver)''' برقرار میگردد.
== تعریف متد ==
یک متد در Go در واقع یک تابع است که یک '''دریافتکننده''' دارد.
دریافتکننده مشخص میکند که این متد متعلق به چه نوعی است.
<syntaxhighlight lang="go">
package main
import "fmt"
// تعریف یک نوع سفارشی
type Person struct {
name string
age int
}
// تعریف متد برای نوع Person
func (p Person) Greet() {
fmt.Println("سلام، من", p.name, "هستم و", p.age, "سال دارم.")
}
func main() {
p := Person{name: "علی", age: 30}
p.Greet() // فراخوانی متد
}
</syntaxhighlight>
== دریافتکننده (Receiver) ==
دریافتکننده به دو صورت تعریف میشود:
* '''دریافتکنندهٔ مقداری (Value Receiver)'''
* '''دریافتکنندهٔ اشارهگری (Pointer Receiver)'''
=== دریافتکنندهٔ مقداری ===
اگر دریافتکننده از نوع مقداری باشد، متد روی یک '''کپی''' از مقدار اصلی عمل میکند.
<syntaxhighlight lang="go">
package main
import "fmt"
type Rectangle struct {
width, height int
}
// متد با دریافتکننده مقداری
func (r Rectangle) Area() int {
return r.width * r.height
}
func main() {
rect := Rectangle{width: 10, height: 5}
fmt.Println("مساحت:", rect.Area())
}
</syntaxhighlight>
در این مثال، متد `Area` فقط دادهها را میخواند و تغییری ایجاد نمیکند، پس دریافتکنندهٔ مقداری کافی است.
=== دریافتکنندهٔ اشارهگری ===
اگر دریافتکننده از نوع اشارهگر باشد، متد روی '''خود شیء اصلی''' عمل میکند نه روی یک کپی.
این روش زمانی کاربرد دارد که بخواهیم وضعیت شیء را تغییر دهیم یا از کپی غیرضروری جلوگیری کنیم.
<syntaxhighlight lang="go">
package main
import "fmt"
type Counter struct {
value int
}
// متد با دریافتکننده اشارهگری
func (c *Counter) Increment() {
c.value++
}
func main() {
c := Counter{}
c.Increment()
fmt.Println("مقدار شمارنده:", c.value)
}
</syntaxhighlight>
اگر در این مثال از دریافتکنندهٔ مقداری استفاده میکردیم، تغییرات در نسخهٔ کپی انجام میشد و مقدار اصلی تغییر نمیکرد.
== انتخاب بین Value Receiver و Pointer Receiver ==
* اگر متد فقط دادهها را میخواند و نیازی به تغییر ندارد → '''مقداری'''
* اگر متد نیاز به تغییر مقادیر دارد یا نوع داده بزرگ است → '''اشارهگری'''
== متدها در انواع غیرساختاری ==
در Go حتی میتوان برای انواع سفارشی غیرساختاری (مانند نوع عددی) هم متد تعریف کرد.
<syntaxhighlight lang="go">
package main
import "fmt"
type MyInt int
// متدی برای نوع عددی سفارشی
func (m MyInt) IsEven() bool {
return m%2 == 0
}
func main() {
var n MyInt = 10
fmt.Println(n, "زوج است؟", n.IsEven())
}
</syntaxhighlight>
== مقایسه متدها و توابع ==
* توابع مستقل تعریف میشوند و به هیچ نوعی تعلق ندارند.
* متدها همیشه یک دریافتکننده دارند و به نوع خاصی متصل هستند.
== جمعبندی ==
* متدها در Go در واقع توابعی با دریافتکننده هستند.
* دریافتکننده میتواند مقداری یا اشارهگری باشد.
* دریافتکنندهٔ مقداری برای خواندن دادهها مناسب است، در حالیکه دریافتکنندهٔ اشارهگری برای تغییر وضعیت شیء استفاده میشود.
* امکان تعریف متد برای هر نوع سفارشی (ساختارها، نوعهای عددی و ...) وجود دارد.
این قابلیت به شما اجازه میدهد رفتارها را به انواع مختلف اضافه کنید و کدی تمیزتر و شیءگراتر بنویسید.
[[رده:زبان برنامهنویسی گو]]
rkdsv4hdc2fxn9fxq8gixj8ceny61be
فیڶٿڕ:اجتماعی-فلسفی-هرزه
0
41941
135109
134220
2026-09-20T08:47:57Z
Vivairan2
28134
135109
wikitext
text/x-wiki
{{حذف سریع}}
ه0هحتخهادتتدنت
4778دمنتاذ نتنخت
dqi126yud2xlodsmx7x0alktaycbc6l
بحث:تاریخ ایران/حمله آمریکا-فلسطین اشغالی به ایران
1
42091
135051
134980
2026-09-19T18:20:31Z
Fwldom
26269
/* سوگیری مشخص در صفحه */ پاسخ
135051
wikitext
text/x-wiki
== سوگیری مشخص در صفحه ==
در این صفحه سوگیری مشخصی در محتوا و عنوان وجود دارد که مخالف قوانین ویکی کتاب است و همچنین این صفحه نباید بصورت جداگانه وجود داشته باشد و میتواند بخشی از صفحه جمهوری اسلامی در این کتاب باشد. [[کاربر:Fwldom|Fwldom]] ([[بحث کاربر:Fwldom|بحث]]) ۱۶ سپتامبر ۲۰۲۶، ساعت ۱۴:۲۷ (UTC)
:به ویرایش هایتان ادامه بدهید مشکلی وجود ندارد. بدون نگرانی مطالب جدید بیفزایید. در مطالب قبلی اگر میخواهید تغییری ایجاد کنید ابتدا در صفحه بحث نظر دیگران را جویا شوید. عنوان هم خوب است و صفحه های کتاب هم مرتب هستند. [[کاربر:Vivairan2|Vivairan2]] ([[بحث کاربر:Vivairan2|بحث]]) ۱۷ سپتامبر ۲۰۲۶، ساعت ۱۸:۵۷ (UTC)
::درود بر شما، نیازی به اطلاع رسانی مجدد کارهایی که میتوانم در ویکی کتاب انجام بدهم نبود.
::عنوان کاملا سوگیری دارد و کشوری که در سازمان ملل بنام اسرائیل شناخته میشود با یک نام تقلبی بنام فلسطین اشغالی که معمولا توسط حامیان حکومت ایران استفاده میشود. و این مصداق بارز سوگیری مشخص هست.
::و در مورد صفحه های کتاب هر صفحه یک بخش از تاریخ ایران را در برمیگرد و جنگ آمریکا-اسرائیل با جمهوری اسلامی ایران بخش جداگانهای نیست و جزوی از بخش جمهوری اسلامی هست. [[کاربر:Fwldom|Fwldom]] ([[بحث کاربر:Fwldom|بحث]]) ۱۹ سپتامبر ۲۰۲۶، ساعت ۱۸:۲۰ (UTC)
r4ts83yuab9ddqi8wz1crpf03yxhjwn
135065
135051
2026-09-19T22:43:26Z
Vivairan2
28134
/* سوگیری مشخص در صفحه */ پاسخ
135065
wikitext
text/x-wiki
== سوگیری مشخص در صفحه ==
در این صفحه سوگیری مشخصی در محتوا و عنوان وجود دارد که مخالف قوانین ویکی کتاب است و همچنین این صفحه نباید بصورت جداگانه وجود داشته باشد و میتواند بخشی از صفحه جمهوری اسلامی در این کتاب باشد. [[کاربر:Fwldom|Fwldom]] ([[بحث کاربر:Fwldom|بحث]]) ۱۶ سپتامبر ۲۰۲۶، ساعت ۱۴:۲۷ (UTC)
:به ویرایش هایتان ادامه بدهید مشکلی وجود ندارد. بدون نگرانی مطالب جدید بیفزایید. در مطالب قبلی اگر میخواهید تغییری ایجاد کنید ابتدا در صفحه بحث نظر دیگران را جویا شوید. عنوان هم خوب است و صفحه های کتاب هم مرتب هستند. [[کاربر:Vivairan2|Vivairan2]] ([[بحث کاربر:Vivairan2|بحث]]) ۱۷ سپتامبر ۲۰۲۶، ساعت ۱۸:۵۷ (UTC)
::درود بر شما، نیازی به اطلاع رسانی مجدد کارهایی که میتوانم در ویکی کتاب انجام بدهم نبود.
::عنوان کاملا سوگیری دارد و کشوری که در سازمان ملل بنام اسرائیل شناخته میشود با یک نام تقلبی بنام فلسطین اشغالی که معمولا توسط حامیان حکومت ایران استفاده میشود. و این مصداق بارز سوگیری مشخص هست.
::و در مورد صفحه های کتاب هر صفحه یک بخش از تاریخ ایران را در برمیگرد و جنگ آمریکا-اسرائیل با جمهوری اسلامی ایران بخش جداگانهای نیست و جزوی از بخش جمهوری اسلامی هست. [[کاربر:Fwldom|Fwldom]] ([[بحث کاربر:Fwldom|بحث]]) ۱۹ سپتامبر ۲۰۲۶، ساعت ۱۸:۲۰ (UTC)
:::درود جناب فوئلدم. مگر شما اجازه ویرایش در صفحه جمهوری اسلامی را دارید؟ اگر ندارید چه انتظاری از بقیه کاربران دارید؟ این کتاب مربوط به تاریخ هست و نام هایی که رایج هستند به کار میروند. ربطی به سوگیری ندارد، برخلاف ویکیپدیا که مقاله دارد اینجا مقاله وجود ندارد که در آن بخواهد سوگیری رخ بدهد که ناشی از پرداختن به یک سری از جنبه های موضوع و نپرداختن به جنبه های دیگر است. در ویکیکتاب، کتاب داریم، یک چهارچوبی به صورت فهرست کتاب دارد و بقیه مشارکتکنندگان مطابق نظر نویسنده اصلی کتاب، محتوایی در راستای چهارچوب کتاب و با هماهنگی با سایر فصول کتاب مینویسند. [[کاربر:Vivairan2|Vivairan2]] ([[بحث کاربر:Vivairan2|بحث]]) ۱۹ سپتامبر ۲۰۲۶، ساعت ۲۲:۴۳ (UTC)
g5hjtf0kjrifvwlprn9ugn9bybhl53l
راهنما:ویرایش گشتنخورده
12
42095
135073
2026-09-20T07:15:54Z
Vivairan2
28134
تغییرمسیر به [[ویکیکتاب:گشتزنان]]
135073
wikitext
text/x-wiki
#تغییر_مسیر [[ویکیکتاب:گشتزنان]]
oihd7ailheey3jgox2zsckt94z6r94v
ویکیکتاب:گشتزنان/صفحههای گشتخورده
4
42096
135074
2026-09-20T07:19:52Z
Vivairan2
28134
صفحهای تازه حاوی «{{میانبر|راهنما:ویرایش گشتخورده|وپ:سیاههگشت}} '''صفحههای گشتخورده''' (یا ''گشتزنی صفحههای تازه'') زیرمجموعهای از ویژگی '''[[mw:Help:Patrolled edit|ویرایشهای گشتخورده]]''' در نرمافزار مدیاویکی است که در نوامبر ۲۰۰۷ در وبگاه ویکیپدیا نصب شد و ا...» ایجاد کرد
135074
wikitext
text/x-wiki
{{میانبر|راهنما:ویرایش گشتخورده|وپ:سیاههگشت}}
'''صفحههای گشتخورده''' (یا ''گشتزنی صفحههای تازه'') زیرمجموعهای از ویژگی '''[[mw:Help:Patrolled edit|ویرایشهای گشتخورده]]''' در نرمافزار مدیاویکی است که در نوامبر ۲۰۰۷ در وبگاه ویکیپدیا نصب شد و اشاره به وضعیت گشت خوردن یک مقاله توسط یکی از [[ویژه:فهرست کاربران/patroller|گشتزنان]] یا مدیران در [[ویژه:صفحههای تازه]] یا [[ویژه:تغییرات اخیر]] دارد.
== چهچیزی باید بهعنوان گشتخورده علامت بخورد؟ ==
*هر صفحهای که [[ویکیپدیا:فرایند حذف#نظرخواهی حذف|برای حذف نامزد شده]] باید علامت برچسب بخورد تا زمان کاربران برای گشت زدن صفحهای از پیش گشت خورده، هدر نرود.
*هر صفحهای که شایستهٔ ماندن در ویکیپدیا است؛ حتی اگر نیازمند کار زیادی برای بهبود باشد، باید یک [[راهنما:الگو|برچسب]] در آن قرار گیرد که مشکلات موجود در آن و چگونگی بهبود آن را توضیح دهید.
== چهچیزی نباید بهعنوان گشت خورده علامت بخورد؟ ==
*هر صفحهای که برای [[وک:محس|حذف سریع]] یا [[وک:سیاست حذف|حذف زماندار]] برچسب خورده، نباید برچسب گشت بخورد تا در صورت حذف برچسب، دوباره به فهرست صفحههای تازه برگردد و مجدداً بررسی شود.
*صفحههایی که از تصمیم درست در مورد آنها مطمئن نیستید یا نیازمند نظر کاربر (یا کاربران) دیگری در مورد آنها هستید.
*هر صفحهای که شایستهٔ حذف سریع نیست، اما همچنان دارای مشکلاتی '''مهم''' است و (هنوز) [[راهنما:الگو|برچسب]] مناسب در آن قرار نگرفته.
*هر صفحهای که ممکن است عنوان آن مشمول [[ویکیپدیا:حذف نسخه|حذف نسخه]] باشد.
== جستارهای وابسته ==
* [[ویکیکتاب:گشتزنان]]
* [[ویکیکتاب:گشت خودکار]]
* [[mw:Help:Patrolled edits]]
[[رده:راهنما]]
gi78xvit70iiet9z70spz2bv25eh4za
135080
135074
2026-09-20T07:31:26Z
Vivairan2
28134
135080
wikitext
text/x-wiki
{{میانبر|راهنما:ویرایش گشتخورده|وک:سیاههگشت}}
'''صفحههای گشتخورده''' (یا ''گشتزنی صفحههای تازه'') زیرمجموعهای از ویژگی '''[[mw:Help:Patrolled edit|ویرایشهای گشتخورده]]''' در نرمافزار مدیاویکی است که در نوامبر ۲۰۰۷ در وبگاه ویکیپدیا نصب شد و اشاره به وضعیت گشت خوردن یک مقاله توسط یکی از [[ویژه:فهرست کاربران/patroller|گشتزنان]] یا مدیران در [[ویژه:صفحههای تازه]] یا [[ویژه:تغییرات اخیر]] دارد.
== چهچیزی باید بهعنوان گشتخورده علامت بخورد؟ ==
*هر صفحهای که [[ویکیپدیا:فرایند حذف#نظرخواهی حذف|برای حذف نامزد شده]] باید علامت برچسب بخورد تا زمان کاربران برای گشت زدن صفحهای از پیش گشت خورده، هدر نرود.
*هر صفحهای که شایستهٔ ماندن در ویکیپدیا است؛ حتی اگر نیازمند کار زیادی برای بهبود باشد، باید یک [[راهنما:الگو|برچسب]] در آن قرار گیرد که مشکلات موجود در آن و چگونگی بهبود آن را توضیح دهید.
== چهچیزی نباید بهعنوان گشت خورده علامت بخورد؟ ==
*هر صفحهای که برای [[وک:محس|حذف سریع]] یا [[وک:سیاست حذف|حذف زماندار]] برچسب خورده، نباید برچسب گشت بخورد تا در صورت حذف برچسب، دوباره به فهرست صفحههای تازه برگردد و مجدداً بررسی شود.
*صفحههایی که از تصمیم درست در مورد آنها مطمئن نیستید یا نیازمند نظر کاربر (یا کاربران) دیگری در مورد آنها هستید.
*هر صفحهای که شایستهٔ حذف سریع نیست، اما همچنان دارای مشکلاتی '''مهم''' است و (هنوز) [[راهنما:الگو|برچسب]] مناسب در آن قرار نگرفته.
*هر صفحهای که ممکن است عنوان آن مشمول [[ویکیپدیا:حذف نسخه|حذف نسخه]] باشد.
== جستارهای وابسته ==
* [[ویکیکتاب:گشتزنان]]
* [[ویکیکتاب:گشت خودکار]]
* [[mw:Help:Patrolled edits]]
[[رده:راهنما]]
c3l6j4wjyin54fsun9n6yuxbp2zf50z
135100
135080
2026-09-20T08:21:13Z
Vivairan2
28134
/* چهچیزی باید بهعنوان گشتخورده علامت بخورد؟ */
135100
wikitext
text/x-wiki
{{میانبر|راهنما:ویرایش گشتخورده|وک:سیاههگشت}}
'''صفحههای گشتخورده''' (یا ''گشتزنی صفحههای تازه'') زیرمجموعهای از ویژگی '''[[mw:Help:Patrolled edit|ویرایشهای گشتخورده]]''' در نرمافزار مدیاویکی است که در نوامبر ۲۰۰۷ در وبگاه ویکیپدیا نصب شد و اشاره به وضعیت گشت خوردن یک مقاله توسط یکی از [[ویژه:فهرست کاربران/patroller|گشتزنان]] یا مدیران در [[ویژه:صفحههای تازه]] یا [[ویژه:تغییرات اخیر]] دارد.
== چهچیزی باید بهعنوان گشتخورده علامت بخورد؟ ==
*هر صفحهای که [[ویکیپدیا:فرایند حذف#نظرخواهی حذف|برای حذف نامزد شده]] باید علامت برچسب بخورد تا زمان کاربران برای گشت زدن صفحهای از پیش گشت خورده، هدر نرود.
*هر صفحهای که شایستهٔ ماندن در ویکیکتاب است؛ حتی اگر نیازمند کار زیادی برای بهبود باشد، باید یک [[ویکیکتاب:الگوها|برچسب]] در آن قرار گیرد که مشکلات موجود در آن و چگونگی بهبود آن را توضیح دهید.
== چهچیزی نباید بهعنوان گشت خورده علامت بخورد؟ ==
*هر صفحهای که برای [[وک:محس|حذف سریع]] یا [[وک:سیاست حذف|حذف زماندار]] برچسب خورده، نباید برچسب گشت بخورد تا در صورت حذف برچسب، دوباره به فهرست صفحههای تازه برگردد و مجدداً بررسی شود.
*صفحههایی که از تصمیم درست در مورد آنها مطمئن نیستید یا نیازمند نظر کاربر (یا کاربران) دیگری در مورد آنها هستید.
*هر صفحهای که شایستهٔ حذف سریع نیست، اما همچنان دارای مشکلاتی '''مهم''' است و (هنوز) [[راهنما:الگو|برچسب]] مناسب در آن قرار نگرفته.
*هر صفحهای که ممکن است عنوان آن مشمول [[ویکیپدیا:حذف نسخه|حذف نسخه]] باشد.
== جستارهای وابسته ==
* [[ویکیکتاب:گشتزنان]]
* [[ویکیکتاب:گشت خودکار]]
* [[mw:Help:Patrolled edits]]
[[رده:راهنما]]
fejod0v56ze64rfhszepmuabqpewqut
135101
135100
2026-09-20T08:21:31Z
Vivairan2
28134
/* چهچیزی نباید بهعنوان گشت خورده علامت بخورد؟ */
135101
wikitext
text/x-wiki
{{میانبر|راهنما:ویرایش گشتخورده|وک:سیاههگشت}}
'''صفحههای گشتخورده''' (یا ''گشتزنی صفحههای تازه'') زیرمجموعهای از ویژگی '''[[mw:Help:Patrolled edit|ویرایشهای گشتخورده]]''' در نرمافزار مدیاویکی است که در نوامبر ۲۰۰۷ در وبگاه ویکیپدیا نصب شد و اشاره به وضعیت گشت خوردن یک مقاله توسط یکی از [[ویژه:فهرست کاربران/patroller|گشتزنان]] یا مدیران در [[ویژه:صفحههای تازه]] یا [[ویژه:تغییرات اخیر]] دارد.
== چهچیزی باید بهعنوان گشتخورده علامت بخورد؟ ==
*هر صفحهای که [[ویکیپدیا:فرایند حذف#نظرخواهی حذف|برای حذف نامزد شده]] باید علامت برچسب بخورد تا زمان کاربران برای گشت زدن صفحهای از پیش گشت خورده، هدر نرود.
*هر صفحهای که شایستهٔ ماندن در ویکیکتاب است؛ حتی اگر نیازمند کار زیادی برای بهبود باشد، باید یک [[ویکیکتاب:الگوها|برچسب]] در آن قرار گیرد که مشکلات موجود در آن و چگونگی بهبود آن را توضیح دهید.
== چهچیزی نباید بهعنوان گشت خورده علامت بخورد؟ ==
*هر صفحهای که برای [[وک:محس|حذف سریع]] یا [[وک:سیاست حذف|حذف زماندار]] برچسب خورده، نباید برچسب گشت بخورد تا در صورت حذف برچسب، دوباره به فهرست صفحههای تازه برگردد و مجدداً بررسی شود.
*صفحههایی که از تصمیم درست در مورد آنها مطمئن نیستید یا نیازمند نظر کاربر (یا کاربران) دیگری در مورد آنها هستید.
*هر صفحهای که شایستهٔ حذف سریع نیست، اما همچنان دارای مشکلاتی '''مهم''' است و (هنوز) [[ویکیکتاب:الگوها|برچسب]] مناسب در آن قرار نگرفته.
*هر صفحهای که ممکن است عنوان آن مشمول [[ویکیپدیا:حذف نسخه|حذف نسخه]] باشد.
== جستارهای وابسته ==
* [[ویکیکتاب:گشتزنان]]
* [[ویکیکتاب:گشت خودکار]]
* [[mw:Help:Patrolled edits]]
[[رده:راهنما]]
avmr7vhmpwsb55qkeslm1u5j4aayetc
135102
135101
2026-09-20T08:23:37Z
Vivairan2
28134
/* چهچیزی باید بهعنوان گشتخورده علامت بخورد؟ */
135102
wikitext
text/x-wiki
{{میانبر|راهنما:ویرایش گشتخورده|وک:سیاههگشت}}
'''صفحههای گشتخورده''' (یا ''گشتزنی صفحههای تازه'') زیرمجموعهای از ویژگی '''[[mw:Help:Patrolled edit|ویرایشهای گشتخورده]]''' در نرمافزار مدیاویکی است که در نوامبر ۲۰۰۷ در وبگاه ویکیپدیا نصب شد و اشاره به وضعیت گشت خوردن یک مقاله توسط یکی از [[ویژه:فهرست کاربران/patroller|گشتزنان]] یا مدیران در [[ویژه:صفحههای تازه]] یا [[ویژه:تغییرات اخیر]] دارد.
== چهچیزی باید بهعنوان گشتخورده علامت بخورد؟ ==
*هر صفحهای که [[ویکیکتاب:پیشنهادهای حذف|برای حذف نامزد شده]] باید علامت برچسب بخورد تا زمان کاربران برای گشت زدن صفحهای از پیش گشت خورده، هدر نرود.
*هر صفحهای که شایستهٔ ماندن در ویکیکتاب است؛ حتی اگر نیازمند کار زیادی برای بهبود باشد، باید یک [[ویکیکتاب:الگوها|برچسب]] در آن قرار گیرد که مشکلات موجود در آن و چگونگی بهبود آن را توضیح دهید.
== چهچیزی نباید بهعنوان گشت خورده علامت بخورد؟ ==
*هر صفحهای که برای [[وک:محس|حذف سریع]] یا [[وک:سیاست حذف|حذف زماندار]] برچسب خورده، نباید برچسب گشت بخورد تا در صورت حذف برچسب، دوباره به فهرست صفحههای تازه برگردد و مجدداً بررسی شود.
*صفحههایی که از تصمیم درست در مورد آنها مطمئن نیستید یا نیازمند نظر کاربر (یا کاربران) دیگری در مورد آنها هستید.
*هر صفحهای که شایستهٔ حذف سریع نیست، اما همچنان دارای مشکلاتی '''مهم''' است و (هنوز) [[ویکیکتاب:الگوها|برچسب]] مناسب در آن قرار نگرفته.
*هر صفحهای که ممکن است عنوان آن مشمول [[ویکیپدیا:حذف نسخه|حذف نسخه]] باشد.
== جستارهای وابسته ==
* [[ویکیکتاب:گشتزنان]]
* [[ویکیکتاب:گشت خودکار]]
* [[mw:Help:Patrolled edits]]
[[رده:راهنما]]
7g0mrkxfh3ogqck1dea12rn0i0eoi3c
135103
135102
2026-09-20T08:23:56Z
Vivairan2
28134
/* چهچیزی نباید بهعنوان گشت خورده علامت بخورد؟ */
135103
wikitext
text/x-wiki
{{میانبر|راهنما:ویرایش گشتخورده|وک:سیاههگشت}}
'''صفحههای گشتخورده''' (یا ''گشتزنی صفحههای تازه'') زیرمجموعهای از ویژگی '''[[mw:Help:Patrolled edit|ویرایشهای گشتخورده]]''' در نرمافزار مدیاویکی است که در نوامبر ۲۰۰۷ در وبگاه ویکیپدیا نصب شد و اشاره به وضعیت گشت خوردن یک مقاله توسط یکی از [[ویژه:فهرست کاربران/patroller|گشتزنان]] یا مدیران در [[ویژه:صفحههای تازه]] یا [[ویژه:تغییرات اخیر]] دارد.
== چهچیزی باید بهعنوان گشتخورده علامت بخورد؟ ==
*هر صفحهای که [[ویکیکتاب:پیشنهادهای حذف|برای حذف نامزد شده]] باید علامت برچسب بخورد تا زمان کاربران برای گشت زدن صفحهای از پیش گشت خورده، هدر نرود.
*هر صفحهای که شایستهٔ ماندن در ویکیکتاب است؛ حتی اگر نیازمند کار زیادی برای بهبود باشد، باید یک [[ویکیکتاب:الگوها|برچسب]] در آن قرار گیرد که مشکلات موجود در آن و چگونگی بهبود آن را توضیح دهید.
== چهچیزی نباید بهعنوان گشت خورده علامت بخورد؟ ==
*هر صفحهای که برای [[وک:محس|حذف سریع]] یا [[وک:سیاست حذف|حذف زماندار]] برچسب خورده، نباید برچسب گشت بخورد تا در صورت حذف برچسب، دوباره به فهرست صفحههای تازه برگردد و مجدداً بررسی شود.
*صفحههایی که از تصمیم درست در مورد آنها مطمئن نیستید یا نیازمند نظر کاربر (یا کاربران) دیگری در مورد آنها هستید.
*هر صفحهای که شایستهٔ حذف سریع نیست، اما همچنان دارای مشکلاتی '''مهم''' است و (هنوز) [[ویکیکتاب:الگوها|برچسب]] مناسب در آن قرار نگرفته.
*هر صفحهای که ممکن است عنوان آن مشمول [[ویکیکتاب:پیشنهادهای حذف|حذف نسخه]] باشد.
== جستارهای وابسته ==
* [[ویکیکتاب:گشتزنان]]
* [[ویکیکتاب:گشت خودکار]]
* [[mw:Help:Patrolled edits]]
[[رده:راهنما]]
405ahdpgar8gpf11z1dr3c3h049x7ry
راهنما:ویرایش گشتخورده
12
42097
135075
2026-09-20T07:20:24Z
Vivairan2
28134
تغییرمسیر به [[ویکیکتاب:گشتزنان/صفحههای گشتخورده]]
135075
wikitext
text/x-wiki
#تغییر_مسیر [[ویکیکتاب:گشتزنان/صفحههای گشتخورده]]
nz1h7xjbfkdz8d996vucaycplpxsf25
ویکیکتاب:صفحه حمله
4
42098
135077
2026-09-20T07:24:07Z
Vivairan2
28134
صفحهای تازه حاوی «{{سیاست ویکیکتاب|وک:صفحم}} {{سرنویس|اگر به دنبال سیاست ممنوع بودن حمله شخصی هستید، [[ویکیکتاب:حملههای شخصی ممنوع]] راببینید.}} '''صفحه حمله''' صفحهای در هریک از فضاهای نام است که اساساً به منظور بیاعتبار کردن یا تهدید موضوعش وجود دارد. این ص...» ایجاد کرد
135077
wikitext
text/x-wiki
{{سیاست ویکیکتاب|وک:صفحم}}
{{سرنویس|اگر به دنبال سیاست ممنوع بودن حمله شخصی هستید، [[ویکیکتاب:حملههای شخصی ممنوع]] راببینید.}}
'''صفحه حمله''' صفحهای در هریک از فضاهای نام است که اساساً به منظور بیاعتبار کردن یا تهدید موضوعش وجود دارد. این صفحهها شامل معیار حذف سریع میشوند در صورتی که در مورد زندگینامه باشند و بدون منبع باشند یا منبع ضعیف داشته باشند. پس از یافتن این صفحهها، با الصاق الگوی {{tl|db-attack}} آن را برای حذف سریع نامزد کنید و به کاربری که آن را ساخته با {{tl|حمله}} هشدار بدهید. صفحات حمله را میتوان برای نشان دادن احترام خالی هم کرد.
=== مقالههای تفکیکشده با بار منفی ===
وقتی در پی اجماع بر اینکه بخشی از زندگینامهٔ [[ویکیپدیا:زندگینامه زندگان#شُهرگان خاص و عام|شهرگان عام]]، نسبت به سایر بخشها [[ویکیپدیا:اندازه مقاله|رشد نامتناسب]] داشته است، [[ویکیپدیا:تفکیک|تفکیک]] صورت پذیرد، حتی اگر صفحهٔ جداشده بیانگر نکات منفی در مورد شخص مورد نظر باشد، الزاماً نشاندهندهٔ وجود یک صفحهٔ حمله نیست. لازم است با چنین صفحاتی همچنان طبق سیاست [[ویکیپدیا:زندگینامه زندگان|زندگینامهٔ زندگان]] برخورد کرد.
=== نکتهای برای مدیران ===
هنگام حذف نمودن صفحههای حمله به هیچ وجه هیچ قسمتی از محتوای صفحه را در خلاصه ویرایشی خود نقل نکنید. اگر لازم است علاوه بر «ع۱۰» چیز دیگری بیفزایید، بدون ذکر جزئیات حمله، تنها به شرحی کلی بسنده نمایید.
<!--
If the subject of the article is [[Wikipedia:Notability|notable]], but the existing page consists primarily of attacks against the subject of the article, and there's no good revision to [[Wikipedia:Revert|revert]] to, then the attack page should be deleted and an appropriate [[Wikipedia:Stub|stub]] article should be written in its place. This is especially important if the page contains [[WP:BLP|biographical material about a living person]].
Attack pages eligible for speedy deletion may be inside or outside the [[Wikipedia:Main namespace|main namespace]]. However, this policy is not usually meant to apply to [[WP:RFC|requests for comment]], [[WP:RFM|requests for mediation]], and similar processes (although these processes have their own guidelines for deletion of requests that are invalid or in bad faith). On the other hand, keeping a "list of enemies" or "list of everything bad user:XXX did" on your user space is neither constructive nor appropriate. Bear in mind that the key to ''resolving'' a dispute is ''not'' to find and list all the [[wikt:dirt|dirt]] you can find on somebody.
== جستارهای وابسته ==
* [[Wikipedia:COATRACK]]
* [[Wikipedia:Biographies of living persons]]
* [[Wikipedia:Libel]]
* [[Wikipedia:No personal attacks]]
* [[Wikipedia:Remove personal attacks]]
[[Category:Wikipedia deletion policies]]
-->
== پانویس ==
{{سیاستها و رهنمودهای ویکیپدیا}}
[[رده:سیاست حذف ویکیپدیا]]
odko84n12y8qzym1bh1dqryi72hdsrk
135078
135077
2026-09-20T07:26:14Z
Vivairan2
28134
135078
wikitext
text/x-wiki
{{سرنویس|اگر به دنبال سیاست ممنوع بودن حمله شخصی هستید، [[ویکیکتاب:حملههای شخصی ممنوع]] راببینید.}}
'''صفحه حمله''' صفحهای در هریک از فضاهای نام است که اساساً به منظور بیاعتبار کردن یا تهدید موضوعش وجود دارد. این صفحهها شامل معیار حذف سریع میشوند در صورتی که در مورد زندگینامه باشند و بدون منبع باشند یا منبع ضعیف داشته باشند. پس از یافتن این صفحهها، با الصاق الگوی {{tl|db-attack}} آن را برای حذف سریع نامزد کنید و به کاربری که آن را ساخته با {{tl|حمله}} هشدار بدهید. صفحات حمله را میتوان برای نشان دادن احترام خالی هم کرد.
=== مقالههای تفکیکشده با بار منفی ===
وقتی در پی اجماع بر اینکه بخشی از زندگینامهٔ [[ویکیپدیا:زندگینامه زندگان#شُهرگان خاص و عام|شهرگان عام]]، نسبت به سایر بخشها [[ویکیپدیا:اندازه مقاله|رشد نامتناسب]] داشته است، [[ویکیپدیا:تفکیک|تفکیک]] صورت پذیرد، حتی اگر صفحهٔ جداشده بیانگر نکات منفی در مورد شخص مورد نظر باشد، الزاماً نشاندهندهٔ وجود یک صفحهٔ حمله نیست. لازم است با چنین صفحاتی همچنان طبق سیاست [[ویکیپدیا:زندگینامه زندگان|زندگینامهٔ زندگان]] برخورد کرد.
=== نکتهای برای مدیران ===
هنگام حذف نمودن صفحههای حمله به هیچ وجه هیچ قسمتی از محتوای صفحه را در خلاصه ویرایشی خود نقل نکنید. اگر لازم است علاوه بر «ع۱۰» چیز دیگری بیفزایید، بدون ذکر جزئیات حمله، تنها به شرحی کلی بسنده نمایید.
<!--
If the subject of the article is [[Wikipedia:Notability|notable]], but the existing page consists primarily of attacks against the subject of the article, and there's no good revision to [[Wikipedia:Revert|revert]] to, then the attack page should be deleted and an appropriate [[Wikipedia:Stub|stub]] article should be written in its place. This is especially important if the page contains [[WP:BLP|biographical material about a living person]].
Attack pages eligible for speedy deletion may be inside or outside the [[Wikipedia:Main namespace|main namespace]]. However, this policy is not usually meant to apply to [[WP:RFC|requests for comment]], [[WP:RFM|requests for mediation]], and similar processes (although these processes have their own guidelines for deletion of requests that are invalid or in bad faith). On the other hand, keeping a "list of enemies" or "list of everything bad user:XXX did" on your user space is neither constructive nor appropriate. Bear in mind that the key to ''resolving'' a dispute is ''not'' to find and list all the [[wikt:dirt|dirt]] you can find on somebody.
== جستارهای وابسته ==
* [[Wikipedia:COATRACK]]
* [[Wikipedia:Biographies of living persons]]
* [[Wikipedia:Libel]]
* [[Wikipedia:No personal attacks]]
* [[Wikipedia:Remove personal attacks]]
[[Category:Wikipedia deletion policies]]
-->
== پانویس ==
{{سیاستها و رهنمودهای ویکیکتاب}}
[[رده:سیاست حذف ویکیکتاب]]
5w6ywsl57fzvv4h8vo0b2u120ui8acn
135082
135078
2026-09-20T07:33:14Z
Vivairan2
28134
removed [[Category:سیاست حذف ویکیکتاب]]; added [[Category:سیاستهای ویکیکتاب]] با استفاده از ردهساز
135082
wikitext
text/x-wiki
{{سرنویس|اگر به دنبال سیاست ممنوع بودن حمله شخصی هستید، [[ویکیکتاب:حملههای شخصی ممنوع]] راببینید.}}
'''صفحه حمله''' صفحهای در هریک از فضاهای نام است که اساساً به منظور بیاعتبار کردن یا تهدید موضوعش وجود دارد. این صفحهها شامل معیار حذف سریع میشوند در صورتی که در مورد زندگینامه باشند و بدون منبع باشند یا منبع ضعیف داشته باشند. پس از یافتن این صفحهها، با الصاق الگوی {{tl|db-attack}} آن را برای حذف سریع نامزد کنید و به کاربری که آن را ساخته با {{tl|حمله}} هشدار بدهید. صفحات حمله را میتوان برای نشان دادن احترام خالی هم کرد.
=== مقالههای تفکیکشده با بار منفی ===
وقتی در پی اجماع بر اینکه بخشی از زندگینامهٔ [[ویکیپدیا:زندگینامه زندگان#شُهرگان خاص و عام|شهرگان عام]]، نسبت به سایر بخشها [[ویکیپدیا:اندازه مقاله|رشد نامتناسب]] داشته است، [[ویکیپدیا:تفکیک|تفکیک]] صورت پذیرد، حتی اگر صفحهٔ جداشده بیانگر نکات منفی در مورد شخص مورد نظر باشد، الزاماً نشاندهندهٔ وجود یک صفحهٔ حمله نیست. لازم است با چنین صفحاتی همچنان طبق سیاست [[ویکیپدیا:زندگینامه زندگان|زندگینامهٔ زندگان]] برخورد کرد.
=== نکتهای برای مدیران ===
هنگام حذف نمودن صفحههای حمله به هیچ وجه هیچ قسمتی از محتوای صفحه را در خلاصه ویرایشی خود نقل نکنید. اگر لازم است علاوه بر «ع۱۰» چیز دیگری بیفزایید، بدون ذکر جزئیات حمله، تنها به شرحی کلی بسنده نمایید.
<!--
If the subject of the article is [[Wikipedia:Notability|notable]], but the existing page consists primarily of attacks against the subject of the article, and there's no good revision to [[Wikipedia:Revert|revert]] to, then the attack page should be deleted and an appropriate [[Wikipedia:Stub|stub]] article should be written in its place. This is especially important if the page contains [[WP:BLP|biographical material about a living person]].
Attack pages eligible for speedy deletion may be inside or outside the [[Wikipedia:Main namespace|main namespace]]. However, this policy is not usually meant to apply to [[WP:RFC|requests for comment]], [[WP:RFM|requests for mediation]], and similar processes (although these processes have their own guidelines for deletion of requests that are invalid or in bad faith). On the other hand, keeping a "list of enemies" or "list of everything bad user:XXX did" on your user space is neither constructive nor appropriate. Bear in mind that the key to ''resolving'' a dispute is ''not'' to find and list all the [[wikt:dirt|dirt]] you can find on somebody.
== جستارهای وابسته ==
* [[Wikipedia:COATRACK]]
* [[Wikipedia:Biographies of living persons]]
* [[Wikipedia:Libel]]
* [[Wikipedia:No personal attacks]]
* [[Wikipedia:Remove personal attacks]]
[[Category:Wikipedia deletion policies]]
-->
== پانویس ==
{{سیاستها و رهنمودهای ویکیکتاب}}
[[رده:سیاستهای ویکیکتاب]]
qjzrcgz2yqjccgss9k360zpfaah9nxy
135083
135082
2026-09-20T07:34:40Z
Vivairan2
28134
/* پانویس */
135083
wikitext
text/x-wiki
{{سرنویس|اگر به دنبال سیاست ممنوع بودن حمله شخصی هستید، [[ویکیکتاب:حملههای شخصی ممنوع]] راببینید.}}
'''صفحه حمله''' صفحهای در هریک از فضاهای نام است که اساساً به منظور بیاعتبار کردن یا تهدید موضوعش وجود دارد. این صفحهها شامل معیار حذف سریع میشوند در صورتی که در مورد زندگینامه باشند و بدون منبع باشند یا منبع ضعیف داشته باشند. پس از یافتن این صفحهها، با الصاق الگوی {{tl|db-attack}} آن را برای حذف سریع نامزد کنید و به کاربری که آن را ساخته با {{tl|حمله}} هشدار بدهید. صفحات حمله را میتوان برای نشان دادن احترام خالی هم کرد.
=== مقالههای تفکیکشده با بار منفی ===
وقتی در پی اجماع بر اینکه بخشی از زندگینامهٔ [[ویکیپدیا:زندگینامه زندگان#شُهرگان خاص و عام|شهرگان عام]]، نسبت به سایر بخشها [[ویکیپدیا:اندازه مقاله|رشد نامتناسب]] داشته است، [[ویکیپدیا:تفکیک|تفکیک]] صورت پذیرد، حتی اگر صفحهٔ جداشده بیانگر نکات منفی در مورد شخص مورد نظر باشد، الزاماً نشاندهندهٔ وجود یک صفحهٔ حمله نیست. لازم است با چنین صفحاتی همچنان طبق سیاست [[ویکیپدیا:زندگینامه زندگان|زندگینامهٔ زندگان]] برخورد کرد.
=== نکتهای برای مدیران ===
هنگام حذف نمودن صفحههای حمله به هیچ وجه هیچ قسمتی از محتوای صفحه را در خلاصه ویرایشی خود نقل نکنید. اگر لازم است علاوه بر «ع۱۰» چیز دیگری بیفزایید، بدون ذکر جزئیات حمله، تنها به شرحی کلی بسنده نمایید.
<!--
If the subject of the article is [[Wikipedia:Notability|notable]], but the existing page consists primarily of attacks against the subject of the article, and there's no good revision to [[Wikipedia:Revert|revert]] to, then the attack page should be deleted and an appropriate [[Wikipedia:Stub|stub]] article should be written in its place. This is especially important if the page contains [[WP:BLP|biographical material about a living person]].
Attack pages eligible for speedy deletion may be inside or outside the [[Wikipedia:Main namespace|main namespace]]. However, this policy is not usually meant to apply to [[WP:RFC|requests for comment]], [[WP:RFM|requests for mediation]], and similar processes (although these processes have their own guidelines for deletion of requests that are invalid or in bad faith). On the other hand, keeping a "list of enemies" or "list of everything bad user:XXX did" on your user space is neither constructive nor appropriate. Bear in mind that the key to ''resolving'' a dispute is ''not'' to find and list all the [[wikt:dirt|dirt]] you can find on somebody.
== جستارهای وابسته ==
* [[Wikipedia:COATRACK]]
* [[Wikipedia:Biographies of living persons]]
* [[Wikipedia:Libel]]
* [[Wikipedia:No personal attacks]]
* [[Wikipedia:Remove personal attacks]]
[[Category:Wikipedia deletion policies]]
-->
== پانویس ==
{{فهرست سیاستها}}
[[رده:سیاستهای ویکیکتاب]]
qj4kdzvnbjmla0jsqo0xjdukd6sgrzu
135084
135083
2026-09-20T07:35:04Z
Vivairan2
28134
/* پانویس */
135084
wikitext
text/x-wiki
{{سرنویس|اگر به دنبال سیاست ممنوع بودن حمله شخصی هستید، [[ویکیکتاب:حملههای شخصی ممنوع]] راببینید.}}
'''صفحه حمله''' صفحهای در هریک از فضاهای نام است که اساساً به منظور بیاعتبار کردن یا تهدید موضوعش وجود دارد. این صفحهها شامل معیار حذف سریع میشوند در صورتی که در مورد زندگینامه باشند و بدون منبع باشند یا منبع ضعیف داشته باشند. پس از یافتن این صفحهها، با الصاق الگوی {{tl|db-attack}} آن را برای حذف سریع نامزد کنید و به کاربری که آن را ساخته با {{tl|حمله}} هشدار بدهید. صفحات حمله را میتوان برای نشان دادن احترام خالی هم کرد.
=== مقالههای تفکیکشده با بار منفی ===
وقتی در پی اجماع بر اینکه بخشی از زندگینامهٔ [[ویکیپدیا:زندگینامه زندگان#شُهرگان خاص و عام|شهرگان عام]]، نسبت به سایر بخشها [[ویکیپدیا:اندازه مقاله|رشد نامتناسب]] داشته است، [[ویکیپدیا:تفکیک|تفکیک]] صورت پذیرد، حتی اگر صفحهٔ جداشده بیانگر نکات منفی در مورد شخص مورد نظر باشد، الزاماً نشاندهندهٔ وجود یک صفحهٔ حمله نیست. لازم است با چنین صفحاتی همچنان طبق سیاست [[ویکیپدیا:زندگینامه زندگان|زندگینامهٔ زندگان]] برخورد کرد.
=== نکتهای برای مدیران ===
هنگام حذف نمودن صفحههای حمله به هیچ وجه هیچ قسمتی از محتوای صفحه را در خلاصه ویرایشی خود نقل نکنید. اگر لازم است علاوه بر «ع۱۰» چیز دیگری بیفزایید، بدون ذکر جزئیات حمله، تنها به شرحی کلی بسنده نمایید.
<!--
If the subject of the article is [[Wikipedia:Notability|notable]], but the existing page consists primarily of attacks against the subject of the article, and there's no good revision to [[Wikipedia:Revert|revert]] to, then the attack page should be deleted and an appropriate [[Wikipedia:Stub|stub]] article should be written in its place. This is especially important if the page contains [[WP:BLP|biographical material about a living person]].
Attack pages eligible for speedy deletion may be inside or outside the [[Wikipedia:Main namespace|main namespace]]. However, this policy is not usually meant to apply to [[WP:RFC|requests for comment]], [[WP:RFM|requests for mediation]], and similar processes (although these processes have their own guidelines for deletion of requests that are invalid or in bad faith). On the other hand, keeping a "list of enemies" or "list of everything bad user:XXX did" on your user space is neither constructive nor appropriate. Bear in mind that the key to ''resolving'' a dispute is ''not'' to find and list all the [[wikt:dirt|dirt]] you can find on somebody.
== جستارهای وابسته ==
* [[Wikipedia:COATRACK]]
* [[Wikipedia:Biographies of living persons]]
* [[Wikipedia:Libel]]
* [[Wikipedia:No personal attacks]]
* [[Wikipedia:Remove personal attacks]]
[[Category:Wikipedia deletion policies]]
-->
[[رده:سیاستهای ویکیکتاب]]
on2rypbcxgof2ntf6yqfuwi6v60rqc0
135085
135084
2026-09-20T07:35:15Z
Vivairan2
28134
135085
wikitext
text/x-wiki
{{سرنویس|اگر به دنبال سیاست ممنوع بودن حمله شخصی هستید، [[ویکیکتاب:حملههای شخصی ممنوع]] راببینید.}}
{{فهرست سیاستها}}
'''صفحه حمله''' صفحهای در هریک از فضاهای نام است که اساساً به منظور بیاعتبار کردن یا تهدید موضوعش وجود دارد. این صفحهها شامل معیار حذف سریع میشوند در صورتی که در مورد زندگینامه باشند و بدون منبع باشند یا منبع ضعیف داشته باشند. پس از یافتن این صفحهها، با الصاق الگوی {{tl|db-attack}} آن را برای حذف سریع نامزد کنید و به کاربری که آن را ساخته با {{tl|حمله}} هشدار بدهید. صفحات حمله را میتوان برای نشان دادن احترام خالی هم کرد.
=== مقالههای تفکیکشده با بار منفی ===
وقتی در پی اجماع بر اینکه بخشی از زندگینامهٔ [[ویکیپدیا:زندگینامه زندگان#شُهرگان خاص و عام|شهرگان عام]]، نسبت به سایر بخشها [[ویکیپدیا:اندازه مقاله|رشد نامتناسب]] داشته است، [[ویکیپدیا:تفکیک|تفکیک]] صورت پذیرد، حتی اگر صفحهٔ جداشده بیانگر نکات منفی در مورد شخص مورد نظر باشد، الزاماً نشاندهندهٔ وجود یک صفحهٔ حمله نیست. لازم است با چنین صفحاتی همچنان طبق سیاست [[ویکیپدیا:زندگینامه زندگان|زندگینامهٔ زندگان]] برخورد کرد.
=== نکتهای برای مدیران ===
هنگام حذف نمودن صفحههای حمله به هیچ وجه هیچ قسمتی از محتوای صفحه را در خلاصه ویرایشی خود نقل نکنید. اگر لازم است علاوه بر «ع۱۰» چیز دیگری بیفزایید، بدون ذکر جزئیات حمله، تنها به شرحی کلی بسنده نمایید.
<!--
If the subject of the article is [[Wikipedia:Notability|notable]], but the existing page consists primarily of attacks against the subject of the article, and there's no good revision to [[Wikipedia:Revert|revert]] to, then the attack page should be deleted and an appropriate [[Wikipedia:Stub|stub]] article should be written in its place. This is especially important if the page contains [[WP:BLP|biographical material about a living person]].
Attack pages eligible for speedy deletion may be inside or outside the [[Wikipedia:Main namespace|main namespace]]. However, this policy is not usually meant to apply to [[WP:RFC|requests for comment]], [[WP:RFM|requests for mediation]], and similar processes (although these processes have their own guidelines for deletion of requests that are invalid or in bad faith). On the other hand, keeping a "list of enemies" or "list of everything bad user:XXX did" on your user space is neither constructive nor appropriate. Bear in mind that the key to ''resolving'' a dispute is ''not'' to find and list all the [[wikt:dirt|dirt]] you can find on somebody.
== جستارهای وابسته ==
* [[Wikipedia:COATRACK]]
* [[Wikipedia:Biographies of living persons]]
* [[Wikipedia:Libel]]
* [[Wikipedia:No personal attacks]]
* [[Wikipedia:Remove personal attacks]]
[[Category:Wikipedia deletion policies]]
-->
[[رده:سیاستهای ویکیکتاب]]
8vddrh6gvp54ow27jmspfy2mep26ilw
135086
135085
2026-09-20T07:40:55Z
Vivairan2
28134
زندگینامه برای ویکیپدیا است
135086
wikitext
text/x-wiki
{{سرنویس|اگر به دنبال سیاست ممنوع بودن حمله شخصی هستید، [[ویکیکتاب:حملههای شخصی ممنوع]] راببینید.}}
{{فهرست سیاستها}}
'''صفحه حمله''' صفحهای در هریک از فضاهای نام است که اساساً به منظور بیاعتبار کردن یا تهدید موضوعش وجود دارد. این صفحهها شامل معیار حذف سریع میشوند در صورتی که در مورد زندگینامه باشند و بدون منبع باشند یا منبع ضعیف داشته باشند. پس از یافتن این صفحهها، با الصاق الگوی {{tl|db-attack}} آن را برای حذف سریع نامزد کنید و به کاربری که آن را ساخته با {{tl|حمله}} هشدار بدهید. صفحات حمله را میتوان برای نشان دادن احترام خالی هم کرد.
=== نکتهای برای مدیران ===
هنگام حذف نمودن صفحههای حمله به هیچ وجه هیچ قسمتی از محتوای صفحه را در خلاصه ویرایشی خود نقل نکنید. اگر لازم است علاوه بر «ع۱۰» چیز دیگری بیفزایید، بدون ذکر جزئیات حمله، تنها به شرحی کلی بسنده نمایید.
<!--
If the subject of the article is [[Wikipedia:Notability|notable]], but the existing page consists primarily of attacks against the subject of the article, and there's no good revision to [[Wikipedia:Revert|revert]] to, then the attack page should be deleted and an appropriate [[Wikipedia:Stub|stub]] article should be written in its place. This is especially important if the page contains [[WP:BLP|biographical material about a living person]].
Attack pages eligible for speedy deletion may be inside or outside the [[Wikipedia:Main namespace|main namespace]]. However, this policy is not usually meant to apply to [[WP:RFC|requests for comment]], [[WP:RFM|requests for mediation]], and similar processes (although these processes have their own guidelines for deletion of requests that are invalid or in bad faith). On the other hand, keeping a "list of enemies" or "list of everything bad user:XXX did" on your user space is neither constructive nor appropriate. Bear in mind that the key to ''resolving'' a dispute is ''not'' to find and list all the [[wikt:dirt|dirt]] you can find on somebody.
== جستارهای وابسته ==
* [[Wikipedia:COATRACK]]
* [[Wikipedia:Biographies of living persons]]
* [[Wikipedia:Libel]]
* [[Wikipedia:No personal attacks]]
* [[Wikipedia:Remove personal attacks]]
[[Category:Wikipedia deletion policies]]
-->
[[رده:سیاستهای ویکیکتاب]]
71ssq6rmnmntfn81oimi0xqkt3lc5tt
135096
135086
2026-09-20T08:07:05Z
Vivairan2
28134
135096
wikitext
text/x-wiki
{{سرنویس|اگر به دنبال سیاست ممنوع بودن حمله شخصی هستید، [[w:fa:ویکیپدیا:حملههای شخصی ممنوع|ویکیپدیا:حملههای شخصی ممنوع]] راببینید.}}
{{فهرست سیاستها}}
'''صفحه حمله''' صفحهای در هریک از فضاهای نام است که اساساً به منظور بیاعتبار کردن یا تهدید موضوعش وجود دارد. این صفحهها شامل معیار حذف سریع میشوند در صورتی که در مورد زندگینامه باشند و بدون منبع باشند یا منبع ضعیف داشته باشند. پس از یافتن این صفحهها، با الصاق الگوی {{tl|db-attack}} آن را برای حذف سریع نامزد کنید و به کاربری که آن را ساخته با {{tl|حمله}} هشدار بدهید. صفحات حمله را میتوان برای نشان دادن احترام خالی هم کرد.
=== نکتهای برای مدیران ===
هنگام حذف نمودن صفحههای حمله به هیچ وجه هیچ قسمتی از محتوای صفحه را در خلاصه ویرایشی خود نقل نکنید. اگر لازم است علاوه بر «ع۱۰» چیز دیگری بیفزایید، بدون ذکر جزئیات حمله، تنها به شرحی کلی بسنده نمایید.
<!--
If the subject of the article is [[Wikipedia:Notability|notable]], but the existing page consists primarily of attacks against the subject of the article, and there's no good revision to [[Wikipedia:Revert|revert]] to, then the attack page should be deleted and an appropriate [[Wikipedia:Stub|stub]] article should be written in its place. This is especially important if the page contains [[WP:BLP|biographical material about a living person]].
Attack pages eligible for speedy deletion may be inside or outside the [[Wikipedia:Main namespace|main namespace]]. However, this policy is not usually meant to apply to [[WP:RFC|requests for comment]], [[WP:RFM|requests for mediation]], and similar processes (although these processes have their own guidelines for deletion of requests that are invalid or in bad faith). On the other hand, keeping a "list of enemies" or "list of everything bad user:XXX did" on your user space is neither constructive nor appropriate. Bear in mind that the key to ''resolving'' a dispute is ''not'' to find and list all the [[wikt:dirt|dirt]] you can find on somebody.
== جستارهای وابسته ==
* [[Wikipedia:COATRACK]]
* [[Wikipedia:Biographies of living persons]]
* [[Wikipedia:Libel]]
* [[Wikipedia:No personal attacks]]
* [[Wikipedia:Remove personal attacks]]
[[Category:Wikipedia deletion policies]]
-->
[[رده:سیاستهای ویکیکتاب]]
1ti8qsxos6caxl0p127pwnrmymui339
الگو:سرنویس
10
42099
135079
2026-09-20T07:27:22Z
Vivairan2
28134
صفحهای تازه حاوی «<includeonly>{{#invoke:Hatnote|hatnote}}</includeonly><noinclude> {{توضیحات}} <!-- لطفاً ردهها را در زیرصفحهٔ /توضیحات، و میانویکیها را در ویکیداده قرار دهید. --> </noinclude>» ایجاد کرد
135079
wikitext
text/x-wiki
<includeonly>{{#invoke:Hatnote|hatnote}}</includeonly><noinclude>
{{توضیحات}}
<!-- لطفاً ردهها را در زیرصفحهٔ /توضیحات، و میانویکیها را در ویکیداده قرار دهید. -->
</noinclude>
hcskxkvk8paw3skolaqh9ghn31qm1qg
ویکیکتاب:سیاههگشت
4
42100
135081
2026-09-20T07:31:47Z
Vivairan2
28134
تغییرمسیر به [[ویکیکتاب:گشتزنان/صفحههای گشتخورده]]
135081
wikitext
text/x-wiki
#تغییر_مسیر [[ویکیکتاب:گشتزنان/صفحههای گشتخورده]]
nz1h7xjbfkdz8d996vucaycplpxsf25
الگو:هبک-حمله
10
42101
135087
2026-09-20T07:48:51Z
Vivairan2
28134
صفحهای تازه حاوی «[[Image:Ambox octagon stop.svg|30px||alt=Stop icon]] لطفاً صفحاتی نسازید که به موضوعشان [[ویکیکتاب:صفحه حمله|حمله میکنند، تهدیدش میکنند یا بیاعتبارش میسازند]]. پروندهها و صفحههای حملهگرانه در ویکیپدیا تحمل نمیشوند و ویکیکتاب:معیارهای حذف سریع|ح...» ایجاد کرد
135087
wikitext
text/x-wiki
[[Image:Ambox octagon stop.svg|30px||alt=Stop icon]] لطفاً صفحاتی نسازید که به موضوعشان [[ویکیکتاب:صفحه حمله|حمله میکنند، تهدیدش میکنند یا بیاعتبارش میسازند]]. پروندهها و صفحههای حملهگرانه در ویکیپدیا تحمل نمیشوند و [[ویکیکتاب:معیارهای حذف سریع|حذف سریع خواهند شد]]. کاربرانی که چنین مطالبی را ایجاد کنند یا بیفزایند [[ویکیکتاب:قطع دسترسی|قطع دسترسی میشوند]]. {{{2|ممنون.}}}<!-- الگو:هبک-حمله --><noinclude>
{{Single notice|nothankyou=yes|nopage=yes}}
</noinclude>
nl050f00uyug7ln56hpsb2h2yqcaw7y
الگو:حمله
10
42102
135088
2026-09-20T07:49:53Z
Vivairan2
28134
تغییرمسیر به [[الگو:هبک-حمله]]
135088
wikitext
text/x-wiki
#تغییر_مسیر [[الگو:هبک-حمله]]
m1epev1rhggghhaneix6znea73zuqju
ویکیکتاب:قطع دسترسی
4
42103
135089
2026-09-20T07:53:43Z
Vivairan2
28134
صفحهای تازه حاوی «{{سیاستهای ویکیکتاب|وک:قطع|وک:بستن}} {{چکیده|کاربران یا [[IP|نشانیهای IP]] ممکن است توسط مدیران بهخاطر حفاظت از ویکیپدیا در برابر اخلال '''قطع دسترسی''' شوند.}} {{فهرست سیاستهای اجرایی}} [[وپ:مدیران|مدیران]] ویکیپدیا میتوانند به دلایل مختلفی...» ایجاد کرد
135089
wikitext
text/x-wiki
{{سیاستهای ویکیکتاب|وک:قطع|وک:بستن}}
{{چکیده|کاربران یا [[IP|نشانیهای IP]] ممکن است توسط مدیران بهخاطر حفاظت از ویکیپدیا در برابر اخلال '''قطع دسترسی''' شوند.}}
{{فهرست سیاستهای اجرایی}}
[[وپ:مدیران|مدیران]] ویکیپدیا میتوانند به دلایل مختلفی دسترسی کاربران را (اعم از کاربران دارای شناسهٔ کاربری با هر دسترسی، یا کاربران ناشناس که [[IP|نشانی IP]] آنها در کنار ویرایشهایشان ثبت میشود) برای ویرایش ویکیپدیا محدود کنند. بهطور کلی هر کاربری که عمداً در ویکیپدیای فارسی [[ویکیپدیا:خرابکاری|خرابکاری]] کند (مثلاً حذف بیمورد اطلاعات مفید مقالات یا نوشتن مطالب نامربوط در آنها)، به شخص یا گروهی توهین یا حملهٔ شخصی کند (مستقل از لفظ مورد استفاده)، ایجاد سوء تفاهم کند (مثلاً با تغییر آرا یا امضاها یا استفاده از امضای دیگران)، یا به هر ترتیب دیگری باعث اخلال در روند پیشبرد دانشنامه شود، امکان بسته شدن دارد. در تمامی این موارد، قطع دسترسی با هدف حفاظت از ویکیپدیا انجام میشود، نه برای تنبیه فرد خاطی.
کاربری که قطع دسترسی شدهاست میتواند صفحات ویکیپدیا را مشاهده کند ولی امکان ویرایش در صفحات ویکیپدیا را (در اکثر موارد) ندارد به جز [[وپ:کاربر|صفحهٔ بحث خود کاربر]].
[[رده:سیاستهای ویکیکتاب]]
jp69zkpqfrafkkkkti55z5q94nu3ck0
135090
135089
2026-09-20T07:54:31Z
Vivairan2
28134
135090
wikitext
text/x-wiki
{{میانبر|وک:قطع|وک:بستن}}
{{چکیده|کاربران یا [[IP|نشانیهای IP]] ممکن است توسط مدیران بهخاطر حفاظت از ویکیپدیا در برابر اخلال '''قطع دسترسی''' شوند.}}
{{فهرست سیاستها}}
[[وک:مدیران|مدیران]] ویکیکتاب میتوانند به دلایل مختلفی دسترسی کاربران را (اعم از کاربران دارای شناسهٔ کاربری با هر دسترسی، یا کاربران ناشناس که [[IP|نشانی IP]] آنها در کنار ویرایشهایشان ثبت میشود) برای ویرایش ویکیپدیا محدود کنند. بهطور کلی هر کاربری که عمداً در ویکیپدیای فارسی [[ویکیپدیا:خرابکاری|خرابکاری]] کند (مثلاً حذف بیمورد اطلاعات مفید مقالات یا نوشتن مطالب نامربوط در آنها)، به شخص یا گروهی توهین یا حملهٔ شخصی کند (مستقل از لفظ مورد استفاده)، ایجاد سوء تفاهم کند (مثلاً با تغییر آرا یا امضاها یا استفاده از امضای دیگران)، یا به هر ترتیب دیگری باعث اخلال در روند پیشبرد دانشنامه شود، امکان بسته شدن دارد. در تمامی این موارد، قطع دسترسی با هدف حفاظت از ویکیپدیا انجام میشود، نه برای تنبیه فرد خاطی.
کاربری که قطع دسترسی شدهاست میتواند صفحات ویکیپدیا را مشاهده کند ولی امکان ویرایش در صفحات ویکیپدیا را (در اکثر موارد) ندارد به جز [[وپ:کاربر|صفحهٔ بحث خود کاربر]].
[[رده:سیاستهای ویکیکتاب]]
beiz4nlzlpco73do1lk7spvje7oxpap
135091
135090
2026-09-20T07:56:55Z
Vivairan2
28134
135091
wikitext
text/x-wiki
{{میانبر|وک:قطع|وک:بستن}}
{{چکیده|کاربران یا [[IP|نشانیهای IP]] ممکن است توسط مدیران بهخاطر حفاظت از ویکیپدیا در برابر اخلال '''قطع دسترسی''' شوند.}}
{{فهرست سیاستها}}
[[وک:مدیران|مدیران]] ویکیکتاب میتوانند به دلایل مختلفی دسترسی کاربران را (اعم از کاربران دارای شناسهٔ کاربری با هر دسترسی، یا کاربران ناشناس که [[IP|نشانی IP]] آنها در کنار ویرایشهایشان ثبت میشود) برای ویرایش ویکیپدیا محدود کنند. بهطور کلی هر کاربری که عمداً در ویکیپدیای فارسی [[ویکیپدیا:خرابکاری|خرابکاری]] کند (مثلاً حذف بیمورد اطلاعات مفید مقالات یا نوشتن مطالب نامربوط در آنها)، به شخص یا گروهی توهین یا حملهٔ شخصی کند (مستقل از لفظ مورد استفاده)، ایجاد سوء تفاهم کند (مثلاً با تغییر آرا یا امضاها یا استفاده از امضای دیگران)، یا به هر ترتیب دیگری باعث اخلال در روند پیشبرد دانشنامه شود، امکان بسته شدن دارد. در تمامی این موارد، قطع دسترسی با هدف حفاظت از ویکیپدیا انجام میشود، نه برای تنبیه فرد خاطی.
کاربری که قطع دسترسی شدهاست میتواند صفحات ویکیپدیا را مشاهده کند ولی امکان ویرایش در صفحات ویکیپدیا را (در اکثر موارد) ندارد به جز [[وپ:کاربر|صفحهٔ بحث خود کاربر]].
== آثار بسته شدن ==
کاربران و آیپیهای بسته شده کماکان قادر به مشاهدهٔ تمامی صفحات ویکی نبشته هستند، اما با کلیک کردن بر لینک «ویرایش» صفحهای با مضمون «[[مدیاویکی:Blockedtext|دسترسی حساب کاربری یا نشانی آیپی شما بسته شدهاست.]]» ظاهر میشود که دلیل قطع دسترسی و چگونگی ارائهٔ درخواست برای پایان دادن به قطع دسترسی را توضیح میدهد. Links and template includes all work as normal in the "reason" section.
مدت زمان قطع دسترسی به تاریخ انقضایی که به هنگام بسته شدن وارد شده بستگی دارد، که ممکن است «نامعین» یا «بیپایان» باشد (یعنی تا زمانی که صریحاً باز شود).
هنگامی که کاربر قطع دسترسی شده سعی کند ویرایش کند، آیپی مورد استفادهٔ او «قطع دسترسی خودکار» میشود، بنابراین کاربر نمیتواند همان ویرایش را به صورت ناشناس یا تحت نام کاربری دیگری انجام دهد. متغیر داخلی پایان قطع دسترسی خودکار موجود است و مقدار پیشفرض آن ۲۴ ساعت میباشد، بدین معنی که هرگاه کاربری به صورت «نامعین» بسته شده باشد، آیپی مورد استفاهٔ او تا ۲۴ ساعت پس از آخرین مرتبهای که از صفحات بازدید کرده باشد قطع دسترسی خودکار خواهد شد.
مدیران و دیوانسالاران در صورت قطع دسترسی شدن امکان واگردانی، حذف و احیای صفحات، و محافت کردن و باز کردن صفحات را نیز از دست میهند. اما همچنان میتوانند کاربران را ببندند و باز کنند، و دیوانسالاران کماکان میتوانند کاربر دیگری را مدیر کنند.
[[رده:سیاستهای ویکیکتاب]]
537lkbqjco9bn94gw1n1ruemhumw00s
135094
135091
2026-09-20T08:03:49Z
Vivairan2
28134
135094
wikitext
text/x-wiki
{{میانبر|وک:قطع|وک:بستن}}
{{چکیده|کاربران یا [[IP|نشانیهای IP]] ممکن است توسط مدیران بهخاطر حفاظت از ویکیپدیا در برابر اخلال '''قطع دسترسی''' شوند.}}
{{فهرست سیاستها}}
[[وک:مدیران|مدیران]] ویکیکتاب میتوانند به دلایل مختلفی دسترسی کاربران را (اعم از کاربران دارای شناسهٔ کاربری با هر دسترسی، یا کاربران ناشناس که [[IP|نشانی IP]] آنها در کنار ویرایشهایشان ثبت میشود) برای ویرایش ویکیکتاب محدود کنند. بهطور کلی هر کاربری که عمداً در ویکیپدیای فارسی [[ویکیپدیا:خرابکاری|خرابکاری]] کند (مثلاً حذف بیمورد اطلاعات مفید مقالات یا نوشتن مطالب نامربوط در آنها)، به شخص یا گروهی توهین یا حملهٔ شخصی کند (مستقل از لفظ مورد استفاده)، ایجاد سوء تفاهم کند (مثلاً با تغییر آرا یا امضاها یا استفاده از امضای دیگران)، یا به هر ترتیب دیگری باعث اخلال در روند پیشبرد کتابخانه شود، امکان بسته شدن دارد. در تمامی این موارد، قطع دسترسی با هدف حفاظت از ویکیکتاب انجام میشود، نه برای تنبیه فرد خاطی.
کاربری که قطع دسترسی شدهاست میتواند صفحات ویکیکتاب را مشاهده کند ولی امکان ویرایش در صفحات ویکیکتاب را (در اکثر موارد) ندارد به جز [[وک:کاربر|صفحهٔ بحث خود کاربر]].
== آثار بسته شدن ==
کاربران و آیپیهای بسته شده کماکان قادر به مشاهدهٔ تمامی صفحات ویکی نبشته هستند، اما با کلیک کردن بر لینک «ویرایش» صفحهای با مضمون «[[مدیاویکی:Blockedtext|دسترسی حساب کاربری یا نشانی آیپی شما بسته شدهاست.]]» ظاهر میشود که دلیل قطع دسترسی و چگونگی ارائهٔ درخواست برای پایان دادن به قطع دسترسی را توضیح میدهد. Links and template includes all work as normal in the "reason" section.
مدت زمان قطع دسترسی به تاریخ انقضایی که به هنگام بسته شدن وارد شده بستگی دارد، که ممکن است «نامعین» یا «بیپایان» باشد (یعنی تا زمانی که صریحاً باز شود).
هنگامی که کاربر قطع دسترسی شده سعی کند ویرایش کند، آیپی مورد استفادهٔ او «قطع دسترسی خودکار» میشود، بنابراین کاربر نمیتواند همان ویرایش را به صورت ناشناس یا تحت نام کاربری دیگری انجام دهد. متغیر داخلی پایان قطع دسترسی خودکار موجود است و مقدار پیشفرض آن ۲۴ ساعت میباشد، بدین معنی که هرگاه کاربری به صورت «نامعین» بسته شده باشد، آیپی مورد استفاهٔ او تا ۲۴ ساعت پس از آخرین مرتبهای که از صفحات بازدید کرده باشد قطع دسترسی خودکار خواهد شد.
مدیران و دیوانسالاران در صورت قطع دسترسی شدن امکان واگردانی، حذف و احیای صفحات، و محافت کردن و باز کردن صفحات را نیز از دست میهند. اما همچنان میتوانند کاربران را ببندند و باز کنند، و دیوانسالاران کماکان میتوانند کاربر دیگری را مدیر کنند.
[[رده:سیاستهای ویکیکتاب]]
esjt19zri7wkej3k7l3sxs4yfog86c1
135095
135094
2026-09-20T08:04:23Z
Vivairan2
28134
135095
wikitext
text/x-wiki
{{میانبر|وک:قطع|وک:بستن}}
{{چکیده|کاربران یا [[IP|نشانیهای IP]] ممکن است توسط مدیران بهخاطر حفاظت از ویکیپدیا در برابر اخلال '''قطع دسترسی''' شوند.}}
{{فهرست سیاستها}}
[[وک:مدیران|مدیران]] ویکیکتاب میتوانند به دلایل مختلفی دسترسی کاربران را (اعم از کاربران دارای شناسهٔ کاربری با هر دسترسی، یا کاربران ناشناس که [[IP|نشانی IP]] آنها در کنار ویرایشهایشان ثبت میشود) برای ویرایش ویکیکتاب محدود کنند. بهطور کلی هر کاربری که عمداً در ویکیکتاب فارسی [[ویکیکتاب:خرابکاری|خرابکاری]] کند (مثلاً حذف بیمورد اطلاعات مفید مقالات یا نوشتن مطالب نامربوط در آنها)، به شخص یا گروهی توهین یا حملهٔ شخصی کند (مستقل از لفظ مورد استفاده)، ایجاد سوء تفاهم کند (مثلاً با تغییر آرا یا امضاها یا استفاده از امضای دیگران)، یا به هر ترتیب دیگری باعث اخلال در روند پیشبرد کتابخانه شود، امکان بسته شدن دارد. در تمامی این موارد، قطع دسترسی با هدف حفاظت از ویکیکتاب انجام میشود، نه برای تنبیه فرد خاطی.
کاربری که قطع دسترسی شدهاست میتواند صفحات ویکیکتاب را مشاهده کند ولی امکان ویرایش در صفحات ویکیکتاب را (در اکثر موارد) ندارد به جز [[وک:کاربر|صفحهٔ بحث خود کاربر]].
== آثار بسته شدن ==
کاربران و آیپیهای بسته شده کماکان قادر به مشاهدهٔ تمامی صفحات ویکی نبشته هستند، اما با کلیک کردن بر لینک «ویرایش» صفحهای با مضمون «[[مدیاویکی:Blockedtext|دسترسی حساب کاربری یا نشانی آیپی شما بسته شدهاست.]]» ظاهر میشود که دلیل قطع دسترسی و چگونگی ارائهٔ درخواست برای پایان دادن به قطع دسترسی را توضیح میدهد. Links and template includes all work as normal in the "reason" section.
مدت زمان قطع دسترسی به تاریخ انقضایی که به هنگام بسته شدن وارد شده بستگی دارد، که ممکن است «نامعین» یا «بیپایان» باشد (یعنی تا زمانی که صریحاً باز شود).
هنگامی که کاربر قطع دسترسی شده سعی کند ویرایش کند، آیپی مورد استفادهٔ او «قطع دسترسی خودکار» میشود، بنابراین کاربر نمیتواند همان ویرایش را به صورت ناشناس یا تحت نام کاربری دیگری انجام دهد. متغیر داخلی پایان قطع دسترسی خودکار موجود است و مقدار پیشفرض آن ۲۴ ساعت میباشد، بدین معنی که هرگاه کاربری به صورت «نامعین» بسته شده باشد، آیپی مورد استفاهٔ او تا ۲۴ ساعت پس از آخرین مرتبهای که از صفحات بازدید کرده باشد قطع دسترسی خودکار خواهد شد.
مدیران و دیوانسالاران در صورت قطع دسترسی شدن امکان واگردانی، حذف و احیای صفحات، و محافت کردن و باز کردن صفحات را نیز از دست میهند. اما همچنان میتوانند کاربران را ببندند و باز کنند، و دیوانسالاران کماکان میتوانند کاربر دیگری را مدیر کنند.
[[رده:سیاستهای ویکیکتاب]]
cj0vy8a0j3n3ikeae48z4umv9736bm7
ویکیکتاب:قطع
4
42104
135092
2026-09-20T07:57:17Z
Vivairan2
28134
تغییرمسیر به [[ویکیکتاب:قطع دسترسی]]
135092
wikitext
text/x-wiki
#تغییر_مسیر [[ویکیکتاب:قطع دسترسی]]
8ljp3tfbc6kxuei7lzp4ijnlwbjoxn7
ویکیکتاب:بستن
4
42105
135093
2026-09-20T07:57:46Z
Vivairan2
28134
تغییرمسیر به [[ویکیکتاب:قطع دسترسی]]
135093
wikitext
text/x-wiki
#تغییر_مسیر [[ویکیکتاب:قطع دسترسی]]
8ljp3tfbc6kxuei7lzp4ijnlwbjoxn7
الگو:Db-attack
10
42106
135097
2026-09-20T08:08:20Z
Vivairan2
28134
تغییرمسیر به [[الگو:Db-g10]]
135097
wikitext
text/x-wiki
#تغییر_مسیر [[الگو:Db-g10]]
nra6y9jh23j0zghdqqu5kiebe1jfgg6
الگو:Db-g10
10
42107
135098
2026-09-20T08:09:00Z
Vivairan2
28134
صفحهای تازه حاوی «<includeonly>{{</includeonly><includeonly>حذف سریع|صفحه [[ویکیکتاب:صفحه حمله|قصدی جز بیاعتبار ساختن یا تهدید سوژه اش ندارد]].}}</includeonly> <noinclude>{{توضیحات}}</noinclude>» ایجاد کرد
135098
wikitext
text/x-wiki
<includeonly>{{</includeonly><includeonly>حذف سریع|صفحه [[ویکیکتاب:صفحه حمله|قصدی جز بیاعتبار ساختن یا تهدید سوژه اش ندارد]].}}</includeonly>
<noinclude>{{توضیحات}}</noinclude>
7egq178pqu1gf7hz8znxmyrdxe8rz1y
الگو:Db-g10/توضیحات
10
42108
135099
2026-09-20T08:10:34Z
Vivairan2
28134
صفحهای تازه حاوی «{{زیرصفحه توضیحات}} <!-- لطفاً ردهها و پیوندهای میانویکی را در انتهای این صفحه اضافه کنید --> '''معیار نوشته شده در این الگو بر پایه [[ویکیکتاب:سیاست حذف]] نوشته شده است.''' === استفاده === {{توینکل}} === جستارهای وابسته === <includeonly> <!-- ردهها و میانویکی...» ایجاد کرد
135099
wikitext
text/x-wiki
{{زیرصفحه توضیحات}}
<!-- لطفاً ردهها و پیوندهای میانویکی را در انتهای این صفحه اضافه کنید -->
'''معیار نوشته شده در این الگو بر پایه [[ویکیکتاب:سیاست حذف]] نوشته شده است.'''
=== استفاده ===
{{توینکل}}
=== جستارهای وابسته ===
<includeonly>
<!-- ردهها و میانویکیها را در اینجا اضافه کنید، ممنون -->
</includeonly>
omtv41aktbge9f3zhchu3jmseprd6t3
الگو:الگوب
10
42109
135106
2026-09-20T08:41:38Z
Vivairan2
28134
صفحهای تازه حاوی «{{#درخواست:Template link general|main|code=on}}<noinclude> {{توضیحات|1=الگو:الگوع/توضیحات |محتوا = {{پیوند الگو کلی/توضیحات|الگوب}} }} <!-- لطفاً ردهها را در زیرصفحهٔ /توضیحات، و میانویکیها را در ویکیداده قرار دهید --> </noinclude>» ایجاد کرد
135106
wikitext
text/x-wiki
{{#درخواست:Template link general|main|code=on}}<noinclude>
{{توضیحات|1=الگو:الگوع/توضیحات
|محتوا = {{پیوند الگو کلی/توضیحات|الگوب}}
}}
<!-- لطفاً ردهها را در زیرصفحهٔ /توضیحات، و میانویکیها را در ویکیداده قرار دهید -->
</noinclude>
sr20ar0onl7wyvofnjx450u6hjsa6it
ویکیکتاب:فرض حسن نیت
4
42110
135110
2026-09-20T09:31:39Z
Vivairan2
28134
صفحهای تازه حاوی «{{رهنمود موضوعی|رهنمودهای رفتاری|وپ:حسن|وپ:فحن}} {{این رهنمود در یک نگاه| * فرض را بر این بگذارید که دیگران برای بهبود ویکی کار میکنند نه برای خراب کردن آن، مگر آن که دلایل بسیار روشنی علیه این فرض وجود داشته باشد. * زمانی که نقد میکنید، در مورد...» ایجاد کرد
135110
wikitext
text/x-wiki
{{رهنمود موضوعی|رهنمودهای رفتاری|وپ:حسن|وپ:فحن}}
{{این رهنمود در یک نگاه|
* فرض را بر این بگذارید که دیگران برای بهبود ویکی کار میکنند نه برای خراب کردن آن، مگر آن که دلایل بسیار روشنی علیه این فرض وجود داشته باشد.
* زمانی که نقد میکنید، در مورد مشارکتهای کاربر دیگر نظر بدهید و نه در مورد نیتها و اغراض درونی وی.}}
{{فهرست رهنمودها}}
{{سیاستها و رهنمودهای ویکیکتاب}}
'''فرض حسن نیت (فحن)''' از اصول بنیادی ویکیپدیاست. طبق این اصل، فرض بر آن است که ویرایشها و نظرهای کاربران با حسن نیت همراه است. بیشتر افراد سعی میکنند به پروژه کمک کنند، نه اینکه به آن آسیب برسانند. اگر این گزاره نادرست میبود، پروژهای چون ویکیپدیا از همان اول محکوم به شکست بود. این رهنمود ویرایشگران را ملزم نمیدارد که با وجود مدرک واضح بر سوء نیت (مثلاً [[ویکیپدیا:خرابکاری|خرابکاری]])، همچنان فرض را بر حسن نیت بگذارند. فرض حسن نیت مانع از بروز بحث و انتقاد نیست. بلکه، ویرایشگران نباید اقدامات مورد انتقاد را بدون مدرک به خباثت و غرضورزی نسبت دهند.
موقع بروز اختلاف، سعی کنید موضعتان را توضیح دهید و مشکل را حل کنید، نه اینکه بر شدت تنشها بیفزایید و به دیگران نیز این فرصت را بدهید که اینچنین رفتار کنند. در نظر بگیرید که شاید اختلاف ناشی از زوایای دید متفاوت است و دنبال راههایی برای حصول [[ویکیپدیا:اجماع|اجماع]] بگردید.
وقتی دربارهٔ حسن نیت شما تردید ابراز میشود، در صورت امکان، خود همچنان فرض کنید که طرف مقابل حسن نیت دارد. [[ویکیپدیا:نزاکت|نزاکت]] را رعایت کنید و فرایند [[ویکیپدیا:حل اختلاف|حل اختلاف]] را دنبال کنید، نه اینکه به کاربران [[ویکیپدیا:حمله شخصی ممنوع|حمله]] کنید و با آنها [[ویکیپدیا:جنگ ویرایشی|جنگ ویرایشی]] راه بیندازید. اگر میخواهید دربارهٔ رفتار سایر کاربران ابراز تردید کنید، با ارائهٔ [[راهنما:تفاوت|پیوند تفاوت]] و مدارک مربوط دیگر موضعتان را مستند کنید، تا دیگران بتوانند مبنای نگرانیهایتان را درک کنند. حتی وقتی بدرفتاری ناشی از سوء نیت به نظر میرسد، اغلب بهتر است بدون اشاره به انگیزهها به رفتار بپردازید، وگرنه احتمالاً دلخوری از همهسو تشدید میشود.
مواظب باشید خیلی زیاد به این اصل اشاره نکنید. همانطور که میتوان بهاشتباه تشخیص داد که دیگری از روی سوء نیت عمل میکند، میتوان بهاشتباه نتیجهگیری کرد که دیگری فرض را بر سوء نیت گذاشته است؛ ترغیبهای متعدد به «فرض حسن نیت» میتوانند خود نشانهای از فرضهای منفی دربارهٔ دیگران باشند.
== دربارهٔ حسن نیت ==
[[پرونده:A_handshake.png|انگشتی|ایستاده|رعایت نزاکت و فرض حسن نیت از نقاط اتکای ویکیپدیای هستند.]]
همه اشتباه میکنند، هم اشتباهات رفتاری (مثلاً [[ویکیپدیا:حمله شخصی ممنوع|حمله به شخصیت]]) و هم محتوایی (مثلاً افزودن [[ویکیپدیا:تحقیق دستاول ممنوع|تحقیق دست اول]]). اغلب اوقات میتوانیم این اشتباهات را با یادآوریهای ساده اصلاح کنیم. با وجود این، اختلافاتی در ویکیپدیا بروز میکند که هیچ سیاست یا رهنمودی پاسخ سرراست به آنها نمیدهد. موقع بروز اختلافات، شاید نیت بد دخیل نبوده باشد. [[ویکیپدیا:هنگام مجادلهٔ ویرایشی، خونسرد بمانید|خونسردیتان]] را حفظ کنید و اگر اختلافها لاینحل به نظر میرسند (که اغلبشان اینچنین نیستند) فرایند [[ویکیپدیا:حل اختلاف|حل اختلاف]] را طی کنید.
نقض سیاستها، مثلاً [[ویکیپدیا:حساب زاپاس|زاپاسبازی]]، نقض [[ویکیپدیا:اجماع|اجماع]] و غیره، ممکن است از روی حسن نیت یا سوء نیت صورت بگیرند. برای مواجهه با همهٔ این حالتها فرایندهایی وجود دارد و اعمال [[ویکیپدیا:قطع دسترسی|جریمه]] به دلیل نقض مکرر سیاست فارغ از اینکه سوء نیت دخیل بوده است یا نه انجام خواهد گرفت.
=== حسن نیت و تازهواردان ===
{{اصلی|ویکیپدیا:لطفاً با چماق به استقبال تازهواردها نروید}}
مهم است که نسبت به تازهواردان که با فرهنگ و مقررات ویکیپدیا ناآشنایند ولی ممکن است به مشارکتکنندگان ارزشمندی مبدل شوند صبوری کرد.
رفتار یک تازهوارد احتمالاً به نظر خودش مناسب است و بروز مشکلات معمولاً ناشی از ناآشنایی او با فرهنگ ویکیپدیا یا پیشامد سوءتفاهم است. نادر نیست که تازهواردی فکر کند که فلان سیاست باید مطابق با درک او از شرایط و نحوهٔ کار تغییر کند، مخصوصاً اگر متوجه شود که راجع به سیاست مورد نظر از قبل اختلاف نظر وجود دارد. همینطور، بسیاری از تازهواردان انتظار دارند که مشارکتهایشان در مقالات بدون سؤال پذیرفته شوند، بهویژه اگر دربارهٔ موضوع مقاله عمیقاً مطلع باشند. رفتارهای ناشی از این دست دیدگاهها، هرچند احتمالاً نادرست هستند، معمولاً غرضورزانه نیستند و نباید اینطور در نظر گرفته شوند. بسیاری از تازهواردانی که در بدو امر از رسوم ویکیپدیا درک شهودی خوبی ندارند وقتی منطق پشت این رسوم برایشان آشکارتر میشود، بهتدریج تغییر عقیده میدهند.
=== حسن نیت و حق نشر ===
{{اصلی|ویکیپدیا:حق تکثیر}}
{{میانبر|وپ:فحننشر}}
موقع مواجهه با نقضهای احتمالی حق نشر، حسن نیت به این معنی است که فرض کرد ویرایشگران قصد دارند به سیاستهای وبگاه و نیز قانون کشوری پایبند باشند. این فرق دارد با آنکه فرض کرد واقعاً به هر دو پایبند بودهاند. ویرایشگران ملزمند خود به شیوهای کنشگرانه بارگذاریهایشان را مستند کنند (ذکر منبع، ذکر پروانه و غیره) و درصورتیکه مستندسازیها اشتباه یا ناکافی باشند، پروندهها حذف خواهند شد. اقدامات اصلاحی توأم با حسن نیت شامل آگاه کردن کاربران از وجود مشکل و کمک کردن ایشان برای حل مشکلات است.
== حسن نیت چه چیزی نیست ==
{{میانبر|وپ:فحن نیست|وپ:نفحن}}
[[پرونده:David - The Death of Socrates.jpg|thumb|upright=1.2|[[سقراط]] به این معروف بود که قاطعانه فرض میکرد اطرافیانش با حسن نیت عمل میکنند.]]
بسیاری افراد درکی اشتباه از رهنمود «فرض حسن نیت» ویکیپدیا دارند و تصور میکنند که این رهنمود به این معنای «فرض انجام [[ارزیابی بایسته]] توسط ویرایشگری دیگر» یا «فرض نیت کور» در مواجهه با منابع، ویرایگران یا محتوای صفحهها است. اما منظور در اصل بیشتر به «احتمال وجود قصد خوب» نزدیک است، که به این معنا نیست که «من به منبع دسترسی ندارم، پس در مورد محتوای منبع، فرض را بر حسن نیت میگذارم» و همچنین به این معنا نیست که «یک ویرایشگر [[ویکیپدیا:شیوه ارجاع به منابع|محتوای بدون منبع را حذف کرده است]]، پس من ''با فرض حسن نیت '' اینطور در نظر میگیرم که او ارزیابی بایسته انجام داده تا مطمئن شود که [[ویکیپدیا:منابع معتبر|منابع معتبر]] برای آن محتوا در دسترس نیست.»
این رهنمود همچنین به این معنا نیست که باید شواهد واضح مبنی بر [[ویکیپدیا:ویرایش اخلالگرانه|رفتار اخلالگرانه]] یا [[ویکیپدیا:سیاستها و رهنمودها|نقض رهنمودهای ویکیپدیا]] را نادیده بگیرید و تمام ویرایشها را بدون هیچ پرسشی بپذیرید. برخی از بازیگران بد ممکن است اصرار داشته باشند که اعتماد به آنها با استناد به «فرض حسن نیت» باید تغییرناپذیر باشد، حتی اگر شواهدی بر ضد آن موجود باشد. با این حال، ویرایشگران باید توجه کنند که الگوهای ویرایشهای مخرب را نادیده نگیرند، و همچنین نباید از تلاشهای آشکار برای فریب، [[ویکیپدیا:خرابکاری|خرابکاری]] یا پیشبرد یک [[ویکیپدیا:دیدگاه بیطرف|دستور کار مغرضانه]] چشمپوشی کنند. در عوض، رهنمود «فرض حسن نیت» ویرایشگران را تشویق میکند که قدم نخست را با این باور بردارند که دیگران در تلاش برای بهبود ویکیپدیا هستند. هنگامی که با یک ویرایش مشکلدار روبرو میشوید، مهم است که آن را بررسی و به آن رسیدگی کنید، اما هنگام انجام این کار این موضوع را در نظر داشته باشید که اشتباهاتی هم ممکن است رخ دهند و هر خطایی با نیت بدخواهانه انجام نمیشود. کاربرد فرض حسن نیت در حفظ یک محیط ویرایش مشارکتی و محترمانه است.
== نشان دادن حسن نیت ==
{{میانبر|وک:نحن}}
علاوه بر فرض حسن نیت، با نشان دادن حسن نیت خودتان، دیگران را به صورت عملی به فرض حسن نیت ترغیب کنید. این کار به واسطهٔ بیان [[ویکیپدیا:صداقت|صادقانهٔ]] انگیزههایتان و انجام ویرایشهایی که تمایل شما به مصالحه، علاقهتان به بهبود ویکیپدیا، پایبندیتان به سیاستها و رهنمودهایش، اعتقادتان به صحت ویرایشهایتان، خودداریتان از [[ویکیپدیا:بازی با سامانه|به بازی گرفتن سامانه]] و دیگر رفتارهای مبتنی بر حسن نیت را نشان میدهند میسر است. نشان دادن حسن نیت الزامی نیست، اما به تعامل موفق و بیدردسر با دیگران کمک میکند.
== مواجهه با سوء نیت ==
{{میانبر|وک:سوءنیت}}
حتی وقتی سوء نیت طرف مقابل آشکار است، شما نباید خودتان در واکنش [[ویکیپدیا:نزاکت|بینزاکتی]] کنید، به شخصیت طرف مقابل [[ویکیپدیا:حمله شخصی ممنوع|حمله]] کنید، یا خونسردیتان را از دست بدهید. اگر یک طرف ماجرا از اول تا آخر درست رفتار کرده باشد، دیگران راحتتر خواهند توانست اختلاف را [[ویکیپدیا:حل اختلاف|حل]] کنند یا خطاهای طرف مقابل را ببینند.
مدیران ویکیپدیا و دیگر کاربران مجرب فعال در زمینهٔ حل اختلاف از کمک کردن به شما خوشحال خواهند شد و اگر با ارائهٔ مدرک واضح و مشخص توجه ایشان را به موضوع جلب کنید، قادرند رفتار ناقض سیاستها را تشخیص دهند.
=== اتهام سوء نیت به دیگران ===
بدون ارائهٔ مدرک واضح در قالب [[راهنما:تفاوت|پیوند تفاوت]] دیگر کاربران را به سوء نیت متهم نکنید. چنین ادعایی خریدار ندارد، به هدف نمیرسد و حتی میتواند تحریککننده باشد و اختلاف را حادتر کند. تکرار اتهام سوء نیت، بدون ارائه مدرک واضح که نشان دهد اقدامات یک کاربر در واقع با سوء نیت یا [[ویکیپدیا:آزار و اذیت|اذیتوآزار]] توأم هستند، خود میتواند به [[وپ:حمله شخصی ممنوع|حمله به شخصیت فرد]] تعبیر شود. طرف مقابل هم میتواند بهراحتی شما را به سوء نیت متهم کند، که در نتیجه چرخهای زشت از اتهامات ایجاد میشود بدون اینکه اختلاف حل شود.
[[رده:رهنمودهای ویکیکتاب]]
2vdyqn8dynw7c8xm6sqxqltexo9dl0e
135111
135110
2026-09-20T09:34:15Z
Vivairan2
28134
135111
wikitext
text/x-wiki
{{رهنمود}}
{{این رهنمود در یک نگاه|
* فرض را بر این بگذارید که دیگران برای بهبود ویکی کار میکنند نه برای خراب کردن آن، مگر آن که دلایل بسیار روشنی علیه این فرض وجود داشته باشد.
* زمانی که نقد میکنید، در مورد مشارکتهای کاربر دیگر نظر بدهید و نه در مورد نیتها و اغراض درونی وی.}}
{{فهرست رهنمودها}}
'''فرض حسن نیت (فحن)''' از اصول بنیادی ویکیپدیاست. طبق این اصل، فرض بر آن است که ویرایشها و نظرهای کاربران با حسن نیت همراه است. بیشتر افراد سعی میکنند به پروژه کمک کنند، نه اینکه به آن آسیب برسانند. اگر این گزاره نادرست میبود، پروژهای چون ویکیپدیا از همان اول محکوم به شکست بود. این رهنمود ویرایشگران را ملزم نمیدارد که با وجود مدرک واضح بر سوء نیت (مثلاً [[ویکیپدیا:خرابکاری|خرابکاری]])، همچنان فرض را بر حسن نیت بگذارند. فرض حسن نیت مانع از بروز بحث و انتقاد نیست. بلکه، ویرایشگران نباید اقدامات مورد انتقاد را بدون مدرک به خباثت و غرضورزی نسبت دهند.
موقع بروز اختلاف، سعی کنید موضعتان را توضیح دهید و مشکل را حل کنید، نه اینکه بر شدت تنشها بیفزایید و به دیگران نیز این فرصت را بدهید که اینچنین رفتار کنند. در نظر بگیرید که شاید اختلاف ناشی از زوایای دید متفاوت است و دنبال راههایی برای حصول [[ویکیپدیا:اجماع|اجماع]] بگردید.
وقتی دربارهٔ حسن نیت شما تردید ابراز میشود، در صورت امکان، خود همچنان فرض کنید که طرف مقابل حسن نیت دارد. [[ویکیپدیا:نزاکت|نزاکت]] را رعایت کنید و فرایند [[ویکیپدیا:حل اختلاف|حل اختلاف]] را دنبال کنید، نه اینکه به کاربران [[ویکیپدیا:حمله شخصی ممنوع|حمله]] کنید و با آنها [[ویکیپدیا:جنگ ویرایشی|جنگ ویرایشی]] راه بیندازید. اگر میخواهید دربارهٔ رفتار سایر کاربران ابراز تردید کنید، با ارائهٔ [[راهنما:تفاوت|پیوند تفاوت]] و مدارک مربوط دیگر موضعتان را مستند کنید، تا دیگران بتوانند مبنای نگرانیهایتان را درک کنند. حتی وقتی بدرفتاری ناشی از سوء نیت به نظر میرسد، اغلب بهتر است بدون اشاره به انگیزهها به رفتار بپردازید، وگرنه احتمالاً دلخوری از همهسو تشدید میشود.
مواظب باشید خیلی زیاد به این اصل اشاره نکنید. همانطور که میتوان بهاشتباه تشخیص داد که دیگری از روی سوء نیت عمل میکند، میتوان بهاشتباه نتیجهگیری کرد که دیگری فرض را بر سوء نیت گذاشته است؛ ترغیبهای متعدد به «فرض حسن نیت» میتوانند خود نشانهای از فرضهای منفی دربارهٔ دیگران باشند.
== دربارهٔ حسن نیت ==
[[پرونده:A_handshake.png|انگشتی|ایستاده|رعایت نزاکت و فرض حسن نیت از نقاط اتکای ویکیپدیای هستند.]]
همه اشتباه میکنند، هم اشتباهات رفتاری (مثلاً [[ویکیپدیا:حمله شخصی ممنوع|حمله به شخصیت]]) و هم محتوایی (مثلاً افزودن [[ویکیپدیا:تحقیق دستاول ممنوع|تحقیق دست اول]]). اغلب اوقات میتوانیم این اشتباهات را با یادآوریهای ساده اصلاح کنیم. با وجود این، اختلافاتی در ویکیپدیا بروز میکند که هیچ سیاست یا رهنمودی پاسخ سرراست به آنها نمیدهد. موقع بروز اختلافات، شاید نیت بد دخیل نبوده باشد. [[ویکیپدیا:هنگام مجادلهٔ ویرایشی، خونسرد بمانید|خونسردیتان]] را حفظ کنید و اگر اختلافها لاینحل به نظر میرسند (که اغلبشان اینچنین نیستند) فرایند [[ویکیپدیا:حل اختلاف|حل اختلاف]] را طی کنید.
نقض سیاستها، مثلاً [[ویکیپدیا:حساب زاپاس|زاپاسبازی]]، نقض [[ویکیپدیا:اجماع|اجماع]] و غیره، ممکن است از روی حسن نیت یا سوء نیت صورت بگیرند. برای مواجهه با همهٔ این حالتها فرایندهایی وجود دارد و اعمال [[ویکیپدیا:قطع دسترسی|جریمه]] به دلیل نقض مکرر سیاست فارغ از اینکه سوء نیت دخیل بوده است یا نه انجام خواهد گرفت.
=== حسن نیت و تازهواردان ===
{{اصلی|ویکیپدیا:لطفاً با چماق به استقبال تازهواردها نروید}}
مهم است که نسبت به تازهواردان که با فرهنگ و مقررات ویکیپدیا ناآشنایند ولی ممکن است به مشارکتکنندگان ارزشمندی مبدل شوند صبوری کرد.
رفتار یک تازهوارد احتمالاً به نظر خودش مناسب است و بروز مشکلات معمولاً ناشی از ناآشنایی او با فرهنگ ویکیپدیا یا پیشامد سوءتفاهم است. نادر نیست که تازهواردی فکر کند که فلان سیاست باید مطابق با درک او از شرایط و نحوهٔ کار تغییر کند، مخصوصاً اگر متوجه شود که راجع به سیاست مورد نظر از قبل اختلاف نظر وجود دارد. همینطور، بسیاری از تازهواردان انتظار دارند که مشارکتهایشان در مقالات بدون سؤال پذیرفته شوند، بهویژه اگر دربارهٔ موضوع مقاله عمیقاً مطلع باشند. رفتارهای ناشی از این دست دیدگاهها، هرچند احتمالاً نادرست هستند، معمولاً غرضورزانه نیستند و نباید اینطور در نظر گرفته شوند. بسیاری از تازهواردانی که در بدو امر از رسوم ویکیپدیا درک شهودی خوبی ندارند وقتی منطق پشت این رسوم برایشان آشکارتر میشود، بهتدریج تغییر عقیده میدهند.
=== حسن نیت و حق نشر ===
{{اصلی|ویکیپدیا:حق تکثیر}}
{{میانبر|وپ:فحننشر}}
موقع مواجهه با نقضهای احتمالی حق نشر، حسن نیت به این معنی است که فرض کرد ویرایشگران قصد دارند به سیاستهای وبگاه و نیز قانون کشوری پایبند باشند. این فرق دارد با آنکه فرض کرد واقعاً به هر دو پایبند بودهاند. ویرایشگران ملزمند خود به شیوهای کنشگرانه بارگذاریهایشان را مستند کنند (ذکر منبع، ذکر پروانه و غیره) و درصورتیکه مستندسازیها اشتباه یا ناکافی باشند، پروندهها حذف خواهند شد. اقدامات اصلاحی توأم با حسن نیت شامل آگاه کردن کاربران از وجود مشکل و کمک کردن ایشان برای حل مشکلات است.
== حسن نیت چه چیزی نیست ==
{{میانبر|وپ:فحن نیست|وپ:نفحن}}
[[پرونده:David - The Death of Socrates.jpg|thumb|upright=1.2|[[سقراط]] به این معروف بود که قاطعانه فرض میکرد اطرافیانش با حسن نیت عمل میکنند.]]
بسیاری افراد درکی اشتباه از رهنمود «فرض حسن نیت» ویکیپدیا دارند و تصور میکنند که این رهنمود به این معنای «فرض انجام [[ارزیابی بایسته]] توسط ویرایشگری دیگر» یا «فرض نیت کور» در مواجهه با منابع، ویرایگران یا محتوای صفحهها است. اما منظور در اصل بیشتر به «احتمال وجود قصد خوب» نزدیک است، که به این معنا نیست که «من به منبع دسترسی ندارم، پس در مورد محتوای منبع، فرض را بر حسن نیت میگذارم» و همچنین به این معنا نیست که «یک ویرایشگر [[ویکیپدیا:شیوه ارجاع به منابع|محتوای بدون منبع را حذف کرده است]]، پس من ''با فرض حسن نیت '' اینطور در نظر میگیرم که او ارزیابی بایسته انجام داده تا مطمئن شود که [[ویکیپدیا:منابع معتبر|منابع معتبر]] برای آن محتوا در دسترس نیست.»
این رهنمود همچنین به این معنا نیست که باید شواهد واضح مبنی بر [[ویکیپدیا:ویرایش اخلالگرانه|رفتار اخلالگرانه]] یا [[ویکیپدیا:سیاستها و رهنمودها|نقض رهنمودهای ویکیپدیا]] را نادیده بگیرید و تمام ویرایشها را بدون هیچ پرسشی بپذیرید. برخی از بازیگران بد ممکن است اصرار داشته باشند که اعتماد به آنها با استناد به «فرض حسن نیت» باید تغییرناپذیر باشد، حتی اگر شواهدی بر ضد آن موجود باشد. با این حال، ویرایشگران باید توجه کنند که الگوهای ویرایشهای مخرب را نادیده نگیرند، و همچنین نباید از تلاشهای آشکار برای فریب، [[ویکیپدیا:خرابکاری|خرابکاری]] یا پیشبرد یک [[ویکیپدیا:دیدگاه بیطرف|دستور کار مغرضانه]] چشمپوشی کنند. در عوض، رهنمود «فرض حسن نیت» ویرایشگران را تشویق میکند که قدم نخست را با این باور بردارند که دیگران در تلاش برای بهبود ویکیپدیا هستند. هنگامی که با یک ویرایش مشکلدار روبرو میشوید، مهم است که آن را بررسی و به آن رسیدگی کنید، اما هنگام انجام این کار این موضوع را در نظر داشته باشید که اشتباهاتی هم ممکن است رخ دهند و هر خطایی با نیت بدخواهانه انجام نمیشود. کاربرد فرض حسن نیت در حفظ یک محیط ویرایش مشارکتی و محترمانه است.
== نشان دادن حسن نیت ==
{{میانبر|وک:نحن}}
علاوه بر فرض حسن نیت، با نشان دادن حسن نیت خودتان، دیگران را به صورت عملی به فرض حسن نیت ترغیب کنید. این کار به واسطهٔ بیان [[ویکیپدیا:صداقت|صادقانهٔ]] انگیزههایتان و انجام ویرایشهایی که تمایل شما به مصالحه، علاقهتان به بهبود ویکیپدیا، پایبندیتان به سیاستها و رهنمودهایش، اعتقادتان به صحت ویرایشهایتان، خودداریتان از [[ویکیپدیا:بازی با سامانه|به بازی گرفتن سامانه]] و دیگر رفتارهای مبتنی بر حسن نیت را نشان میدهند میسر است. نشان دادن حسن نیت الزامی نیست، اما به تعامل موفق و بیدردسر با دیگران کمک میکند.
== مواجهه با سوء نیت ==
{{میانبر|وک:سوءنیت}}
حتی وقتی سوء نیت طرف مقابل آشکار است، شما نباید خودتان در واکنش [[ویکیپدیا:نزاکت|بینزاکتی]] کنید، به شخصیت طرف مقابل [[ویکیپدیا:حمله شخصی ممنوع|حمله]] کنید، یا خونسردیتان را از دست بدهید. اگر یک طرف ماجرا از اول تا آخر درست رفتار کرده باشد، دیگران راحتتر خواهند توانست اختلاف را [[ویکیپدیا:حل اختلاف|حل]] کنند یا خطاهای طرف مقابل را ببینند.
مدیران ویکیپدیا و دیگر کاربران مجرب فعال در زمینهٔ حل اختلاف از کمک کردن به شما خوشحال خواهند شد و اگر با ارائهٔ مدرک واضح و مشخص توجه ایشان را به موضوع جلب کنید، قادرند رفتار ناقض سیاستها را تشخیص دهند.
=== اتهام سوء نیت به دیگران ===
بدون ارائهٔ مدرک واضح در قالب [[راهنما:تفاوت|پیوند تفاوت]] دیگر کاربران را به سوء نیت متهم نکنید. چنین ادعایی خریدار ندارد، به هدف نمیرسد و حتی میتواند تحریککننده باشد و اختلاف را حادتر کند. تکرار اتهام سوء نیت، بدون ارائه مدرک واضح که نشان دهد اقدامات یک کاربر در واقع با سوء نیت یا [[ویکیپدیا:آزار و اذیت|اذیتوآزار]] توأم هستند، خود میتواند به [[وپ:حمله شخصی ممنوع|حمله به شخصیت فرد]] تعبیر شود. طرف مقابل هم میتواند بهراحتی شما را به سوء نیت متهم کند، که در نتیجه چرخهای زشت از اتهامات ایجاد میشود بدون اینکه اختلاف حل شود.
[[رده:رهنمودهای ویکیکتاب]]
djbezwpda8q26jzam7mygm3m612iwg4
135112
135111
2026-09-20T09:39:44Z
Vivairan2
28134
135112
wikitext
text/x-wiki
{{رهنمود}}
{{این رهنمود در یک نگاه|
* فرض را بر این بگذارید که دیگران برای بهبود ویکی کار میکنند نه برای خراب کردن آن، مگر آن که دلایل بسیار روشنی علیه این فرض وجود داشته باشد.
* زمانی که نقد میکنید، در مورد مشارکتهای کاربر دیگر نظر بدهید و نه در مورد نیتها و اغراض درونی وی.}}
{{فهرست رهنمودها}}
'''فرض حسن نیت (فحن)''' از رهنمودهای ویکیکتاب است. طبق این رهنمود، فرض بر آن است که ویرایشها و نظرهای کاربران با حسن نیت همراه است. بیشتر افراد سعی میکنند به پروژه کمک کنند، نه اینکه به آن آسیب برسانند. اگر این گزاره نادرست میبود، پروژهای چون ویکیکتاب از همان اول محکوم به شکست بود. این رهنمود ویرایشگران را ملزم نمیدارد که با وجود مدرک واضح بر سوء نیت (مثلاً [[ویکیکتاب:خرابکاری|خرابکاری]])، همچنان فرض را بر حسن نیت بگذارند. فرض حسن نیت مانع از بروز بحث و انتقاد نیست. بلکه، ویرایشگران نباید اقدامات مورد انتقاد را بدون مدرک به خباثت و غرضورزی نسبت دهند.
موقع بروز اختلاف، سعی کنید موضعتان را توضیح دهید و مشکل را حل کنید، نه اینکه بر شدت تنشها بیفزایید و به دیگران نیز این فرصت را بدهید که اینچنین رفتار کنند. در نظر بگیرید که شاید اختلاف ناشی از زوایای دید متفاوت است و دنبال راههایی برای حصول [[ویکیکتاب:اجماع|اجماع]] بگردید.
وقتی دربارهٔ حسن نیت شما تردید ابراز میشود، در صورت امکان، خود همچنان فرض کنید که طرف مقابل حسن نیت دارد. [[w:fa:ویکیپدیا:نزاکت|نزاکت]] را رعایت کنید و فرایند [[ویکیپدیا:حل اختلاف|حل اختلاف]] را دنبال کنید، نه اینکه به کاربران [[ویکیکتاب:حمله شخصی ممنوع|حمله]] کنید و با آنها [[ویکیکتاب:جنگ ویرایشی|جنگ ویرایشی]] راه بیندازید. اگر میخواهید دربارهٔ رفتار سایر کاربران ابراز تردید کنید، با ارائهٔ [[راهنما:تفاوت|پیوند تفاوت]] و مدارک مربوط دیگر موضعتان را مستند کنید، تا دیگران بتوانند مبنای نگرانیهایتان را درک کنند. حتی وقتی بدرفتاری ناشی از سوء نیت به نظر میرسد، اغلب بهتر است بدون اشاره به انگیزهها به رفتار بپردازید، وگرنه احتمالاً دلخوری از همهسو تشدید میشود.
مواظب باشید خیلی زیاد به این اصل اشاره نکنید. همانطور که میتوان بهاشتباه تشخیص داد که دیگری از روی سوء نیت عمل میکند، میتوان بهاشتباه نتیجهگیری کرد که دیگری فرض را بر سوء نیت گذاشته است؛ ترغیبهای متعدد به «فرض حسن نیت» میتوانند خود نشانهای از فرضهای منفی دربارهٔ دیگران باشند.
== دربارهٔ حسن نیت ==
[[پرونده:A_handshake.png|انگشتی|ایستاده|رعایت نزاکت و فرض حسن نیت از نقاط اتکای ویکیپدیای هستند.]]
همه اشتباه میکنند، هم اشتباهات رفتاری (مثلاً [[ویکیپدیا:حمله شخصی ممنوع|حمله به شخصیت]]) و هم محتوایی (مثلاً افزودن [[ویکیپدیا:تحقیق دستاول ممنوع|تحقیق دست اول]]). اغلب اوقات میتوانیم این اشتباهات را با یادآوریهای ساده اصلاح کنیم. با وجود این، اختلافاتی در ویکیپدیا بروز میکند که هیچ سیاست یا رهنمودی پاسخ سرراست به آنها نمیدهد. موقع بروز اختلافات، شاید نیت بد دخیل نبوده باشد. [[ویکیپدیا:هنگام مجادلهٔ ویرایشی، خونسرد بمانید|خونسردیتان]] را حفظ کنید و اگر اختلافها لاینحل به نظر میرسند (که اغلبشان اینچنین نیستند) فرایند [[ویکیپدیا:حل اختلاف|حل اختلاف]] را طی کنید.
نقض سیاستها، مثلاً [[ویکیپدیا:حساب زاپاس|زاپاسبازی]]، نقض [[ویکیپدیا:اجماع|اجماع]] و غیره، ممکن است از روی حسن نیت یا سوء نیت صورت بگیرند. برای مواجهه با همهٔ این حالتها فرایندهایی وجود دارد و اعمال [[ویکیپدیا:قطع دسترسی|جریمه]] به دلیل نقض مکرر سیاست فارغ از اینکه سوء نیت دخیل بوده است یا نه انجام خواهد گرفت.
=== حسن نیت و تازهواردان ===
{{اصلی|ویکیپدیا:لطفاً با چماق به استقبال تازهواردها نروید}}
مهم است که نسبت به تازهواردان که با فرهنگ و مقررات ویکیپدیا ناآشنایند ولی ممکن است به مشارکتکنندگان ارزشمندی مبدل شوند صبوری کرد.
رفتار یک تازهوارد احتمالاً به نظر خودش مناسب است و بروز مشکلات معمولاً ناشی از ناآشنایی او با فرهنگ ویکیپدیا یا پیشامد سوءتفاهم است. نادر نیست که تازهواردی فکر کند که فلان سیاست باید مطابق با درک او از شرایط و نحوهٔ کار تغییر کند، مخصوصاً اگر متوجه شود که راجع به سیاست مورد نظر از قبل اختلاف نظر وجود دارد. همینطور، بسیاری از تازهواردان انتظار دارند که مشارکتهایشان در مقالات بدون سؤال پذیرفته شوند، بهویژه اگر دربارهٔ موضوع مقاله عمیقاً مطلع باشند. رفتارهای ناشی از این دست دیدگاهها، هرچند احتمالاً نادرست هستند، معمولاً غرضورزانه نیستند و نباید اینطور در نظر گرفته شوند. بسیاری از تازهواردانی که در بدو امر از رسوم ویکیپدیا درک شهودی خوبی ندارند وقتی منطق پشت این رسوم برایشان آشکارتر میشود، بهتدریج تغییر عقیده میدهند.
=== حسن نیت و حق نشر ===
{{اصلی|ویکیپدیا:حق تکثیر}}
{{میانبر|وپ:فحننشر}}
موقع مواجهه با نقضهای احتمالی حق نشر، حسن نیت به این معنی است که فرض کرد ویرایشگران قصد دارند به سیاستهای وبگاه و نیز قانون کشوری پایبند باشند. این فرق دارد با آنکه فرض کرد واقعاً به هر دو پایبند بودهاند. ویرایشگران ملزمند خود به شیوهای کنشگرانه بارگذاریهایشان را مستند کنند (ذکر منبع، ذکر پروانه و غیره) و درصورتیکه مستندسازیها اشتباه یا ناکافی باشند، پروندهها حذف خواهند شد. اقدامات اصلاحی توأم با حسن نیت شامل آگاه کردن کاربران از وجود مشکل و کمک کردن ایشان برای حل مشکلات است.
== حسن نیت چه چیزی نیست ==
{{میانبر|وپ:فحن نیست|وپ:نفحن}}
[[پرونده:David - The Death of Socrates.jpg|thumb|upright=1.2|[[سقراط]] به این معروف بود که قاطعانه فرض میکرد اطرافیانش با حسن نیت عمل میکنند.]]
بسیاری افراد درکی اشتباه از رهنمود «فرض حسن نیت» ویکیپدیا دارند و تصور میکنند که این رهنمود به این معنای «فرض انجام [[ارزیابی بایسته]] توسط ویرایشگری دیگر» یا «فرض نیت کور» در مواجهه با منابع، ویرایگران یا محتوای صفحهها است. اما منظور در اصل بیشتر به «احتمال وجود قصد خوب» نزدیک است، که به این معنا نیست که «من به منبع دسترسی ندارم، پس در مورد محتوای منبع، فرض را بر حسن نیت میگذارم» و همچنین به این معنا نیست که «یک ویرایشگر [[ویکیپدیا:شیوه ارجاع به منابع|محتوای بدون منبع را حذف کرده است]]، پس من ''با فرض حسن نیت '' اینطور در نظر میگیرم که او ارزیابی بایسته انجام داده تا مطمئن شود که [[ویکیپدیا:منابع معتبر|منابع معتبر]] برای آن محتوا در دسترس نیست.»
این رهنمود همچنین به این معنا نیست که باید شواهد واضح مبنی بر [[ویکیپدیا:ویرایش اخلالگرانه|رفتار اخلالگرانه]] یا [[ویکیپدیا:سیاستها و رهنمودها|نقض رهنمودهای ویکیپدیا]] را نادیده بگیرید و تمام ویرایشها را بدون هیچ پرسشی بپذیرید. برخی از بازیگران بد ممکن است اصرار داشته باشند که اعتماد به آنها با استناد به «فرض حسن نیت» باید تغییرناپذیر باشد، حتی اگر شواهدی بر ضد آن موجود باشد. با این حال، ویرایشگران باید توجه کنند که الگوهای ویرایشهای مخرب را نادیده نگیرند، و همچنین نباید از تلاشهای آشکار برای فریب، [[ویکیپدیا:خرابکاری|خرابکاری]] یا پیشبرد یک [[ویکیپدیا:دیدگاه بیطرف|دستور کار مغرضانه]] چشمپوشی کنند. در عوض، رهنمود «فرض حسن نیت» ویرایشگران را تشویق میکند که قدم نخست را با این باور بردارند که دیگران در تلاش برای بهبود ویکیپدیا هستند. هنگامی که با یک ویرایش مشکلدار روبرو میشوید، مهم است که آن را بررسی و به آن رسیدگی کنید، اما هنگام انجام این کار این موضوع را در نظر داشته باشید که اشتباهاتی هم ممکن است رخ دهند و هر خطایی با نیت بدخواهانه انجام نمیشود. کاربرد فرض حسن نیت در حفظ یک محیط ویرایش مشارکتی و محترمانه است.
== نشان دادن حسن نیت ==
{{میانبر|وک:نحن}}
علاوه بر فرض حسن نیت، با نشان دادن حسن نیت خودتان، دیگران را به صورت عملی به فرض حسن نیت ترغیب کنید. این کار به واسطهٔ بیان [[ویکیپدیا:صداقت|صادقانهٔ]] انگیزههایتان و انجام ویرایشهایی که تمایل شما به مصالحه، علاقهتان به بهبود ویکیپدیا، پایبندیتان به سیاستها و رهنمودهایش، اعتقادتان به صحت ویرایشهایتان، خودداریتان از [[ویکیپدیا:بازی با سامانه|به بازی گرفتن سامانه]] و دیگر رفتارهای مبتنی بر حسن نیت را نشان میدهند میسر است. نشان دادن حسن نیت الزامی نیست، اما به تعامل موفق و بیدردسر با دیگران کمک میکند.
== مواجهه با سوء نیت ==
{{میانبر|وک:سوءنیت}}
حتی وقتی سوء نیت طرف مقابل آشکار است، شما نباید خودتان در واکنش [[ویکیپدیا:نزاکت|بینزاکتی]] کنید، به شخصیت طرف مقابل [[ویکیپدیا:حمله شخصی ممنوع|حمله]] کنید، یا خونسردیتان را از دست بدهید. اگر یک طرف ماجرا از اول تا آخر درست رفتار کرده باشد، دیگران راحتتر خواهند توانست اختلاف را [[ویکیپدیا:حل اختلاف|حل]] کنند یا خطاهای طرف مقابل را ببینند.
مدیران ویکیپدیا و دیگر کاربران مجرب فعال در زمینهٔ حل اختلاف از کمک کردن به شما خوشحال خواهند شد و اگر با ارائهٔ مدرک واضح و مشخص توجه ایشان را به موضوع جلب کنید، قادرند رفتار ناقض سیاستها را تشخیص دهند.
=== اتهام سوء نیت به دیگران ===
بدون ارائهٔ مدرک واضح در قالب [[راهنما:تفاوت|پیوند تفاوت]] دیگر کاربران را به سوء نیت متهم نکنید. چنین ادعایی خریدار ندارد، به هدف نمیرسد و حتی میتواند تحریککننده باشد و اختلاف را حادتر کند. تکرار اتهام سوء نیت، بدون ارائه مدرک واضح که نشان دهد اقدامات یک کاربر در واقع با سوء نیت یا [[ویکیپدیا:آزار و اذیت|اذیتوآزار]] توأم هستند، خود میتواند به [[وپ:حمله شخصی ممنوع|حمله به شخصیت فرد]] تعبیر شود. طرف مقابل هم میتواند بهراحتی شما را به سوء نیت متهم کند، که در نتیجه چرخهای زشت از اتهامات ایجاد میشود بدون اینکه اختلاف حل شود.
[[رده:رهنمودهای ویکیکتاب]]
0shufn3xdd6w1hpt25r4t7gs6amwyi5
135113
135112
2026-09-20T09:44:17Z
Vivairan2
28134
135113
wikitext
text/x-wiki
{{رهنمود}}
{{این رهنمود در یک نگاه|
* فرض را بر این بگذارید که دیگران برای بهبود ویکی کار میکنند نه برای خراب کردن آن، مگر آن که دلایل بسیار روشنی علیه این فرض وجود داشته باشد.
* زمانی که نقد میکنید، در مورد مشارکتهای کاربر دیگر نظر بدهید و نه در مورد نیتها و اغراض درونی وی.}}
{{فهرست رهنمودها}}
'''فرض حسن نیت (فحن)''' از رهنمودهای ویکیکتاب است. طبق این رهنمود، فرض بر آن است که ویرایشها و نظرهای کاربران با حسن نیت همراه است. بیشتر افراد سعی میکنند به پروژه کمک کنند، نه اینکه به آن آسیب برسانند. اگر این گزاره نادرست میبود، پروژهای چون ویکیکتاب از همان اول محکوم به شکست بود. این رهنمود ویرایشگران را ملزم نمیدارد که با وجود مدرک واضح بر سوء نیت (مثلاً [[ویکیکتاب:خرابکاری|خرابکاری]])، همچنان فرض را بر حسن نیت بگذارند. فرض حسن نیت مانع از بروز بحث و انتقاد نیست. بلکه، ویرایشگران نباید اقدامات مورد انتقاد را بدون مدرک به خباثت و غرضورزی نسبت دهند.
موقع بروز اختلاف، سعی کنید موضعتان را توضیح دهید و مشکل را حل کنید، نه اینکه بر شدت تنشها بیفزایید و به دیگران نیز این فرصت را بدهید که اینچنین رفتار کنند. در نظر بگیرید که شاید اختلاف ناشی از زوایای دید متفاوت است و دنبال راههایی برای حصول [[ویکیکتاب:اجماع|اجماع]] بگردید.
وقتی دربارهٔ حسن نیت شما تردید ابراز میشود، در صورت امکان، خود همچنان فرض کنید که طرف مقابل حسن نیت دارد. [[w:fa:ویکیپدیا:نزاکت|نزاکت]] را رعایت کنید و فرایند ویکیکتاب:تابلوی اعلانات مدیران|حل اختلاف]] را دنبال کنید، نه اینکه به کاربران [[ویکیکتاب:حمله شخصی ممنوع|حمله]] کنید و با آنها [[ویکیکتاب:جنگ ویرایشی|جنگ ویرایشی]] راه بیندازید. اگر میخواهید دربارهٔ رفتار سایر کاربران ابراز تردید کنید، با ارائهٔ پیوند تفاوت و مدارک مربوط دیگر موضعتان را مستند کنید، تا دیگران بتوانند مبنای نگرانیهایتان را درک کنند. حتی وقتی بدرفتاری ناشی از سوء نیت به نظر میرسد، اغلب بهتر است بدون اشاره به انگیزهها به رفتار بپردازید، وگرنه احتمالاً دلخوری از همهسو تشدید میشود.
مواظب باشید خیلی زیاد به این رهنمود اشاره نکنید. همانطور که میتوان بهاشتباه تشخیص داد که دیگری از روی سوء نیت عمل میکند، میتوان بهاشتباه نتیجهگیری کرد که دیگری فرض را بر سوء نیت گذاشته است؛ ترغیبهای متعدد به «فرض حسن نیت» میتوانند خود نشانهای از فرضهای منفی دربارهٔ دیگران باشند.
== دربارهٔ حسن نیت ==
[[پرونده:A_handshake.png|انگشتی|ایستاده|رعایت نزاکت و فرض حسن نیت از نقاط اتکای ویکیپدیای هستند.]]
همه اشتباه میکنند، هم اشتباهات رفتاری (مثلاً [[ویکیپدیا:حمله شخصی ممنوع|حمله به شخصیت]]) و هم محتوایی (مثلاً افزودن [[ویکیپدیا:تحقیق دستاول ممنوع|تحقیق دست اول]]). اغلب اوقات میتوانیم این اشتباهات را با یادآوریهای ساده اصلاح کنیم. با وجود این، اختلافاتی در ویکیپدیا بروز میکند که هیچ سیاست یا رهنمودی پاسخ سرراست به آنها نمیدهد. موقع بروز اختلافات، شاید نیت بد دخیل نبوده باشد. [[ویکیپدیا:هنگام مجادلهٔ ویرایشی، خونسرد بمانید|خونسردیتان]] را حفظ کنید و اگر اختلافها لاینحل به نظر میرسند (که اغلبشان اینچنین نیستند) فرایند [[ویکیپدیا:حل اختلاف|حل اختلاف]] را طی کنید.
نقض سیاستها، مثلاً [[ویکیپدیا:حساب زاپاس|زاپاسبازی]]، نقض [[ویکیکتاب:اجماع|اجماع]] و غیره، ممکن است از روی حسن نیت یا سوء نیت صورت بگیرند. برای مواجهه با همهٔ این حالتها فرایندهایی وجود دارد و اعمال [[ویکیپدیا:قطع دسترسی|جریمه]] به دلیل نقض مکرر سیاست فارغ از اینکه سوء نیت دخیل بوده است یا نه انجام خواهد گرفت.
=== حسن نیت و تازهواردان ===
{{اصلی|w:fa:ویکیپدیا:لطفاً با چماق به استقبال تازهواردها نروید}}
مهم است که نسبت به تازهواردان که با فرهنگ و مقررات ویکیپدیا ناآشنایند ولی ممکن است به مشارکتکنندگان ارزشمندی مبدل شوند صبوری کرد.
رفتار یک تازهوارد احتمالاً به نظر خودش مناسب است و بروز مشکلات معمولاً ناشی از ناآشنایی او با فرهنگ ویکیپدیا یا پیشامد سوءتفاهم است. نادر نیست که تازهواردی فکر کند که فلان سیاست باید مطابق با درک او از شرایط و نحوهٔ کار تغییر کند، مخصوصاً اگر متوجه شود که راجع به سیاست مورد نظر از قبل اختلاف نظر وجود دارد. همینطور، بسیاری از تازهواردان انتظار دارند که مشارکتهایشان در مقالات بدون سؤال پذیرفته شوند، بهویژه اگر دربارهٔ موضوع مقاله عمیقاً مطلع باشند. رفتارهای ناشی از این دست دیدگاهها، هرچند احتمالاً نادرست هستند، معمولاً غرضورزانه نیستند و نباید اینطور در نظر گرفته شوند. بسیاری از تازهواردانی که در بدو امر از رسوم ویکیپدیا درک شهودی خوبی ندارند وقتی منطق پشت این رسوم برایشان آشکارتر میشود، بهتدریج تغییر عقیده میدهند.
=== حسن نیت و حق نشر ===
{{اصلی|ویکیپدیا:حق تکثیر}}
{{میانبر|وپ:فحننشر}}
موقع مواجهه با نقضهای احتمالی حق نشر، حسن نیت به این معنی است که فرض کرد ویرایشگران قصد دارند به سیاستهای وبگاه و نیز قانون کشوری پایبند باشند. این فرق دارد با آنکه فرض کرد واقعاً به هر دو پایبند بودهاند. ویرایشگران ملزمند خود به شیوهای کنشگرانه بارگذاریهایشان را مستند کنند (ذکر منبع، ذکر پروانه و غیره) و درصورتیکه مستندسازیها اشتباه یا ناکافی باشند، پروندهها حذف خواهند شد. اقدامات اصلاحی توأم با حسن نیت شامل آگاه کردن کاربران از وجود مشکل و کمک کردن ایشان برای حل مشکلات است.
== حسن نیت چه چیزی نیست ==
{{میانبر|وپ:فحن نیست|وپ:نفحن}}
[[پرونده:David - The Death of Socrates.jpg|thumb|upright=1.2|[[سقراط]] به این معروف بود که قاطعانه فرض میکرد اطرافیانش با حسن نیت عمل میکنند.]]
بسیاری افراد درکی اشتباه از رهنمود «فرض حسن نیت» ویکیپدیا دارند و تصور میکنند که این رهنمود به این معنای «فرض انجام [[ارزیابی بایسته]] توسط ویرایشگری دیگر» یا «فرض نیت کور» در مواجهه با منابع، ویرایگران یا محتوای صفحهها است. اما منظور در اصل بیشتر به «احتمال وجود قصد خوب» نزدیک است، که به این معنا نیست که «من به منبع دسترسی ندارم، پس در مورد محتوای منبع، فرض را بر حسن نیت میگذارم» و همچنین به این معنا نیست که «یک ویرایشگر [[ویکیپدیا:شیوه ارجاع به منابع|محتوای بدون منبع را حذف کرده است]]، پس من ''با فرض حسن نیت '' اینطور در نظر میگیرم که او ارزیابی بایسته انجام داده تا مطمئن شود که [[ویکیپدیا:منابع معتبر|منابع معتبر]] برای آن محتوا در دسترس نیست.»
این رهنمود همچنین به این معنا نیست که باید شواهد واضح مبنی بر [[ویکیپدیا:ویرایش اخلالگرانه|رفتار اخلالگرانه]] یا [[ویکیپدیا:سیاستها و رهنمودها|نقض رهنمودهای ویکیپدیا]] را نادیده بگیرید و تمام ویرایشها را بدون هیچ پرسشی بپذیرید. برخی از بازیگران بد ممکن است اصرار داشته باشند که اعتماد به آنها با استناد به «فرض حسن نیت» باید تغییرناپذیر باشد، حتی اگر شواهدی بر ضد آن موجود باشد. با این حال، ویرایشگران باید توجه کنند که الگوهای ویرایشهای مخرب را نادیده نگیرند، و همچنین نباید از تلاشهای آشکار برای فریب، [[ویکیپدیا:خرابکاری|خرابکاری]] یا پیشبرد یک [[ویکیپدیا:دیدگاه بیطرف|دستور کار مغرضانه]] چشمپوشی کنند. در عوض، رهنمود «فرض حسن نیت» ویرایشگران را تشویق میکند که قدم نخست را با این باور بردارند که دیگران در تلاش برای بهبود ویکیپدیا هستند. هنگامی که با یک ویرایش مشکلدار روبرو میشوید، مهم است که آن را بررسی و به آن رسیدگی کنید، اما هنگام انجام این کار این موضوع را در نظر داشته باشید که اشتباهاتی هم ممکن است رخ دهند و هر خطایی با نیت بدخواهانه انجام نمیشود. کاربرد فرض حسن نیت در حفظ یک محیط ویرایش مشارکتی و محترمانه است.
== نشان دادن حسن نیت ==
{{میانبر|وک:نحن}}
علاوه بر فرض حسن نیت، با نشان دادن حسن نیت خودتان، دیگران را به صورت عملی به فرض حسن نیت ترغیب کنید. این کار به واسطهٔ بیان [[ویکیپدیا:صداقت|صادقانهٔ]] انگیزههایتان و انجام ویرایشهایی که تمایل شما به مصالحه، علاقهتان به بهبود ویکیپدیا، پایبندیتان به سیاستها و رهنمودهایش، اعتقادتان به صحت ویرایشهایتان، خودداریتان از [[ویکیپدیا:بازی با سامانه|به بازی گرفتن سامانه]] و دیگر رفتارهای مبتنی بر حسن نیت را نشان میدهند میسر است. نشان دادن حسن نیت الزامی نیست، اما به تعامل موفق و بیدردسر با دیگران کمک میکند.
== مواجهه با سوء نیت ==
{{میانبر|وک:سوءنیت}}
حتی وقتی سوء نیت طرف مقابل آشکار است، شما نباید خودتان در واکنش [[ویکیپدیا:نزاکت|بینزاکتی]] کنید، به شخصیت طرف مقابل [[ویکیپدیا:حمله شخصی ممنوع|حمله]] کنید، یا خونسردیتان را از دست بدهید. اگر یک طرف ماجرا از اول تا آخر درست رفتار کرده باشد، دیگران راحتتر خواهند توانست اختلاف را [[ویکیپدیا:حل اختلاف|حل]] کنند یا خطاهای طرف مقابل را ببینند.
مدیران ویکیپدیا و دیگر کاربران مجرب فعال در زمینهٔ حل اختلاف از کمک کردن به شما خوشحال خواهند شد و اگر با ارائهٔ مدرک واضح و مشخص توجه ایشان را به موضوع جلب کنید، قادرند رفتار ناقض سیاستها را تشخیص دهند.
=== اتهام سوء نیت به دیگران ===
بدون ارائهٔ مدرک واضح در قالب [[راهنما:تفاوت|پیوند تفاوت]] دیگر کاربران را به سوء نیت متهم نکنید. چنین ادعایی خریدار ندارد، به هدف نمیرسد و حتی میتواند تحریککننده باشد و اختلاف را حادتر کند. تکرار اتهام سوء نیت، بدون ارائه مدرک واضح که نشان دهد اقدامات یک کاربر در واقع با سوء نیت یا [[ویکیپدیا:آزار و اذیت|اذیتوآزار]] توأم هستند، خود میتواند به [[وپ:حمله شخصی ممنوع|حمله به شخصیت فرد]] تعبیر شود. طرف مقابل هم میتواند بهراحتی شما را به سوء نیت متهم کند، که در نتیجه چرخهای زشت از اتهامات ایجاد میشود بدون اینکه اختلاف حل شود.
[[رده:رهنمودهای ویکیکتاب]]
elvaux8itx7oqw3da6nl3m712fkpwq0
135114
135113
2026-09-20T09:45:45Z
Vivairan2
28134
/* حسن نیت و حق نشر */
135114
wikitext
text/x-wiki
{{رهنمود}}
{{این رهنمود در یک نگاه|
* فرض را بر این بگذارید که دیگران برای بهبود ویکی کار میکنند نه برای خراب کردن آن، مگر آن که دلایل بسیار روشنی علیه این فرض وجود داشته باشد.
* زمانی که نقد میکنید، در مورد مشارکتهای کاربر دیگر نظر بدهید و نه در مورد نیتها و اغراض درونی وی.}}
{{فهرست رهنمودها}}
'''فرض حسن نیت (فحن)''' از رهنمودهای ویکیکتاب است. طبق این رهنمود، فرض بر آن است که ویرایشها و نظرهای کاربران با حسن نیت همراه است. بیشتر افراد سعی میکنند به پروژه کمک کنند، نه اینکه به آن آسیب برسانند. اگر این گزاره نادرست میبود، پروژهای چون ویکیکتاب از همان اول محکوم به شکست بود. این رهنمود ویرایشگران را ملزم نمیدارد که با وجود مدرک واضح بر سوء نیت (مثلاً [[ویکیکتاب:خرابکاری|خرابکاری]])، همچنان فرض را بر حسن نیت بگذارند. فرض حسن نیت مانع از بروز بحث و انتقاد نیست. بلکه، ویرایشگران نباید اقدامات مورد انتقاد را بدون مدرک به خباثت و غرضورزی نسبت دهند.
موقع بروز اختلاف، سعی کنید موضعتان را توضیح دهید و مشکل را حل کنید، نه اینکه بر شدت تنشها بیفزایید و به دیگران نیز این فرصت را بدهید که اینچنین رفتار کنند. در نظر بگیرید که شاید اختلاف ناشی از زوایای دید متفاوت است و دنبال راههایی برای حصول [[ویکیکتاب:اجماع|اجماع]] بگردید.
وقتی دربارهٔ حسن نیت شما تردید ابراز میشود، در صورت امکان، خود همچنان فرض کنید که طرف مقابل حسن نیت دارد. [[w:fa:ویکیپدیا:نزاکت|نزاکت]] را رعایت کنید و فرایند ویکیکتاب:تابلوی اعلانات مدیران|حل اختلاف]] را دنبال کنید، نه اینکه به کاربران [[ویکیکتاب:حمله شخصی ممنوع|حمله]] کنید و با آنها [[ویکیکتاب:جنگ ویرایشی|جنگ ویرایشی]] راه بیندازید. اگر میخواهید دربارهٔ رفتار سایر کاربران ابراز تردید کنید، با ارائهٔ پیوند تفاوت و مدارک مربوط دیگر موضعتان را مستند کنید، تا دیگران بتوانند مبنای نگرانیهایتان را درک کنند. حتی وقتی بدرفتاری ناشی از سوء نیت به نظر میرسد، اغلب بهتر است بدون اشاره به انگیزهها به رفتار بپردازید، وگرنه احتمالاً دلخوری از همهسو تشدید میشود.
مواظب باشید خیلی زیاد به این رهنمود اشاره نکنید. همانطور که میتوان بهاشتباه تشخیص داد که دیگری از روی سوء نیت عمل میکند، میتوان بهاشتباه نتیجهگیری کرد که دیگری فرض را بر سوء نیت گذاشته است؛ ترغیبهای متعدد به «فرض حسن نیت» میتوانند خود نشانهای از فرضهای منفی دربارهٔ دیگران باشند.
== دربارهٔ حسن نیت ==
[[پرونده:A_handshake.png|انگشتی|ایستاده|رعایت نزاکت و فرض حسن نیت از نقاط اتکای ویکیپدیای هستند.]]
همه اشتباه میکنند، هم اشتباهات رفتاری (مثلاً [[ویکیپدیا:حمله شخصی ممنوع|حمله به شخصیت]]) و هم محتوایی (مثلاً افزودن [[ویکیپدیا:تحقیق دستاول ممنوع|تحقیق دست اول]]). اغلب اوقات میتوانیم این اشتباهات را با یادآوریهای ساده اصلاح کنیم. با وجود این، اختلافاتی در ویکیپدیا بروز میکند که هیچ سیاست یا رهنمودی پاسخ سرراست به آنها نمیدهد. موقع بروز اختلافات، شاید نیت بد دخیل نبوده باشد. [[ویکیپدیا:هنگام مجادلهٔ ویرایشی، خونسرد بمانید|خونسردیتان]] را حفظ کنید و اگر اختلافها لاینحل به نظر میرسند (که اغلبشان اینچنین نیستند) فرایند [[ویکیپدیا:حل اختلاف|حل اختلاف]] را طی کنید.
نقض سیاستها، مثلاً [[ویکیپدیا:حساب زاپاس|زاپاسبازی]]، نقض [[ویکیکتاب:اجماع|اجماع]] و غیره، ممکن است از روی حسن نیت یا سوء نیت صورت بگیرند. برای مواجهه با همهٔ این حالتها فرایندهایی وجود دارد و اعمال [[ویکیپدیا:قطع دسترسی|جریمه]] به دلیل نقض مکرر سیاست فارغ از اینکه سوء نیت دخیل بوده است یا نه انجام خواهد گرفت.
=== حسن نیت و تازهواردان ===
{{اصلی|w:fa:ویکیپدیا:لطفاً با چماق به استقبال تازهواردها نروید}}
مهم است که نسبت به تازهواردان که با فرهنگ و مقررات ویکیپدیا ناآشنایند ولی ممکن است به مشارکتکنندگان ارزشمندی مبدل شوند صبوری کرد.
رفتار یک تازهوارد احتمالاً به نظر خودش مناسب است و بروز مشکلات معمولاً ناشی از ناآشنایی او با فرهنگ ویکیپدیا یا پیشامد سوءتفاهم است. نادر نیست که تازهواردی فکر کند که فلان سیاست باید مطابق با درک او از شرایط و نحوهٔ کار تغییر کند، مخصوصاً اگر متوجه شود که راجع به سیاست مورد نظر از قبل اختلاف نظر وجود دارد. همینطور، بسیاری از تازهواردان انتظار دارند که مشارکتهایشان در مقالات بدون سؤال پذیرفته شوند، بهویژه اگر دربارهٔ موضوع مقاله عمیقاً مطلع باشند. رفتارهای ناشی از این دست دیدگاهها، هرچند احتمالاً نادرست هستند، معمولاً غرضورزانه نیستند و نباید اینطور در نظر گرفته شوند. بسیاری از تازهواردانی که در بدو امر از رسوم ویکیپدیا درک شهودی خوبی ندارند وقتی منطق پشت این رسوم برایشان آشکارتر میشود، بهتدریج تغییر عقیده میدهند.
=== حسن نیت و حق نشر ===
{{اصلی|ویکیکتاب:حق تکثیر}}
{{میانبر|وک:فحننشر}}
موقع مواجهه با نقضهای احتمالی حق نشر، حسن نیت به این معنی است که فرض کرد ویرایشگران قصد دارند به سیاستهای وبگاه و نیز قانون کشوری پایبند باشند. این فرق دارد با آنکه فرض کرد واقعاً به هر دو پایبند بودهاند. ویرایشگران ملزمند خود به شیوهای کنشگرانه بارگذاریهایشان را مستند کنند (ذکر منبع، ذکر پروانه و غیره) و درصورتیکه مستندسازیها اشتباه یا ناکافی باشند، پروندهها حذف خواهند شد. اقدامات اصلاحی توأم با حسن نیت شامل آگاه کردن کاربران از وجود مشکل و کمک کردن ایشان برای حل مشکلات است.
== حسن نیت چه چیزی نیست ==
{{میانبر|وپ:فحن نیست|وپ:نفحن}}
[[پرونده:David - The Death of Socrates.jpg|thumb|upright=1.2|[[سقراط]] به این معروف بود که قاطعانه فرض میکرد اطرافیانش با حسن نیت عمل میکنند.]]
بسیاری افراد درکی اشتباه از رهنمود «فرض حسن نیت» ویکیپدیا دارند و تصور میکنند که این رهنمود به این معنای «فرض انجام [[ارزیابی بایسته]] توسط ویرایشگری دیگر» یا «فرض نیت کور» در مواجهه با منابع، ویرایگران یا محتوای صفحهها است. اما منظور در اصل بیشتر به «احتمال وجود قصد خوب» نزدیک است، که به این معنا نیست که «من به منبع دسترسی ندارم، پس در مورد محتوای منبع، فرض را بر حسن نیت میگذارم» و همچنین به این معنا نیست که «یک ویرایشگر [[ویکیپدیا:شیوه ارجاع به منابع|محتوای بدون منبع را حذف کرده است]]، پس من ''با فرض حسن نیت '' اینطور در نظر میگیرم که او ارزیابی بایسته انجام داده تا مطمئن شود که [[ویکیپدیا:منابع معتبر|منابع معتبر]] برای آن محتوا در دسترس نیست.»
این رهنمود همچنین به این معنا نیست که باید شواهد واضح مبنی بر [[ویکیپدیا:ویرایش اخلالگرانه|رفتار اخلالگرانه]] یا [[ویکیپدیا:سیاستها و رهنمودها|نقض رهنمودهای ویکیپدیا]] را نادیده بگیرید و تمام ویرایشها را بدون هیچ پرسشی بپذیرید. برخی از بازیگران بد ممکن است اصرار داشته باشند که اعتماد به آنها با استناد به «فرض حسن نیت» باید تغییرناپذیر باشد، حتی اگر شواهدی بر ضد آن موجود باشد. با این حال، ویرایشگران باید توجه کنند که الگوهای ویرایشهای مخرب را نادیده نگیرند، و همچنین نباید از تلاشهای آشکار برای فریب، [[ویکیپدیا:خرابکاری|خرابکاری]] یا پیشبرد یک [[ویکیپدیا:دیدگاه بیطرف|دستور کار مغرضانه]] چشمپوشی کنند. در عوض، رهنمود «فرض حسن نیت» ویرایشگران را تشویق میکند که قدم نخست را با این باور بردارند که دیگران در تلاش برای بهبود ویکیپدیا هستند. هنگامی که با یک ویرایش مشکلدار روبرو میشوید، مهم است که آن را بررسی و به آن رسیدگی کنید، اما هنگام انجام این کار این موضوع را در نظر داشته باشید که اشتباهاتی هم ممکن است رخ دهند و هر خطایی با نیت بدخواهانه انجام نمیشود. کاربرد فرض حسن نیت در حفظ یک محیط ویرایش مشارکتی و محترمانه است.
== نشان دادن حسن نیت ==
{{میانبر|وک:نحن}}
علاوه بر فرض حسن نیت، با نشان دادن حسن نیت خودتان، دیگران را به صورت عملی به فرض حسن نیت ترغیب کنید. این کار به واسطهٔ بیان [[ویکیپدیا:صداقت|صادقانهٔ]] انگیزههایتان و انجام ویرایشهایی که تمایل شما به مصالحه، علاقهتان به بهبود ویکیپدیا، پایبندیتان به سیاستها و رهنمودهایش، اعتقادتان به صحت ویرایشهایتان، خودداریتان از [[ویکیپدیا:بازی با سامانه|به بازی گرفتن سامانه]] و دیگر رفتارهای مبتنی بر حسن نیت را نشان میدهند میسر است. نشان دادن حسن نیت الزامی نیست، اما به تعامل موفق و بیدردسر با دیگران کمک میکند.
== مواجهه با سوء نیت ==
{{میانبر|وک:سوءنیت}}
حتی وقتی سوء نیت طرف مقابل آشکار است، شما نباید خودتان در واکنش [[ویکیپدیا:نزاکت|بینزاکتی]] کنید، به شخصیت طرف مقابل [[ویکیپدیا:حمله شخصی ممنوع|حمله]] کنید، یا خونسردیتان را از دست بدهید. اگر یک طرف ماجرا از اول تا آخر درست رفتار کرده باشد، دیگران راحتتر خواهند توانست اختلاف را [[ویکیپدیا:حل اختلاف|حل]] کنند یا خطاهای طرف مقابل را ببینند.
مدیران ویکیپدیا و دیگر کاربران مجرب فعال در زمینهٔ حل اختلاف از کمک کردن به شما خوشحال خواهند شد و اگر با ارائهٔ مدرک واضح و مشخص توجه ایشان را به موضوع جلب کنید، قادرند رفتار ناقض سیاستها را تشخیص دهند.
=== اتهام سوء نیت به دیگران ===
بدون ارائهٔ مدرک واضح در قالب [[راهنما:تفاوت|پیوند تفاوت]] دیگر کاربران را به سوء نیت متهم نکنید. چنین ادعایی خریدار ندارد، به هدف نمیرسد و حتی میتواند تحریککننده باشد و اختلاف را حادتر کند. تکرار اتهام سوء نیت، بدون ارائه مدرک واضح که نشان دهد اقدامات یک کاربر در واقع با سوء نیت یا [[ویکیپدیا:آزار و اذیت|اذیتوآزار]] توأم هستند، خود میتواند به [[وپ:حمله شخصی ممنوع|حمله به شخصیت فرد]] تعبیر شود. طرف مقابل هم میتواند بهراحتی شما را به سوء نیت متهم کند، که در نتیجه چرخهای زشت از اتهامات ایجاد میشود بدون اینکه اختلاف حل شود.
[[رده:رهنمودهای ویکیکتاب]]
7zu8a4uz27rdz0wdlf9ubiik3gqn3ij
135115
135114
2026-09-20T09:46:56Z
Vivairan2
28134
/* حسن نیت چه چیزی نیست */
135115
wikitext
text/x-wiki
{{رهنمود}}
{{این رهنمود در یک نگاه|
* فرض را بر این بگذارید که دیگران برای بهبود ویکی کار میکنند نه برای خراب کردن آن، مگر آن که دلایل بسیار روشنی علیه این فرض وجود داشته باشد.
* زمانی که نقد میکنید، در مورد مشارکتهای کاربر دیگر نظر بدهید و نه در مورد نیتها و اغراض درونی وی.}}
{{فهرست رهنمودها}}
'''فرض حسن نیت (فحن)''' از رهنمودهای ویکیکتاب است. طبق این رهنمود، فرض بر آن است که ویرایشها و نظرهای کاربران با حسن نیت همراه است. بیشتر افراد سعی میکنند به پروژه کمک کنند، نه اینکه به آن آسیب برسانند. اگر این گزاره نادرست میبود، پروژهای چون ویکیکتاب از همان اول محکوم به شکست بود. این رهنمود ویرایشگران را ملزم نمیدارد که با وجود مدرک واضح بر سوء نیت (مثلاً [[ویکیکتاب:خرابکاری|خرابکاری]])، همچنان فرض را بر حسن نیت بگذارند. فرض حسن نیت مانع از بروز بحث و انتقاد نیست. بلکه، ویرایشگران نباید اقدامات مورد انتقاد را بدون مدرک به خباثت و غرضورزی نسبت دهند.
موقع بروز اختلاف، سعی کنید موضعتان را توضیح دهید و مشکل را حل کنید، نه اینکه بر شدت تنشها بیفزایید و به دیگران نیز این فرصت را بدهید که اینچنین رفتار کنند. در نظر بگیرید که شاید اختلاف ناشی از زوایای دید متفاوت است و دنبال راههایی برای حصول [[ویکیکتاب:اجماع|اجماع]] بگردید.
وقتی دربارهٔ حسن نیت شما تردید ابراز میشود، در صورت امکان، خود همچنان فرض کنید که طرف مقابل حسن نیت دارد. [[w:fa:ویکیپدیا:نزاکت|نزاکت]] را رعایت کنید و فرایند ویکیکتاب:تابلوی اعلانات مدیران|حل اختلاف]] را دنبال کنید، نه اینکه به کاربران [[ویکیکتاب:حمله شخصی ممنوع|حمله]] کنید و با آنها [[ویکیکتاب:جنگ ویرایشی|جنگ ویرایشی]] راه بیندازید. اگر میخواهید دربارهٔ رفتار سایر کاربران ابراز تردید کنید، با ارائهٔ پیوند تفاوت و مدارک مربوط دیگر موضعتان را مستند کنید، تا دیگران بتوانند مبنای نگرانیهایتان را درک کنند. حتی وقتی بدرفتاری ناشی از سوء نیت به نظر میرسد، اغلب بهتر است بدون اشاره به انگیزهها به رفتار بپردازید، وگرنه احتمالاً دلخوری از همهسو تشدید میشود.
مواظب باشید خیلی زیاد به این رهنمود اشاره نکنید. همانطور که میتوان بهاشتباه تشخیص داد که دیگری از روی سوء نیت عمل میکند، میتوان بهاشتباه نتیجهگیری کرد که دیگری فرض را بر سوء نیت گذاشته است؛ ترغیبهای متعدد به «فرض حسن نیت» میتوانند خود نشانهای از فرضهای منفی دربارهٔ دیگران باشند.
== دربارهٔ حسن نیت ==
[[پرونده:A_handshake.png|انگشتی|ایستاده|رعایت نزاکت و فرض حسن نیت از نقاط اتکای ویکیپدیای هستند.]]
همه اشتباه میکنند، هم اشتباهات رفتاری (مثلاً [[ویکیپدیا:حمله شخصی ممنوع|حمله به شخصیت]]) و هم محتوایی (مثلاً افزودن [[ویکیپدیا:تحقیق دستاول ممنوع|تحقیق دست اول]]). اغلب اوقات میتوانیم این اشتباهات را با یادآوریهای ساده اصلاح کنیم. با وجود این، اختلافاتی در ویکیپدیا بروز میکند که هیچ سیاست یا رهنمودی پاسخ سرراست به آنها نمیدهد. موقع بروز اختلافات، شاید نیت بد دخیل نبوده باشد. [[ویکیپدیا:هنگام مجادلهٔ ویرایشی، خونسرد بمانید|خونسردیتان]] را حفظ کنید و اگر اختلافها لاینحل به نظر میرسند (که اغلبشان اینچنین نیستند) فرایند [[ویکیپدیا:حل اختلاف|حل اختلاف]] را طی کنید.
نقض سیاستها، مثلاً [[ویکیپدیا:حساب زاپاس|زاپاسبازی]]، نقض [[ویکیکتاب:اجماع|اجماع]] و غیره، ممکن است از روی حسن نیت یا سوء نیت صورت بگیرند. برای مواجهه با همهٔ این حالتها فرایندهایی وجود دارد و اعمال [[ویکیپدیا:قطع دسترسی|جریمه]] به دلیل نقض مکرر سیاست فارغ از اینکه سوء نیت دخیل بوده است یا نه انجام خواهد گرفت.
=== حسن نیت و تازهواردان ===
{{اصلی|w:fa:ویکیپدیا:لطفاً با چماق به استقبال تازهواردها نروید}}
مهم است که نسبت به تازهواردان که با فرهنگ و مقررات ویکیپدیا ناآشنایند ولی ممکن است به مشارکتکنندگان ارزشمندی مبدل شوند صبوری کرد.
رفتار یک تازهوارد احتمالاً به نظر خودش مناسب است و بروز مشکلات معمولاً ناشی از ناآشنایی او با فرهنگ ویکیپدیا یا پیشامد سوءتفاهم است. نادر نیست که تازهواردی فکر کند که فلان سیاست باید مطابق با درک او از شرایط و نحوهٔ کار تغییر کند، مخصوصاً اگر متوجه شود که راجع به سیاست مورد نظر از قبل اختلاف نظر وجود دارد. همینطور، بسیاری از تازهواردان انتظار دارند که مشارکتهایشان در مقالات بدون سؤال پذیرفته شوند، بهویژه اگر دربارهٔ موضوع مقاله عمیقاً مطلع باشند. رفتارهای ناشی از این دست دیدگاهها، هرچند احتمالاً نادرست هستند، معمولاً غرضورزانه نیستند و نباید اینطور در نظر گرفته شوند. بسیاری از تازهواردانی که در بدو امر از رسوم ویکیپدیا درک شهودی خوبی ندارند وقتی منطق پشت این رسوم برایشان آشکارتر میشود، بهتدریج تغییر عقیده میدهند.
=== حسن نیت و حق نشر ===
{{اصلی|ویکیکتاب:حق تکثیر}}
{{میانبر|وک:فحننشر}}
موقع مواجهه با نقضهای احتمالی حق نشر، حسن نیت به این معنی است که فرض کرد ویرایشگران قصد دارند به سیاستهای وبگاه و نیز قانون کشوری پایبند باشند. این فرق دارد با آنکه فرض کرد واقعاً به هر دو پایبند بودهاند. ویرایشگران ملزمند خود به شیوهای کنشگرانه بارگذاریهایشان را مستند کنند (ذکر منبع، ذکر پروانه و غیره) و درصورتیکه مستندسازیها اشتباه یا ناکافی باشند، پروندهها حذف خواهند شد. اقدامات اصلاحی توأم با حسن نیت شامل آگاه کردن کاربران از وجود مشکل و کمک کردن ایشان برای حل مشکلات است.
== حسن نیت چه چیزی نیست ==
{{میانبر|وپ:فحن نیست|وپ:نفحن}}
[[پرونده:David - The Death of Socrates.jpg|thumb|upright=1.2|سقراط به این معروف بود که قاطعانه فرض میکرد اطرافیانش با حسن نیت عمل میکنند.]]
بسیاری افراد درکی اشتباه از رهنمود «فرض حسن نیت» ویکیپدیا دارند و تصور میکنند که این رهنمود به این معنای «فرض انجام [[w:fa:ارزیابی بایسته|ارزیابی بایسته]] توسط ویرایشگری دیگر» یا «فرض نیت کور» در مواجهه با منابع، ویرایگران یا محتوای صفحهها است. اما منظور در اصل بیشتر به «احتمال وجود قصد خوب» نزدیک است، که به این معنا نیست که «من به منبع دسترسی ندارم، پس در مورد محتوای منبع، فرض را بر حسن نیت میگذارم» و همچنین به این معنا نیست که «یک ویرایشگر [[ویکیپدیا:شیوه ارجاع به منابع|محتوای بدون منبع را حذف کرده است]]، پس من ''با فرض حسن نیت '' اینطور در نظر میگیرم که او ارزیابی بایسته انجام داده تا مطمئن شود که [[ویکیپدیا:منابع معتبر|منابع معتبر]] برای آن محتوا در دسترس نیست.»
این رهنمود همچنین به این معنا نیست که باید شواهد واضح مبنی بر [[ویکیپدیا:ویرایش اخلالگرانه|رفتار اخلالگرانه]] یا [[ویکیپدیا:سیاستها و رهنمودها|نقض رهنمودهای ویکیپدیا]] را نادیده بگیرید و تمام ویرایشها را بدون هیچ پرسشی بپذیرید. برخی از بازیگران بد ممکن است اصرار داشته باشند که اعتماد به آنها با استناد به «فرض حسن نیت» باید تغییرناپذیر باشد، حتی اگر شواهدی بر ضد آن موجود باشد. با این حال، ویرایشگران باید توجه کنند که الگوهای ویرایشهای مخرب را نادیده نگیرند، و همچنین نباید از تلاشهای آشکار برای فریب، [[ویکیپدیا:خرابکاری|خرابکاری]] یا پیشبرد یک [[ویکیپدیا:دیدگاه بیطرف|دستور کار مغرضانه]] چشمپوشی کنند. در عوض، رهنمود «فرض حسن نیت» ویرایشگران را تشویق میکند که قدم نخست را با این باور بردارند که دیگران در تلاش برای بهبود ویکیپدیا هستند. هنگامی که با یک ویرایش مشکلدار روبرو میشوید، مهم است که آن را بررسی و به آن رسیدگی کنید، اما هنگام انجام این کار این موضوع را در نظر داشته باشید که اشتباهاتی هم ممکن است رخ دهند و هر خطایی با نیت بدخواهانه انجام نمیشود. کاربرد فرض حسن نیت در حفظ یک محیط ویرایش مشارکتی و محترمانه است.
== نشان دادن حسن نیت ==
{{میانبر|وک:نحن}}
علاوه بر فرض حسن نیت، با نشان دادن حسن نیت خودتان، دیگران را به صورت عملی به فرض حسن نیت ترغیب کنید. این کار به واسطهٔ بیان [[ویکیپدیا:صداقت|صادقانهٔ]] انگیزههایتان و انجام ویرایشهایی که تمایل شما به مصالحه، علاقهتان به بهبود ویکیپدیا، پایبندیتان به سیاستها و رهنمودهایش، اعتقادتان به صحت ویرایشهایتان، خودداریتان از [[ویکیپدیا:بازی با سامانه|به بازی گرفتن سامانه]] و دیگر رفتارهای مبتنی بر حسن نیت را نشان میدهند میسر است. نشان دادن حسن نیت الزامی نیست، اما به تعامل موفق و بیدردسر با دیگران کمک میکند.
== مواجهه با سوء نیت ==
{{میانبر|وک:سوءنیت}}
حتی وقتی سوء نیت طرف مقابل آشکار است، شما نباید خودتان در واکنش [[ویکیپدیا:نزاکت|بینزاکتی]] کنید، به شخصیت طرف مقابل [[ویکیپدیا:حمله شخصی ممنوع|حمله]] کنید، یا خونسردیتان را از دست بدهید. اگر یک طرف ماجرا از اول تا آخر درست رفتار کرده باشد، دیگران راحتتر خواهند توانست اختلاف را [[ویکیپدیا:حل اختلاف|حل]] کنند یا خطاهای طرف مقابل را ببینند.
مدیران ویکیپدیا و دیگر کاربران مجرب فعال در زمینهٔ حل اختلاف از کمک کردن به شما خوشحال خواهند شد و اگر با ارائهٔ مدرک واضح و مشخص توجه ایشان را به موضوع جلب کنید، قادرند رفتار ناقض سیاستها را تشخیص دهند.
=== اتهام سوء نیت به دیگران ===
بدون ارائهٔ مدرک واضح در قالب [[راهنما:تفاوت|پیوند تفاوت]] دیگر کاربران را به سوء نیت متهم نکنید. چنین ادعایی خریدار ندارد، به هدف نمیرسد و حتی میتواند تحریککننده باشد و اختلاف را حادتر کند. تکرار اتهام سوء نیت، بدون ارائه مدرک واضح که نشان دهد اقدامات یک کاربر در واقع با سوء نیت یا [[ویکیپدیا:آزار و اذیت|اذیتوآزار]] توأم هستند، خود میتواند به [[وپ:حمله شخصی ممنوع|حمله به شخصیت فرد]] تعبیر شود. طرف مقابل هم میتواند بهراحتی شما را به سوء نیت متهم کند، که در نتیجه چرخهای زشت از اتهامات ایجاد میشود بدون اینکه اختلاف حل شود.
[[رده:رهنمودهای ویکیکتاب]]
l1n4a1ou9n1fmjg4wazj6cuq3iiswum
135116
135115
2026-09-20T09:50:09Z
Vivairan2
28134
/* مواجهه با سوء نیت */
135116
wikitext
text/x-wiki
{{رهنمود}}
{{این رهنمود در یک نگاه|
* فرض را بر این بگذارید که دیگران برای بهبود ویکی کار میکنند نه برای خراب کردن آن، مگر آن که دلایل بسیار روشنی علیه این فرض وجود داشته باشد.
* زمانی که نقد میکنید، در مورد مشارکتهای کاربر دیگر نظر بدهید و نه در مورد نیتها و اغراض درونی وی.}}
{{فهرست رهنمودها}}
'''فرض حسن نیت (فحن)''' از رهنمودهای ویکیکتاب است. طبق این رهنمود، فرض بر آن است که ویرایشها و نظرهای کاربران با حسن نیت همراه است. بیشتر افراد سعی میکنند به پروژه کمک کنند، نه اینکه به آن آسیب برسانند. اگر این گزاره نادرست میبود، پروژهای چون ویکیکتاب از همان اول محکوم به شکست بود. این رهنمود ویرایشگران را ملزم نمیدارد که با وجود مدرک واضح بر سوء نیت (مثلاً [[ویکیکتاب:خرابکاری|خرابکاری]])، همچنان فرض را بر حسن نیت بگذارند. فرض حسن نیت مانع از بروز بحث و انتقاد نیست. بلکه، ویرایشگران نباید اقدامات مورد انتقاد را بدون مدرک به خباثت و غرضورزی نسبت دهند.
موقع بروز اختلاف، سعی کنید موضعتان را توضیح دهید و مشکل را حل کنید، نه اینکه بر شدت تنشها بیفزایید و به دیگران نیز این فرصت را بدهید که اینچنین رفتار کنند. در نظر بگیرید که شاید اختلاف ناشی از زوایای دید متفاوت است و دنبال راههایی برای حصول [[ویکیکتاب:اجماع|اجماع]] بگردید.
وقتی دربارهٔ حسن نیت شما تردید ابراز میشود، در صورت امکان، خود همچنان فرض کنید که طرف مقابل حسن نیت دارد. [[w:fa:ویکیپدیا:نزاکت|نزاکت]] را رعایت کنید و فرایند ویکیکتاب:تابلوی اعلانات مدیران|حل اختلاف]] را دنبال کنید، نه اینکه به کاربران [[ویکیکتاب:حمله شخصی ممنوع|حمله]] کنید و با آنها [[ویکیکتاب:جنگ ویرایشی|جنگ ویرایشی]] راه بیندازید. اگر میخواهید دربارهٔ رفتار سایر کاربران ابراز تردید کنید، با ارائهٔ پیوند تفاوت و مدارک مربوط دیگر موضعتان را مستند کنید، تا دیگران بتوانند مبنای نگرانیهایتان را درک کنند. حتی وقتی بدرفتاری ناشی از سوء نیت به نظر میرسد، اغلب بهتر است بدون اشاره به انگیزهها به رفتار بپردازید، وگرنه احتمالاً دلخوری از همهسو تشدید میشود.
مواظب باشید خیلی زیاد به این رهنمود اشاره نکنید. همانطور که میتوان بهاشتباه تشخیص داد که دیگری از روی سوء نیت عمل میکند، میتوان بهاشتباه نتیجهگیری کرد که دیگری فرض را بر سوء نیت گذاشته است؛ ترغیبهای متعدد به «فرض حسن نیت» میتوانند خود نشانهای از فرضهای منفی دربارهٔ دیگران باشند.
== دربارهٔ حسن نیت ==
[[پرونده:A_handshake.png|انگشتی|ایستاده|رعایت نزاکت و فرض حسن نیت از نقاط اتکای ویکیپدیای هستند.]]
همه اشتباه میکنند، هم اشتباهات رفتاری (مثلاً [[ویکیپدیا:حمله شخصی ممنوع|حمله به شخصیت]]) و هم محتوایی (مثلاً افزودن [[ویکیپدیا:تحقیق دستاول ممنوع|تحقیق دست اول]]). اغلب اوقات میتوانیم این اشتباهات را با یادآوریهای ساده اصلاح کنیم. با وجود این، اختلافاتی در ویکیپدیا بروز میکند که هیچ سیاست یا رهنمودی پاسخ سرراست به آنها نمیدهد. موقع بروز اختلافات، شاید نیت بد دخیل نبوده باشد. [[ویکیپدیا:هنگام مجادلهٔ ویرایشی، خونسرد بمانید|خونسردیتان]] را حفظ کنید و اگر اختلافها لاینحل به نظر میرسند (که اغلبشان اینچنین نیستند) فرایند [[ویکیپدیا:حل اختلاف|حل اختلاف]] را طی کنید.
نقض سیاستها، مثلاً [[ویکیپدیا:حساب زاپاس|زاپاسبازی]]، نقض [[ویکیکتاب:اجماع|اجماع]] و غیره، ممکن است از روی حسن نیت یا سوء نیت صورت بگیرند. برای مواجهه با همهٔ این حالتها فرایندهایی وجود دارد و اعمال [[ویکیپدیا:قطع دسترسی|جریمه]] به دلیل نقض مکرر سیاست فارغ از اینکه سوء نیت دخیل بوده است یا نه انجام خواهد گرفت.
=== حسن نیت و تازهواردان ===
{{اصلی|w:fa:ویکیپدیا:لطفاً با چماق به استقبال تازهواردها نروید}}
مهم است که نسبت به تازهواردان که با فرهنگ و مقررات ویکیپدیا ناآشنایند ولی ممکن است به مشارکتکنندگان ارزشمندی مبدل شوند صبوری کرد.
رفتار یک تازهوارد احتمالاً به نظر خودش مناسب است و بروز مشکلات معمولاً ناشی از ناآشنایی او با فرهنگ ویکیپدیا یا پیشامد سوءتفاهم است. نادر نیست که تازهواردی فکر کند که فلان سیاست باید مطابق با درک او از شرایط و نحوهٔ کار تغییر کند، مخصوصاً اگر متوجه شود که راجع به سیاست مورد نظر از قبل اختلاف نظر وجود دارد. همینطور، بسیاری از تازهواردان انتظار دارند که مشارکتهایشان در مقالات بدون سؤال پذیرفته شوند، بهویژه اگر دربارهٔ موضوع مقاله عمیقاً مطلع باشند. رفتارهای ناشی از این دست دیدگاهها، هرچند احتمالاً نادرست هستند، معمولاً غرضورزانه نیستند و نباید اینطور در نظر گرفته شوند. بسیاری از تازهواردانی که در بدو امر از رسوم ویکیپدیا درک شهودی خوبی ندارند وقتی منطق پشت این رسوم برایشان آشکارتر میشود، بهتدریج تغییر عقیده میدهند.
=== حسن نیت و حق نشر ===
{{اصلی|ویکیکتاب:حق تکثیر}}
{{میانبر|وک:فحننشر}}
موقع مواجهه با نقضهای احتمالی حق نشر، حسن نیت به این معنی است که فرض کرد ویرایشگران قصد دارند به سیاستهای وبگاه و نیز قانون کشوری پایبند باشند. این فرق دارد با آنکه فرض کرد واقعاً به هر دو پایبند بودهاند. ویرایشگران ملزمند خود به شیوهای کنشگرانه بارگذاریهایشان را مستند کنند (ذکر منبع، ذکر پروانه و غیره) و درصورتیکه مستندسازیها اشتباه یا ناکافی باشند، پروندهها حذف خواهند شد. اقدامات اصلاحی توأم با حسن نیت شامل آگاه کردن کاربران از وجود مشکل و کمک کردن ایشان برای حل مشکلات است.
== حسن نیت چه چیزی نیست ==
{{میانبر|وپ:فحن نیست|وپ:نفحن}}
[[پرونده:David - The Death of Socrates.jpg|thumb|upright=1.2|سقراط به این معروف بود که قاطعانه فرض میکرد اطرافیانش با حسن نیت عمل میکنند.]]
بسیاری افراد درکی اشتباه از رهنمود «فرض حسن نیت» ویکیپدیا دارند و تصور میکنند که این رهنمود به این معنای «فرض انجام [[w:fa:ارزیابی بایسته|ارزیابی بایسته]] توسط ویرایشگری دیگر» یا «فرض نیت کور» در مواجهه با منابع، ویرایگران یا محتوای صفحهها است. اما منظور در اصل بیشتر به «احتمال وجود قصد خوب» نزدیک است، که به این معنا نیست که «من به منبع دسترسی ندارم، پس در مورد محتوای منبع، فرض را بر حسن نیت میگذارم» و همچنین به این معنا نیست که «یک ویرایشگر [[ویکیپدیا:شیوه ارجاع به منابع|محتوای بدون منبع را حذف کرده است]]، پس من ''با فرض حسن نیت '' اینطور در نظر میگیرم که او ارزیابی بایسته انجام داده تا مطمئن شود که [[ویکیپدیا:منابع معتبر|منابع معتبر]] برای آن محتوا در دسترس نیست.»
این رهنمود همچنین به این معنا نیست که باید شواهد واضح مبنی بر [[ویکیپدیا:ویرایش اخلالگرانه|رفتار اخلالگرانه]] یا [[ویکیپدیا:سیاستها و رهنمودها|نقض رهنمودهای ویکیپدیا]] را نادیده بگیرید و تمام ویرایشها را بدون هیچ پرسشی بپذیرید. برخی از بازیگران بد ممکن است اصرار داشته باشند که اعتماد به آنها با استناد به «فرض حسن نیت» باید تغییرناپذیر باشد، حتی اگر شواهدی بر ضد آن موجود باشد. با این حال، ویرایشگران باید توجه کنند که الگوهای ویرایشهای مخرب را نادیده نگیرند، و همچنین نباید از تلاشهای آشکار برای فریب، [[ویکیپدیا:خرابکاری|خرابکاری]] یا پیشبرد یک [[ویکیپدیا:دیدگاه بیطرف|دستور کار مغرضانه]] چشمپوشی کنند. در عوض، رهنمود «فرض حسن نیت» ویرایشگران را تشویق میکند که قدم نخست را با این باور بردارند که دیگران در تلاش برای بهبود ویکیپدیا هستند. هنگامی که با یک ویرایش مشکلدار روبرو میشوید، مهم است که آن را بررسی و به آن رسیدگی کنید، اما هنگام انجام این کار این موضوع را در نظر داشته باشید که اشتباهاتی هم ممکن است رخ دهند و هر خطایی با نیت بدخواهانه انجام نمیشود. کاربرد فرض حسن نیت در حفظ یک محیط ویرایش مشارکتی و محترمانه است.
== نشان دادن حسن نیت ==
{{میانبر|وک:نحن}}
علاوه بر فرض حسن نیت، با نشان دادن حسن نیت خودتان، دیگران را به صورت عملی به فرض حسن نیت ترغیب کنید. این کار به واسطهٔ بیان [[ویکیپدیا:صداقت|صادقانهٔ]] انگیزههایتان و انجام ویرایشهایی که تمایل شما به مصالحه، علاقهتان به بهبود ویکیپدیا، پایبندیتان به سیاستها و رهنمودهایش، اعتقادتان به صحت ویرایشهایتان، خودداریتان از [[ویکیپدیا:بازی با سامانه|به بازی گرفتن سامانه]] و دیگر رفتارهای مبتنی بر حسن نیت را نشان میدهند میسر است. نشان دادن حسن نیت الزامی نیست، اما به تعامل موفق و بیدردسر با دیگران کمک میکند.
== مواجهه با سوء نیت ==
{{میانبر|وک:سوءنیت}}
حتی وقتی سوء نیت طرف مقابل آشکار است، شما نباید خودتان در واکنش [[w:fa:ویکیپدیا:نزاکت|بینزاکتی]] کنید، به شخصیت طرف مقابل [[ویکیکتاب:حمله شخصی ممنوع|حمله]] کنید، یا خونسردیتان را از دست بدهید. اگر یک طرف ماجرا از اول تا آخر درست رفتار کرده باشد، دیگران راحتتر خواهند توانست اختلاف را [[ویکیکتاب:تابلوی اعلانات مدیران|حل]] کنند یا خطاهای طرف مقابل را ببینند.
مدیران ویکیپدیا و دیگر کاربران مجرب فعال در زمینهٔ حل اختلاف از کمک کردن به شما خوشحال خواهند شد و اگر با ارائهٔ مدرک واضح و مشخص توجه ایشان را به موضوع جلب کنید، قادرند رفتار ناقض سیاستها را تشخیص دهند.
=== اتهام سوء نیت به دیگران ===
بدون ارائهٔ مدرک واضح در قالب پیوند تفاوت دیگر کاربران را به سوء نیت متهم نکنید. چنین ادعایی خریدار ندارد، به هدف نمیرسد و حتی میتواند تحریککننده باشد و اختلاف را حادتر کند. تکرار اتهام سوء نیت، بدون ارائه مدرک واضح که نشان دهد اقدامات یک کاربر در واقع با سوء نیت یا [[ویکیکتاب:آزار و اذیت|اذیتوآزار]] توأم هستند، خود میتواند به [[وک:حمله شخصی ممنوع|حمله به شخصیت فرد]] تعبیر شود. طرف مقابل هم میتواند بهراحتی شما را به سوء نیت متهم کند، که در نتیجه چرخهای زشت از اتهامات ایجاد میشود بدون اینکه اختلاف حل شود.
[[رده:رهنمودهای ویکیکتاب]]
celm2wtjpf6v1vxqf2wv5h05j538vdg
135119
135116
2026-09-20T10:02:17Z
Vivairan2
28134
135119
wikitext
text/x-wiki
{{رهنمود}}
{{این رهنمود در یک نگاه|
* فرض را بر این بگذارید که دیگران برای بهبود ویکی کار میکنند نه برای خراب کردن آن، مگر آن که دلایل بسیار روشنی علیه این فرض وجود داشته باشد.
* زمانی که نقد میکنید، در مورد مشارکتهای کاربر دیگر نظر بدهید و نه در مورد نیتها و اغراض درونی وی.}}
{{فهرست رهنمودها}}
'''فرض حسن نیت (فحن)''' از رهنمودهای ویکیکتاب است. طبق این رهنمود، فرض بر آن است که ویرایشها و نظرهای کاربران با حسن نیت همراه است. بیشتر افراد سعی میکنند به پروژه کمک کنند، نه اینکه به آن آسیب برسانند. اگر این گزاره نادرست میبود، پروژهای چون ویکیکتاب از همان اول محکوم به شکست بود. این رهنمود ویرایشگران را ملزم نمیدارد که با وجود مدرک واضح بر سوء نیت (مثلاً [[ویکیکتاب:خرابکاری|خرابکاری]])، همچنان فرض را بر حسن نیت بگذارند. فرض حسن نیت مانع از بروز بحث و انتقاد نیست. بلکه، ویرایشگران نباید اقدامات مورد انتقاد را بدون مدرک به خباثت و غرضورزی نسبت دهند.
موقع بروز اختلاف، سعی کنید موضعتان را توضیح دهید و مشکل را حل کنید، نه اینکه بر شدت تنشها بیفزایید و به دیگران نیز این فرصت را بدهید که اینچنین رفتار کنند. در نظر بگیرید که شاید اختلاف ناشی از زوایای دید متفاوت است و دنبال راههایی برای حصول [[ویکیکتاب:اجماع|اجماع]] بگردید.
وقتی دربارهٔ حسن نیت شما تردید ابراز میشود، در صورت امکان، خود همچنان فرض کنید که طرف مقابل حسن نیت دارد. [[w:fa:ویکیپدیا:نزاکت|نزاکت]] را رعایت کنید و فرایند [[ویکیکتاب:تابلوی اعلانات مدیران|حل اختلاف]] را دنبال کنید، نه اینکه به کاربران [[ویکیکتاب:حمله شخصی ممنوع|حمله]] کنید و با آنها [[ویکیکتاب:جنگ ویرایشی|جنگ ویرایشی]] راه بیندازید. اگر میخواهید دربارهٔ رفتار سایر کاربران ابراز تردید کنید، با ارائهٔ پیوند تفاوت و مدارک مربوط دیگر موضعتان را مستند کنید، تا دیگران بتوانند مبنای نگرانیهایتان را درک کنند. حتی وقتی بدرفتاری ناشی از سوء نیت به نظر میرسد، اغلب بهتر است بدون اشاره به انگیزهها به رفتار بپردازید، وگرنه احتمالاً دلخوری از همهسو تشدید میشود.
مواظب باشید خیلی زیاد به این رهنمود اشاره نکنید. همانطور که میتوان بهاشتباه تشخیص داد که دیگری از روی سوء نیت عمل میکند، میتوان بهاشتباه نتیجهگیری کرد که دیگری فرض را بر سوء نیت گذاشته است؛ ترغیبهای متعدد به «فرض حسن نیت» میتوانند خود نشانهای از فرضهای منفی دربارهٔ دیگران باشند.
== دربارهٔ حسن نیت ==
[[پرونده:A_handshake.png|انگشتی|ایستاده|رعایت نزاکت و فرض حسن نیت از نقاط اتکای ویکیپدیای هستند.]]
همه اشتباه میکنند، هم اشتباهات رفتاری (مثلاً [[ویکیپدیا:حمله شخصی ممنوع|حمله به شخصیت]]) و هم محتوایی (مثلاً افزودن [[ویکیپدیا:تحقیق دستاول ممنوع|تحقیق دست اول]]). اغلب اوقات میتوانیم این اشتباهات را با یادآوریهای ساده اصلاح کنیم. با وجود این، اختلافاتی در ویکیپدیا بروز میکند که هیچ سیاست یا رهنمودی پاسخ سرراست به آنها نمیدهد. موقع بروز اختلافات، شاید نیت بد دخیل نبوده باشد. [[ویکیپدیا:هنگام مجادلهٔ ویرایشی، خونسرد بمانید|خونسردیتان]] را حفظ کنید و اگر اختلافها لاینحل به نظر میرسند (که اغلبشان اینچنین نیستند) فرایند [[ویکیپدیا:حل اختلاف|حل اختلاف]] را طی کنید.
نقض سیاستها، مثلاً [[ویکیپدیا:حساب زاپاس|زاپاسبازی]]، نقض [[ویکیکتاب:اجماع|اجماع]] و غیره، ممکن است از روی حسن نیت یا سوء نیت صورت بگیرند. برای مواجهه با همهٔ این حالتها فرایندهایی وجود دارد و اعمال [[ویکیپدیا:قطع دسترسی|جریمه]] به دلیل نقض مکرر سیاست فارغ از اینکه سوء نیت دخیل بوده است یا نه انجام خواهد گرفت.
=== حسن نیت و تازهواردان ===
{{اصلی|w:fa:ویکیپدیا:لطفاً با چماق به استقبال تازهواردها نروید}}
مهم است که نسبت به تازهواردان که با فرهنگ و مقررات ویکیپدیا ناآشنایند ولی ممکن است به مشارکتکنندگان ارزشمندی مبدل شوند صبوری کرد.
رفتار یک تازهوارد احتمالاً به نظر خودش مناسب است و بروز مشکلات معمولاً ناشی از ناآشنایی او با فرهنگ ویکیپدیا یا پیشامد سوءتفاهم است. نادر نیست که تازهواردی فکر کند که فلان سیاست باید مطابق با درک او از شرایط و نحوهٔ کار تغییر کند، مخصوصاً اگر متوجه شود که راجع به سیاست مورد نظر از قبل اختلاف نظر وجود دارد. همینطور، بسیاری از تازهواردان انتظار دارند که مشارکتهایشان در مقالات بدون سؤال پذیرفته شوند، بهویژه اگر دربارهٔ موضوع مقاله عمیقاً مطلع باشند. رفتارهای ناشی از این دست دیدگاهها، هرچند احتمالاً نادرست هستند، معمولاً غرضورزانه نیستند و نباید اینطور در نظر گرفته شوند. بسیاری از تازهواردانی که در بدو امر از رسوم ویکیپدیا درک شهودی خوبی ندارند وقتی منطق پشت این رسوم برایشان آشکارتر میشود، بهتدریج تغییر عقیده میدهند.
=== حسن نیت و حق نشر ===
{{اصلی|ویکیکتاب:حق تکثیر}}
{{میانبر|وک:فحننشر}}
موقع مواجهه با نقضهای احتمالی حق نشر، حسن نیت به این معنی است که فرض کرد ویرایشگران قصد دارند به سیاستهای وبگاه و نیز قانون کشوری پایبند باشند. این فرق دارد با آنکه فرض کرد واقعاً به هر دو پایبند بودهاند. ویرایشگران ملزمند خود به شیوهای کنشگرانه بارگذاریهایشان را مستند کنند (ذکر منبع، ذکر پروانه و غیره) و درصورتیکه مستندسازیها اشتباه یا ناکافی باشند، پروندهها حذف خواهند شد. اقدامات اصلاحی توأم با حسن نیت شامل آگاه کردن کاربران از وجود مشکل و کمک کردن ایشان برای حل مشکلات است.
== حسن نیت چه چیزی نیست ==
{{میانبر|وپ:فحن نیست|وپ:نفحن}}
[[پرونده:David - The Death of Socrates.jpg|thumb|upright=1.2|سقراط به این معروف بود که قاطعانه فرض میکرد اطرافیانش با حسن نیت عمل میکنند.]]
بسیاری افراد درکی اشتباه از رهنمود «فرض حسن نیت» ویکیپدیا دارند و تصور میکنند که این رهنمود به این معنای «فرض انجام [[w:fa:ارزیابی بایسته|ارزیابی بایسته]] توسط ویرایشگری دیگر» یا «فرض نیت کور» در مواجهه با منابع، ویرایگران یا محتوای صفحهها است. اما منظور در اصل بیشتر به «احتمال وجود قصد خوب» نزدیک است، که به این معنا نیست که «من به منبع دسترسی ندارم، پس در مورد محتوای منبع، فرض را بر حسن نیت میگذارم» و همچنین به این معنا نیست که «یک ویرایشگر [[ویکیپدیا:شیوه ارجاع به منابع|محتوای بدون منبع را حذف کرده است]]، پس من ''با فرض حسن نیت '' اینطور در نظر میگیرم که او ارزیابی بایسته انجام داده تا مطمئن شود که [[ویکیپدیا:منابع معتبر|منابع معتبر]] برای آن محتوا در دسترس نیست.»
این رهنمود همچنین به این معنا نیست که باید شواهد واضح مبنی بر [[ویکیپدیا:ویرایش اخلالگرانه|رفتار اخلالگرانه]] یا [[ویکیپدیا:سیاستها و رهنمودها|نقض رهنمودهای ویکیپدیا]] را نادیده بگیرید و تمام ویرایشها را بدون هیچ پرسشی بپذیرید. برخی از بازیگران بد ممکن است اصرار داشته باشند که اعتماد به آنها با استناد به «فرض حسن نیت» باید تغییرناپذیر باشد، حتی اگر شواهدی بر ضد آن موجود باشد. با این حال، ویرایشگران باید توجه کنند که الگوهای ویرایشهای مخرب را نادیده نگیرند، و همچنین نباید از تلاشهای آشکار برای فریب، [[ویکیپدیا:خرابکاری|خرابکاری]] یا پیشبرد یک [[ویکیپدیا:دیدگاه بیطرف|دستور کار مغرضانه]] چشمپوشی کنند. در عوض، رهنمود «فرض حسن نیت» ویرایشگران را تشویق میکند که قدم نخست را با این باور بردارند که دیگران در تلاش برای بهبود ویکیپدیا هستند. هنگامی که با یک ویرایش مشکلدار روبرو میشوید، مهم است که آن را بررسی و به آن رسیدگی کنید، اما هنگام انجام این کار این موضوع را در نظر داشته باشید که اشتباهاتی هم ممکن است رخ دهند و هر خطایی با نیت بدخواهانه انجام نمیشود. کاربرد فرض حسن نیت در حفظ یک محیط ویرایش مشارکتی و محترمانه است.
== نشان دادن حسن نیت ==
{{میانبر|وک:نحن}}
علاوه بر فرض حسن نیت، با نشان دادن حسن نیت خودتان، دیگران را به صورت عملی به فرض حسن نیت ترغیب کنید. این کار به واسطهٔ بیان [[ویکیپدیا:صداقت|صادقانهٔ]] انگیزههایتان و انجام ویرایشهایی که تمایل شما به مصالحه، علاقهتان به بهبود ویکیپدیا، پایبندیتان به سیاستها و رهنمودهایش، اعتقادتان به صحت ویرایشهایتان، خودداریتان از [[ویکیپدیا:بازی با سامانه|به بازی گرفتن سامانه]] و دیگر رفتارهای مبتنی بر حسن نیت را نشان میدهند میسر است. نشان دادن حسن نیت الزامی نیست، اما به تعامل موفق و بیدردسر با دیگران کمک میکند.
== مواجهه با سوء نیت ==
{{میانبر|وک:سوءنیت}}
حتی وقتی سوء نیت طرف مقابل آشکار است، شما نباید خودتان در واکنش [[w:fa:ویکیپدیا:نزاکت|بینزاکتی]] کنید، به شخصیت طرف مقابل [[ویکیکتاب:حمله شخصی ممنوع|حمله]] کنید، یا خونسردیتان را از دست بدهید. اگر یک طرف ماجرا از اول تا آخر درست رفتار کرده باشد، دیگران راحتتر خواهند توانست اختلاف را [[ویکیکتاب:تابلوی اعلانات مدیران|حل]] کنند یا خطاهای طرف مقابل را ببینند.
مدیران ویکیپدیا و دیگر کاربران مجرب فعال در زمینهٔ حل اختلاف از کمک کردن به شما خوشحال خواهند شد و اگر با ارائهٔ مدرک واضح و مشخص توجه ایشان را به موضوع جلب کنید، قادرند رفتار ناقض سیاستها را تشخیص دهند.
=== اتهام سوء نیت به دیگران ===
بدون ارائهٔ مدرک واضح در قالب پیوند تفاوت دیگر کاربران را به سوء نیت متهم نکنید. چنین ادعایی خریدار ندارد، به هدف نمیرسد و حتی میتواند تحریککننده باشد و اختلاف را حادتر کند. تکرار اتهام سوء نیت، بدون ارائه مدرک واضح که نشان دهد اقدامات یک کاربر در واقع با سوء نیت یا [[ویکیکتاب:آزار و اذیت|اذیتوآزار]] توأم هستند، خود میتواند به [[وک:حمله شخصی ممنوع|حمله به شخصیت فرد]] تعبیر شود. طرف مقابل هم میتواند بهراحتی شما را به سوء نیت متهم کند، که در نتیجه چرخهای زشت از اتهامات ایجاد میشود بدون اینکه اختلاف حل شود.
[[رده:رهنمودهای ویکیکتاب]]
9mryft7iul5gx7bykgbw4nwfr4cfwwq
الگو:این رهنمود در یک نگاه
10
42111
135117
2026-09-20T09:54:45Z
Vivairan2
28134
تغییرمسیر به [[الگو:چکیده]]
135117
wikitext
text/x-wiki
#تغییر_مسیر [[الگو:چکیده]]
rz8ji2m9myuxuzqr7d7hh9la2ai6l8p
ویکیکتاب:ربات
4
42112
135118
2026-09-20T09:59:10Z
Vivairan2
28134
تغییرمسیر به [[ویکیکتاب:رباتها]]
135118
wikitext
text/x-wiki
#تغییر_مسیر [[ویکیکتاب:رباتها]]
gxy8qmztqpgmhnu3smyva1l8p4jfwdt