ایران سرفراز- نرم افزار وپروژهای دانشجویی


نرم افزار وپروژهای دانشجویی

++VC و C++ ،C فایل ها در زبان برنامه نویسی

<!-- /* Font Definitions */ @font-face {font-family:Helvetica; panose-1:2 11 5 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Courier; panose-1:2 7 4 9 2 2 5 2 4 4; mso-font-charset:0; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Tms Rmn"; panose-1:2 2 6 3 4 5 5 2 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Helv; panose-1:2 11 6 4 2 2 2 3 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"New York"; panose-1:2 4 5 3 6 5 6 2 3 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:System; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0; mso-font-charset:2; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:"MS Mincho"; panose-1:2 2 6 9 4 2 5 8 3 4; mso-font-alt:"MS 明朝"; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 134676480 16 0 131072 0;} @font-face {font-family:Batang; panose-1:2 3 6 0 0 1 1 1 1 1; mso-font-alt:바탕; mso-font-charset:129; mso-generic-font-family:auto; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 151388160 16 0 524288 0;} @font-face {font-family:SimSun; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:宋体; mso-font-charset:134; mso-generic-font-family:auto; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:1 135135232 16 0 262144 0;} @font-face {font-family:PMingLiU; panose-1:2 1 6 1 0 1 1 1 1 1; mso-font-alt:新細明體; mso-font-charset:136; mso-generic-font-family:auto; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:1 134742016 16 0 1048576 0;} @font-face {font-family:"MS Gothic"; panose-1:2 11 6 9 7 2 5 8 2 4; mso-font-alt:"MS ゴシック"; mso-font-charset:128; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 134676480 16 0 131072 0;} @font-face {font-family:Dotum; panose-1:2 11 6 0 0 1 1 1 1 1; mso-font-alt:돋움; mso-font-charset:129; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 151388160 16 0 524288 0;} @font-face {font-family:SimHei; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:黑体; mso-font-charset:134; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 135135232 16 0 262144 0;} @font-face {font-family:MingLiU; panose-1:2 1 6 9 0 1 1 1 1 1; mso-font-alt:細明體; mso-font-charset:136; mso-generic-font-family:modern; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 134742016 16 0 1048576 0;} @font-face {font-family:Mincho; panose-1:2 2 6 9 4 3 5 8 3 5; mso-font-alt:明朝; mso-font-charset:128; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 134676480 16 0 131072 0;} @font-face {font-family:Gulim; panose-1:2 11 6 0 0 1 1 1 1 1; mso-font-alt:굴림; mso-font-charset:129; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 151388160 16 0 524288 0;} @font-face {font-family:Century; panose-1:2 4 6 3 5 7 5 2 3 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Angsana New"; panose-1:2 2 6 3 5 4 5 2 3 4; mso-font-charset:222; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:"Cordia New"; panose-1:2 11 3 4 2 2 2 2 2 4; mso-font-charset:222; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:16777217 0 0 0 65536 0;} @font-face {font-family:Mangal; panose-1:0 0 4 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:32768 0 0 0 0 0;} @font-face {font-family:Latha; panose-1:2 0 4 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:1048576 0 0 0 0 0;} @font-face {font-family:Sylfaen; panose-1:1 10 5 2 5 3 6 3 3 3; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:16778883 0 512 0 13 0;} @font-face {font-family:Vrinda; panose-1:1 1 6 0 1 1 1 1 1 1; mso-font-charset:1; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:0 0 0 0 0 0;} @font-face {font-family:Raavi; panose-1:2 0 5 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:0 0 0 0 0 0;} @font-face {font-family:Shruti; panose-1:2 0 5 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:0 0 0 0 0 0;} @font-face {font-family:Sendnya; panose-1:0 0 4 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:0 0 0 0 0 0;} @font-face {font-family:Gautami; panose-1:2 0 5 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:0 0 0 0 0 0;} @font-face {font-family:Tunga; panose-1:0 0 4 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:0 0 0 0 0 0;} @font-face {font-family:"Estrangelo Edessa"; panose-1:3 8 6 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:0 0 0 0 0 0;} @font-face {font-family:"Arial Unicode MS"; panose-1:2 11 6 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:Tahoma; panose-1:2 11 6 4 3 5 4 4 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:3 0 0 0 1 0;} @font-face {font-family:"Cambria Math"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:1; mso-generic-font-family:roman; mso-font-format:other; mso-font-pitch:variable; mso-font-signature:0 0 0 0 0 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:right; mso-pagination:widow-orphan; direction:rtl; unicode-bidi:embed; font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:"Times New Roman";} a:link, span.MsoHyperlink {color:blue; text-decoration:underline; text-underline:single;} a:visited, span.MsoHyperlinkFollowed {color:purple; text-decoration:underline; text-underline:single;} ins {mso-style-type:export-only; text-decoration:none;} span.msoIns {mso-style-type:export-only; mso-style-name:""; text-decoration:underline; text-underline:single;} span.msoDel {mso-style-type:export-only; mso-style-name:""; text-decoration:line-through; color:aqua;} @page Section1 {size:595.3pt 841.9pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:35.4pt; mso-footer-margin:35.4pt; mso-paper-source:0; mso-gutter-direction:rtl;} div.Section1 {page:Section1;} -->

 

Mohsen_mahyar@yahoo.com

 

84/10/ تاریخ تالیف: 9

VC++ و C++ ،C فایل ها در زبان برنامه نویسی

 

.:: 2 ::.

VC++ و C++ ،C فایل در زبان های برنامه نویسی

هر فایل شامل مجموعه ای از داده های مرتبط به هم است، مانند داده های مربوط

به کلیه دانشجویان یک دانشگاه . فایل یک نوعی از ساختمان داده است که این نوع از

ساختمان داده، بر روی حافظه جانبی مثل دیس ک نوار و غیره تشکیل می شود . چ ون

اطلاعات موجود در روی حافظه جانبی با قطع جریان برق قطع اجرای برنامه و یا دلایلی

از این قبیل از بین نمی روند به دفعات زیادی مورد استفاده قرار می گیرند.

فایل داده می تواند هر دستگاهی مثل صفحه نمایش، صفحه کلید، چاپگر، ترمینال، دیسک، نوار و C در زبان برنامه نویسی

غیره باشد. داده ها ممکن است به چهار روش در فایل ذخیره شده سپس بازیابی شوند:

-1 داده ها، کاراکتر به کاراکتر در فایل نوشته شده سپس کاراکتر به کاراکتر از فایل خوانده شوند.

-2 داده ها به صورت رشته ای از کاراکترها در فایل نوشته شده سپس به صورت رشته ای از کاراکترها

دستیابی شوند.

-3 داده ها در حین نوشتن بر روی فایل، با فرمت خاصی نوشته شده سپس با همان فرمت خوانده شوند (

کاراکتری، عددی، رشته ای ).

-4 داده ها به شکل ساختمان (رکورد) بر روی فایل نوشته شده سپس بصورت ساختمان از فایل خوانده

شوند.

انواع فایل از نظر نوع اطلاعات

داده ها ممکن است در فایل به دو صورت ذخیره شوند:

VC++ و C++ ،C فایل ها در زبان برنامه نویسی

Mohsen_mahyar@yahoo.com

 

.:: 3 ::.

-1 اسکی 1 یا متن

-2 باینری 2

این دو روش ذخیره شدن داده ها، در موارد زیر با یکدگر تفاوت دارند:

-1 تعیین انتهای خط

-2 تعیین انتهای فایل

-3 نحوه ذخیره شدن اعداد بر روی دیسک

در فایل متنی، اعداد به صور ت رشته ای از کاراکترها ذخیره می شوند ولی در فایل باینری اعداد به همان صورتی که در

حافظه قرار می گیرند بر روی دیسک ذخیره می گردند.

به عنوان مثال، در فایل متنی عدد 256 سه بایت را اشغال می کند . زیرا هر رقم آن، به صورت یک کاراکتر در نظر

گرفته می شود . ولی در فا یل باینری این عدد در دو بایت ذخیره می شود. (چون عدد 256 یک عدد صحیح است و

اعداد صحیح در دو بایت ذخیره می شوند).

در فایل متنی کاراکتری که پایان خط را مشخص می کند، در حین ذخیره شدن بر روی دیسک، باید به

تبدیل شود و در حین خوانده شدن، عکس این عمل باید (Carriage Return Line Feed) CR/LF کاراکترهای

باید به کاراکترهای تعیین کننده پایان خط تبدیل شوند و بدیهی است که این CR/LF صورت گیرد : یعنی کاراکترهای

تبدیلات مستلزم صرف وقت است، لذا دسترسی به اطلاعات موجود در فایلهای متنی کندتر از فایل های باینری است.

اختلاف د یگر در فایلهای متنی و باینری در تشخیص انتهای فایل است . در هر دو روش ذخیره فایلها، طول فایل

1A توسط سیستم نگهداری می شود و انتهای فایل با توجه به طول فایل مشخص می گردد . در حالت متنی کاراکتر

به CTRL (در مبنای 16 ) و یا 26 (در مبنای 10 ) مشخص کننده انتهای فایل است . (این کاراکتر با فشار دادن کلید

ایجاد می شود). Z همراه

ASCII 1

Binary 2

VC++ و C++ ،C فایل ها در زبان برنامه نویسی

Mohsen_mahyar@yahoo.com

.:: 4 ::.

می پردازیم: C++ یا C حال به بررسی توابع و دستورات مختلف فایل در زبان

باز کردن فایل

هر فایل قبل از اینکه بتواند مورد استفاده قرار گیرد باید باز شود، مواردی که حین بازکردن فایل مشخص می شود

عبارتند از:

-1 نام فایل

-2 نوع فایل از نظر ذخیره اطلاعات متنی یا باینری

-3 نوع فایل از نظر ورودی -خروجی ( آیا فایل فقط به عنوان ورودی است، آیا فقط به عنوان خروجی

است یا هم به عنوان ورودیست و هم به عنوان خروجی است).

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

گفته می شود . اگر فایل طوری باز شود که فقط عمل خواندن اطلاعات از آن امکان پذیر باشد به چنین فایلی، فایل

ورودی گفته می شود . اگر فایل طوری باز شود که هم عمل نوشتن اطلاعات بر روی آن مجاز باشد و هم عمل خواندن

اطلاعات از آن،به چنین فایلی، ورودی-خروجی گفته می شود.

قرار دارد و به صورت زیر به کار stdio.h استفاده می گردد . این تابع در فایل fopen() برای باز کردن فایل از تابع

می رود.

FILE *fopen (char *filename, *mode)

به رشته ای اشاره می کند که حاوی نام فایل و محل تشکیل یا وجود آن است. filename ، در این الگو

مشخص می کند که فایل چگونه باز شود (ورودی، خروجی و یا ورودی-خروجی). Mode

VC++ و C++ ،C فایل ها در زبان برنامه نویسی

Mohsen_mahyar@yahoo.com

.:: 5 ::.

قرار داد در جدول زیر به طور کامل آورده شده است: mode مقادیری که می توان به جای عبارت

مفهوم MODE

را به عنوان ورودی باز می کند text فایلی از نوع r(rt)

را به عنوان خروجی باز می کنند text فایلی از نوع w(wt)

فایل را طوری باز می کند که بتوان اطلاعاتی را به آن اضافه کرد. a(at)

فایلی از نوع باینری را به عنوان ورودی باز می کند. rb

فایلی از نوع باینری را به عنوان خروجی باز می کند. wb

ab

فایل موجود از نوع باینری را طوری باز می کند که بتوان اطلاعات را به

انتهای آن اضافه نمود.

را به عنوان ورودی و خروجی باز می کند text فایل موجود از نوع r+(r+t)

را به عنوان ورودی و خروجی باز می کند text فایلی از نوع w+(w+t)

را به عنوان ورودی و خروجی باز می کند text فایل موجود از نوع a+(a+t)

فایل موجود از نوع باینری را به عنوان ورودی و خروجی باز می کند r+b

فایل موجود از نوع باینری را به عنوان ورودی و خروجی باز می کند w+b

a+b

فایل موجود از نوع باینری را به عنوان ورودی و خروجی باز می کند (این

فایل از قبل می تواند وجود داشته باشد).

به مثال ساده زیر توجه کنید:

FILE *fp; // تعریف یک اشاره گر از نوع فایل

fp=fopen("c:/data.txt","rt")

VC++ و C++ ،C فایل ها در زبان برنامه نویسی

Mohsen_mahyar@yahoo.com

.:: 6 ::.

و از نوع فقط خواندنی ایجاد می شود. C بر روی درایو txt و با پسوند متنی data در مثال بالا فایلی به نام

برگردانده می شود که می توان به صورت زیر این عمل را NULL اگر فایل مورد نظر در شاخه موجود نباشد اشاره گر

چک نمود:

بستن فایل:

انجام می شود. که fclose() بعد از اینکه برنامه نویس کارش را با فایل تمام کرد باید آن را ببندد . بستن تابع با دستور

دارای الگوی زیر است:

int fclose(FILE *fp)

fclose(p) بسته شود. به عنوا ن مثال دستور fclose() به فایلی اشاره می کند که باید توسط تابع fp ، در الگوی بالا

به آن اشاره می کند می بندد. p فایلی را که

بست. این تابع به صورت زیر به fcloseall() اگر چندین فایل بطور همزمان در برنامه باز باشند می توان آنها را با تابع

کار می رود:

fcloseall();

if ((fp=fopen("A:data.txt","w"))==NULL

{

printf("can not open file \n");

}

VC++ و C++ ،C فایل ها در زبان برنامه نویسی

Mohsen_mahyar@yahoo.com

.:: 7 ::.

در زیر به برخی از توابعی که در کار با فایل ها مورد استفاده قرار می گیرد آورده شده است:

نام تابع توضیح

fputc() یا Putc()

از این دو تابع برای نوشتن کاراکتر در فایل استفاده می شود.

الگوی تابع:

int putc(int ch, FILE *fp)

مثال:

ch=getchar();

putc(ch,in);

fgetc() یا getc()

برای خواندن کاراکتر ها از فایل استفاده دارد

الگوی تابع:

int getc(FILE *fp)

مثال:

FILE *in;

ch=getc(in);

fputs()

برای نوشتن رشته ها در فایل بکار می رود.

الگوی تابع:

int puts(const char *str, FILE *fp)

fgets()

برای خواندن رشته از فایل کاربرد دارد.

الگوی تابع:

char *fgets(char *str,int length,FILE *fp)

VC++ و C++ ،C فایل ها در زبان برنامه نویسی

Mohsen_mahyar@yahoo.com

: آدرس سایت

.:: 8 ::.

rewind()

بردن موقعیت سنج به ابتدای فایل بدون اینکه بخواهیم فایل را بسته و دوباره

قرار دارد و به صورت زیر است: stdio.h آن را باز کنیم.الگوی این تابع در فایل

void rewind(FILE *fp)

ferror()

در حین انجام کار با فایل ممکن است خطایی رخ دهد . به عنوان مثال عدم

وجود فضای کافی برای ایجاد فایل، آماده نبودن دستگاهی که فایل باید در

آنجا تشکیل گردد و یا مواردی از این قبیل، منجر به بروز خطا می شوند . با

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

قرار دارد و به صورت زیر است: stdio.h در فایل

int ferror(FILE *fp)

remove()

برای حذف فایلهای غیر ضروری می توان از این تابع استفاده کرد.

قرار دارد و به صورت زیر است: stdio.h الگوی این تابع در فایل

int remove(char *filename)

به نام فایلی اشاره می کند که باید ح ذف شود . اگر filename در الگوی فوق

عمل تابع با موفقیت انجام شود مقدار صفر وگرنه مقداری غیر از صفر برگردانده

خواهد شد.

fflush()

انتقال کلیه داده های موجود در بافرها به فایل

قرار دارد و به صورت زیر است: stdio.h الگوی این تابع در فایل

int fflush(FILE *fp)

برگردانده EOF اگر عمل تابع با موفقیت انجام شود مقدار صفر وگرنه مقدار

خواهد شد.

VC++ و C++ ،C فایل ها در زبان برنامه نویسی

Mohsen_mahyar@yahoo.com

.:: 9 ::.

fprintf()

نوشتن داده ها با فرمت خاصی بر روی فایل

قرار دارد و به صورت زیر است: stdio.h الگوی این تابع در فایل

int fprintf(FILE *fp,"*control_string,…",char arg,…)

مثال:

fprintf(fp,"%c",ch);

fscanf()

خواندن داده با فرمت خاص از فایل مورد نطر

قرار دارد و به صورت زیر است: stdio.h الگوی این تابع در فایل

int fscanf(FILE *fp,"control_string,…",char arg,…)

مثال:

fscanf(fp,"%d",&num);

fwrite()

می باشد اما با این تفاوت که دارای سرعت بیشتری نسبت به fprintf() مانند

می باشد. fprintf()

قرار دارد و به صورت زیر است: stdio.h الگوی این تابع در فایل

int fwrite(void *buffer, int num_byte,int count,FILE *fp)

مثال:

Char table[20];

fwrite(table,sizeof(char),200,fp);

fread()

می باشد اما با این تفاوت که دارای سرعت بیشتری نسبت به fscanf() مانند

آن می باشد.

قرار دارد و به صورت زیر است: stdio.h الگوی این تابع در فایل

int fread(void *buffer, int num_byte,int count,FILE *fp)

VC++ و C++ ،C فایل ها در زبان برنامه نویسی

Mohsen_mahyar@yahoo.com

.:: 10 ::.

مثال:

Char arr[10];

fread(arr,sizeof(char),10,fp);

دسترسی تصادفی به فایل (ورودی-خروجی تصادفی)

مفهوم دستیابی تصادفی به فایل این است که در هرجایی از فایل بتوانیم بنویسیم و از هر جایی از فایل بتوانیم

اطلاعات را بخوانیم . اگر بتوانیم " موقعیت سنج فایل" را به هر جایی که خواستیم، منتقل کنیم، به مفهوم تصادفی فایل

استفاده می شود . الگوی این تابع در فایل fseek() دست می یابیم . برای تغییر مکان موقعیت سنج فایل از تابع

قرار داشته و به صورت زیر می باشد: stdio.h

int fseek (FILE *fp,long num_byte,int origin)

مشخص می شود، origin اساس کار این تابع به این صورت است که با شروع از یک محل در فایل، که توسط پارامتر

تغییر مکان می دهد. یعنی تغییر مکان موقعیت سنج فایل به طور نسبی num_byte موقعیت سنج فایل را به طول

محل 100 فایل origin تعیین می گردد سنجیده می شود . به عنوان مثال اگر origin بوده، نسبت به محلی که توسط

برابر 200 باشد، موقعیت سنج فایل به محل 300 منتقل num_byte را به عنوان مبدا حرکت مشخص کند و طول

می تواند بپذیرد در جدول زیر آورده شده است: origin خواهد شد. مقادیری که

مبدا حرکت نام ماکرویی که بیانگر این مبدا است

SEEK_SET ابتدای فایل

SEEK_CUR موقعیت فعلی فایل

SEEK_END انتهای فایل

VC++ و C++ ،C فایل ها در زبان برنامه نویسی

Mohsen_mahyar@yahoo.com

.:: 11 ::.

آورده شده است: MSDN VC++ توابع زیر از

Visual C++

: ftell() تابع

stdio.h را بر می گرداند. الگوی این تابع در فایل File Pointer کار این تابع موقعیت فعلی اشاره گر فایل یا همان

قرار دارد و به صورت زیر می باشد:

long ftell( FILE *stream );

مثال:

موقعیت اشاره ftell() باز می کند و 100 کاراکتر از آن فایل را می خواند. تابع FTELL.C این برنامه یک فایل با نام

گر فایل را شناسایی کرده و موقعیت آنرا به ما می دهد که در نهایت عدد 100 به عنوان خروجی به ما داده می شود.

#include <stdio.h>

FILE *stream;

void main( void )

{

long position;

char list[100];

if( (stream = fopen( "ftell.c", "rb" )) != NULL )

{

/* Move the pointer by reading data: */

fread( list, sizeof( char ), 100, stream );

/* Get position after read: */

position = ftell( stream );

printf( "Position after trying to read 100 bytes: %ld\n",position );

fclose( stream );

}

}

Output

Position after trying to read 100 bytes: 100

VC++ و C++ ،C فایل ها در زبان برنامه نویسی

Mohsen_mahyar@yahoo.com

.:: 12 ::.

_wopen() ، _open() تابع

کار دو تابع فوق باز کردن فایل می باشد.

الگوی آنها به صورت زیر می باشد:

int _open( const char *filename, int oflag [, int pmode] );

int _wopen( const wchar_t *filename, int oflag [, int pmode] );

می باشد. wchar.h و یا io.h در _wopen() و تابع ، io.h در _open() تابع

مقادیر برگشتی این توابع:

خطا دارای مقادیر زیر بسته به نوع خطا می باشد: case این تابع ها عدد 1- را در صورت بروز خطا بر می گرداند که

مقدار برگشتی توضیح

سعی بر نوشتن بر روی فایل فقط خواندنی یا فایلهای به اشتراک گذاشته EACCES

ای که کاربر اجازه تغییر در آنها را نداشته باشد و یا اینکه مسیر داده شده

یک پوشه یا دایرکتوری باشد.

این فایل با این نام قبلا وجود دارد. EEXIST

pmode یا oflag اشتباه بودن آرگومانهای EINVAL

تعداد فایل های باز بسیار بسیار زیاد است. EMFILE

پیدا نشدن فایل یا مسیر مورد نظر ENOENT

VC++ و C++ ،C فایل ها در زبان برنامه نویسی

محقق: محمد بشیری

Mohsen_mahyar@yahoo.com

.:: 13 ::.

یک عبارت عددی است که دارای مقادیر ثابت طبق جدول زیر می باشد: oflag() آرگومان

قرار دارد. FCNTL.H ترکیبات جدول زیر در

مقدار برگشتی توضیح

قبل از هرگونه عملیات نوشتنی بر روی فایل اشاره گر فایل را _O_APPEND

به انتهای آن می برد.

فایل را در حالت باینری باز می کند. _O_BINARY

ایجاد کردن و باز کردن یک فایل جدید برای نوشتن. اگر _O_CREAT

فایل قبلا موجود باشد تفاوتی نمی کند. در این حالت ویژه

قرار می دهیم. _O_CREAT را برابر pmode آرگومان

در صورتی که نتوانیم قسمتی از حافظه را پاک کنیم برای ما _O_CREAT | _O_SHORT_LIVED

یک فایل موقت ایجاد می کند. در این حالت خاص آرگومان

قرار می دهیم. _O_CREAT را برابر pmode

هنگامی که آخرین فایل بسته شد فایل حذف می گردد. _O_CREAT | _O_TEMPORARY

را برابر pmode در این حالت خاص آرگومان

قرار می دهیم. _O_CREAT

اگر نام فایل وجود داشته باشد مقدار خطا را بر می گرداند و _O_CREAT | _O_EXCL

همراه باشد. _O_CREAT باید با

دسترسی اولیه تصادفی به دیسک _O_RANDOM

فایل را به صورت فقط خواندنی باز می کند _O_RDONLY

و _O_RDONLY این آرگومان با فلگ های

استفاده نمی شود. _O_WRONLY

VC++ و C++ ،C فایل ها در زبان برنامه نویسی

Mohsen_mahyar@yahoo.com

.:: 14 ::.

باز کردن فایل به صورت خواندنی- نوشتنی _O_RDWR

و _O_RDONLY این آرگومان با فلگ های

استفاده نمی شود. _O_WRONLY

دسترسی اولیه ترتیبی به دیسک _O_SEQUENTIAL

باز کردن فایل متنی _O_TEXT

حذف کردن اطلاعات در فایل تا اندازه آن فایل به صفر _O_TRUNC

برسد. فایل مورد نظر باید اجازه نوشتن بر روی آن داده شده

باشد و محافظت شده نباشد.

_O_RDONLY : فلگی که نمی توان استفاده کرد

برای باز کردن یک _O_CREAT با _O_TRUNC

فایل موجود و یا ایجاد یک فایل جدید به کار می رود.

باز کردن فایل به صورت فقط نوشتنی. _O_WRONLY

با دو فلگ زیر استفاده نمی شود:

_O_WRONLY یا _O_RDWR

در ضمن یک مقدار مشخصی برای دسترسی وجود ندارد.

pmode ، آمده باشد. اگر فایل از قبل موجود بود _O_CREAT فقط هنگامی به کار می رود که pmode() آرگومان

اجازه تنظیمات مختلف فایل را به ما می هد. ، pmode چشم پوشی می شود در غیر اینصورت

مجوز فقط خواندن : S_IREAD

مجوز نوشتن ( اجازه موثر و کارا برای خواندن و نوشتن) : _S_IWRITE

VC++ و C++ ،C فایل ها در زبان برنامه نویسی

Mohsen_mahyar@yahoo.com

.:: 15 ::.

مجوز نوشتن و خواندن : _S_IREAD | _S_IWRITE

برای روشن تر شدن مطلب به مثال زیر توجه کنید:

برای ورودی و یک فایل با نام OPEN.C می پردازد. یک فایل با نام _open این مثال به توضیح کاربرد دستور

برای خروجی در نظر گرفته شده است. سپس فایلها بسته می شوند. OPEN.OUT

Example

/* OPEN.C: This program uses _open to open a file

* named OPEN.C for input and a file named OPEN.OUT

* for output. The files are then closed.

*/

#include <fcntl.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <io.h>

#include <stdio.h>

void main( void )

{

int fh1, fh2;

fh1 = _open( "OPEN.C", _O_RDONLY );

if( fh1 == -1 )

perror( "open failed on input file" );

else

{

printf( "open succeeded on input file\n" );

_close( fh1 );

}

fh2 = _open( "OPEN.OUT", _O_WRONLY | _O_CREAT, _S_IREAD | _S_IWRITE );

if( fh2 == -1 )

perror( "Open failed on output file" );

else

{

printf( "Open succeeded on output file\n" );

_close( fh2 );

}

}

Output

Open succeeded on input file

Open succeeded on output file

VC++ و C++ ،C فایل ها در زبان برنامه نویسی

Mohsen_mahyar@yahoo.com

.:: 16 ::.

_close() تابع

قرار دارد: io.h از این تابع برای بستن فایل استفاده می شود. الگوی این تابع به صورت زیر است و در

int _close( int handle );

بعد از اجرای این این تابع اگر مقدار صفر برگردانده شود به مفهوم این می باشد که فایل بسته شده در غیر اینصورت

تنظیم می شود. EBADF به errno

به مثال زیر توجه نمایید:

برای ورودی و یک فایل با نام OPEN.C می پردازد. یک فایل با نام _close این مثال به توضیح کاربرد دستور

برای خروجی در نظر گرفته شده است. سپس فایلها بسته می شوند. OPEN.OUT

#include <fcntl.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <io.h>

#include <stdio.h>

void main( void )

{

int fh1, fh2;

fh1 = _open( "OPEN.C", _O_RDONLY );

if( fh1 == -1 )

perror( "open failed on input file" );

else

{

printf( "open succeeded on input file\n" );

_close( fh1 );

}

fh2 = _open( "OPEN.OUT", _O_WRONLY | _O_CREAT, _S_IREAD |

_S_IWRITE );

if( fh2 == -1 )

perror( "Open failed on output file" );

else

{

printf( "Open succeeded on output file\n" );

_close( fh2 );

}

}

Output

Open succeeded on input file

Open succeeded on output file

VC++ و C++ ،C فایل ها در زبان برنامه نویسی

Mohsen_mahyar@yahoo.com

.:: 17 ::.

_lseek, _lseeki توابع 64

حرکت دادن موقعیت سنج فایل به یک محل خاص (دلخواه)

قرار دارند: io.h الگوی این توابع به صورت زیر می باشد و در

long _lseek( int handle, long offset, int origin );

__int64 _lseeki64( int handle, __int64 offset, int origin );

از موقعیت جدید از ابندای فایل می باشد. long در قالب _lseek() مقدار برگشتی

یک عدد 64 بیتی می باشد. _lseeki مقدار برگشتی 64

-1 را بر می گرداند. L در صورت بروز خطا تابع مقدار

توضیحات مربوط به این دستور قبلا توضیح داده شده است که در این قسمت از یادآوری مجدد آن پرهیز می کنیم.

می تواند بگیرد آورده شده است: orogin در جدول زیر مقادیری را که

مبدا حرکت نام ماکرویی که بیانگر این مبدا است

SEEK_SET ابتدای فایل

SEEK_CUR موقعیت فعلی فایل

SEEK_END انتهای فایل

به مثال زیر توجه نمایید.

VC++ و C++ ،C فایل ها در زبان برنامه نویسی

Mohsen_mahyar@yahoo.com

.:: 18 ::.

Example

/* LSEEK.C: This program first opens a file named LSEEK.C.

* It then uses _lseek to find the beginning of the file,

* to find the current position in the file, and to find

* the end of the file.

*/

#include <io.h>

#include <fcntl.h>

#include <stdlib.h>

#include <stdio.h>

void main( void )

{

int fh;

long pos; /* Position of file pointer */

char buffer[10];

fh = _open( "lseek.c", _O_RDONLY );

/* Seek the beginning of the file: */

pos = _lseek( fh, 0L, SEEK_SET );

if( pos == -1L )

perror( "_lseek to beginning failed" );

else

printf( "Position for beginning of file seek = %ld\n", pos );

/* Move file pointer a little */

_read( fh, buffer, 10 );

/* Find current position: */

pos = _lseek( fh, 0L, SEEK_CUR );

if( pos == -1L )

perror( "_lseek to current position failed" );

else

printf( "Position for current position seek = %ld\n", pos );

/* Set the end of the file: */

pos = _lseek( fh, 0L, SEEK_END );

if( pos == -1L )

perror( "_lseek to end failed" );

else

printf( "Position for end of file seek = %ld\n", pos );

_close( fh );

}

Output

Position for beginning of file seek = 0

Position for current position seek = 10

Position for end of file seek = 1207

VC++ و C++ ،C فایل ها در زبان برنامه نویسی

Mohsen_mahyar@yahoo.com

.:: 19 ::.

_read() تابع

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

قرار دارد. io.h الگوی آن به صورت زیر است و در

int _read( int handle, void *buffer, unsigned int count );

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

برای درک بهتر این تابع به مثال زیر توجه کنید:

/* READ.C: This program opens a file named

* READ.C and tries to read 60,000 bytes from

* that file using _read. It then displays the

* actual number of bytes read from READ.C.

*/

#include <fcntl.h> /* Needed only for _O_RDWR definition */

#include <io.h>

#include <stdlib.h>

#include <stdio.h>

char buffer[60000];

void main( void )

{

int fh;

unsigned int nbytes = 60000, bytesread;

/* Open file for input: */

if( (fh = _open( "read.c", _O_RDONLY )) == -1 )

{

perror( "open failed on input file" );

exit( 1 );

}

/* Read in input: */

if( ( bytesread = _read( fh, buffer, nbytes ) ) <= 0 )

perror( "Problem reading file" );

else

printf( "Read %u bytes from file\n", bytesread );

_close( fh );

}

Output

Read 775 bytes from file

VC++ و C++ ،C فایل ها در زبان برنامه نویسی

Mohsen_mahyar@yahoo.com

.:: 20 ::.

_write() تابع

با استفاده از این تابع می توان اطلاعات را در فایل نوشت.

قرار دارد. io.h الگوی این تابع به شکل زیر می باشد و در

int _write( int handle, const void *buffer, unsigned int count );

اگر عمل نوشتن با موفقیت انجام شود مقدار برگشتی تابع تعداد بایت های نوشته شده خواهد بود.

مثال زیر یک فایل را به عنوان خروجی باز می کند و با استفاده از این تابع بایت هایی را در آن می نویسد.

Example

/* WRITE.C: This program opens a file for output

* and uses _write to write some bytes to the file.

*/

#include <io.h>

#include <stdio.h>

#include <stdlib.h>

#include <fcntl.h>

#include <sys/types.h>

#include <sys/stat.h>

char buffer[] = "This is a test of '_write' function";

void main( void )

{

int fh;

unsigned byteswritten;

if( (fh = _open( "write.o", _O_RDWR | _O_CREAT,

_S_IREAD | _S_IWRITE )) != -1 )

{

if(( byteswritten = _write( fh, buffer, sizeof( buffer ))) == -1 )

perror( "Write failed" );

else

printf( "Wrote %u bytes to file\n", byteswritten );

_close( fh );

}

}

Output

Wrote 36 bytes to filem.bashiry@gmail.com : آدرس پست الکترونیک

http://bashiry.250free.com : آدرس سایت

.:: 2 ::.

VC++ و C++ ،C فایل در زبان های برنامه نویسی

هر فایل شامل مجموعه ای از داده های مرتبط به هم است، مانند داده های مربوط

به کلیه دانشجویان یک دانشگاه . فایل یک نوعی از ساختمان داده است که این نوع از

ساختمان داده، بر روی حافظه جانبی مثل دیس ک نوار و غیره تشکیل می شود . چ ون

اطلاعات موجود در روی حافظه جانبی با قطع جریان برق قطع اجرای برنامه و یا دلایلی

از این قبیل از بین نمی روند به دفعات زیادی مورد استفاده قرار می گیرند.

فایل داده می تواند هر دستگاهی مثل صفحه نمایش، صفحه کلید، چاپگر، ترمینال، دیسک، نوار و C در زبان برنامه نویسی

غیره باشد. داده ها ممکن است به چهار روش در فایل ذخیره شده سپس بازیابی شوند:

-1 داده ها، کاراکتر به کاراکتر در فایل نوشته شده سپس کاراکتر به کاراکتر از فایل خوانده شوند.

-2 داده ها به صورت رشته ای از کاراکترها در فایل نوشته شده سپس به صورت رشته ای از کاراکترها

دستیابی شوند.

-3 داده ها در حین نوشتن بر روی فایل، با فرمت خاصی نوشته شده سپس با همان فرمت خوانده شوند (

کاراکتری، عددی، رشته ای ).

-4 داده ها به شکل ساختمان (رکورد) بر روی فایل نوشته شده سپس بصورت ساختمان از فایل خوانده

شوند.

انواع فایل از نظر نوع اطلاعات

داده ها ممکن است در فایل به دو صورت ذخیره شوند:

VC++ و C++ ،C فایل ها در زبان برنامه نویسی

Mohsen_mahyar@yahoo.com

.:: 3 ::.

-1 اسکی 1 یا متن

-2 باینری 2

این دو روش ذخیره شدن داده ها، در موارد زیر با یکدگر تفاوت دارند:

-1 تعیین انتهای خط

-2 تعیین انتهای فایل

-3 نحوه ذخیره شدن اعداد بر روی دیسک

در فایل متنی، اعداد به صور ت رشته ای از کاراکترها ذخیره می شوند ولی در فایل باینری اعداد به همان صورتی که در

حافظه قرار می گیرند بر روی دیسک ذخیره می گردند.

به عنوان مثال، در فایل متنی عدد 256 سه بایت را اشغال می کند . زیرا هر رقم آن، به صورت یک کاراکتر در نظر

گرفته می شود . ولی در فا یل باینری این عدد در دو بایت ذخیره می شود. (چون عدد 256 یک عدد صحیح است و

اعداد صحیح در دو بایت ذخیره می شوند).

در فایل متنی کاراکتری که پایان خط را مشخص می کند، در حین ذخیره شدن بر روی دیسک، باید به

تبدیل شود و در حین خوانده شدن، عکس این عمل باید (Carriage Return Line Feed) CR/LF کاراکترهای

باید به کاراکترهای تعیین کننده پایان خط تبدیل شوند و بدیهی است که این CR/LF صورت گیرد : یعنی کاراکترهای

تبدیلات مستلزم صرف وقت است، لذا دسترسی به اطلاعات موجود در فایلهای متنی کندتر از فایل های باینری است.

اختلاف د یگر در فایلهای متنی و باینری در تشخیص انتهای فایل است . در هر دو روش ذخیره فایلها، طول فایل

1A توسط سیستم نگهداری می شود و انتهای فایل با توجه به طول فایل مشخص می گردد . در حالت متنی کاراکتر

به CTRL (در مبنای 16 ) و یا 26 (در مبنای 10 ) مشخص کننده انتهای فایل است . (این کاراکتر با فشار دادن کلید

ایجاد می شود). Z همراه

ASCII 1

Binary 2

VC++ و C++ ،C فایل ها در زبان برنامه نویسی

Mohsen_mahyar@yahoo.com

.:: 4 ::.

می پردازیم: C++ یا C حال به بررسی توابع و دستورات مختلف فایل در زبان

باز کردن فایل

هر فایل قبل از اینکه بتواند مورد استفاده قرار گیرد باید باز شود، مواردی که حین بازکردن فایل مشخص می شود

عبارتند از:

-1 نام فایل

-2 نوع فایل از نظر ذخیره اطلاعات متنی یا باینری

-3 نوع فایل از نظر ورودی -خروجی ( آیا فایل فقط به عنوان ورودی است، آیا فقط به عنوان خروجی

است یا هم به عنوان ورودیست و هم به عنوان خروجی است).

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

گفته می شود . اگر فایل طوری باز شود که فقط عمل خواندن اطلاعات از آن امکان پذیر باشد به چنین فایلی، فایل

ورودی گفته می شود . اگر فایل طوری باز شود که هم عمل نوشتن اطلاعات بر روی آن مجاز باشد و هم عمل خواندن

اطلاعات از آن،به چنین فایلی، ورودی-خروجی گفته می شود.

قرار دارد و به صورت زیر به کار stdio.h استفاده می گردد . این تابع در فایل fopen() برای باز کردن فایل از تابع

می رود.

FILE *fopen (char *filename, *mode)

به رشته ای اشاره می کند که حاوی نام فایل و محل تشکیل یا وجود آن است. filename ، در این الگو

مشخص می کند که فایل چگونه باز شود (ورودی، خروجی و یا ورودی-خروجی). Mode

VC++ و C++ ،C فایل ها در زبان برنامه نویسی

محقق: محمد بشیری

m.bashiry@gmail.com : آدرس پست الکترونیک

http://bashiry.250free.com : آدرس سایت

.:: 5 ::.

قرار داد در جدول زیر به طور کامل آورده شده است: mode مقادیری که می توان به جای عبارت

مفهوم MODE

را به عنوان ورودی باز می کند text فایلی از نوع r(rt)

را به عنوان خروجی باز می کنند text فایلی از نوع w(wt)

فایل را طوری باز می کند که بتوان اطلاعاتی را به آن اضافه کرد. a(at)

فایلی از نوع باینری را به عنوان ورودی باز می کند. rb

فایلی از نوع باینری را به عنوان خروجی باز می کند. wb

ab

فایل موجود از نوع باینری را طوری باز می کند که بتوان اطلاعات را به

انتهای آن اضافه نمود.

را به عنوان ورودی و خروجی باز می کند text فایل موجود از نوع r+(r+t)

را به عنوان ورودی و خروجی باز می کند text فایلی از نوع w+(w+t)

را به عنوان ورودی و خروجی باز می کند text فایل موجود از نوع a+(a+t)

فایل موجود از نوع باینری را به عنوان ورودی و خروجی باز می کند r+b

فایل موجود از نوع باینری را به عنوان ورودی و خروجی باز می کند w+b

a+b

فایل موجود از نوع باینری را به عنوان ورودی و خروجی باز می کند (این

فایل از قبل می تواند وجود داشته باشد).

به مثال ساده زیر توجه کنید:

FILE *fp; // تعریف یک اشاره گر از نوع فایل

fp=fopen("c:/data.txt","rt")

VC++ و C++ ،C فایل ها در زبان برنامه نویسی

Mohsen_mahyar@yahoo.com

 

.:: 6 ::.

و از نوع فقط خواندنی ایجاد می شود. C بر روی درایو txt و با پسوند متنی data در مثال بالا فایلی به نام

برگردانده می شود که می توان به صورت زیر این عمل را NULL اگر فایل مورد نظر در شاخه موجود نباشد اشاره گر

چک نمود:

بستن فایل:

انجام می شود. که fclose() بعد از اینکه برنامه نویس کارش را با فایل تمام کرد باید آن را ببندد . بستن تابع با دستور

دارای الگوی زیر است:

int fclose(FILE *fp)

fclose(p) بسته شود. به عنوا ن مثال دستور fclose() به فایلی اشاره می کند که باید توسط تابع fp ، در الگوی بالا

به آن اشاره می کند می بندد. p فایلی را که

بست. این تابع به صورت زیر به fcloseall() اگر چندین فایل بطور همزمان در برنامه باز باشند می توان آنها را با تابع

کار می رود:

fcloseall();

if ((fp=fopen("A:data.txt","w"))==NULL

{

printf("can not open file \n");

}

VC++ و C++ ،C فایل ها در زبان برنامه نویسی

محقق: محمد بشیری

m.bashiry@gmail.com : آدرس پست الکترونیک

http://bashiry.250free.com : آدرس سایت

.:: 7 ::.

در زیر به برخی از توابعی که در کار با فایل ها مورد استفاده قرار می گیرد آورده شده است:

نام تابع توضیح

fputc() یا Putc()

از این دو تابع برای نوشتن کاراکتر در فایل استفاده می شود.

الگوی تابع:

int putc(int ch, FILE *fp)

مثال:

ch=getchar();

putc(ch,in);

fgetc() یا getc()

برای خواندن کاراکتر ها از فایل استفاده دارد

الگوی تابع:

int getc(FILE *fp)

مثال:

FILE *in;

ch=getc(in);

fputs()

برای نوشتن رشته ها در فایل بکار می رود.

الگوی تابع:

int puts(const char *str, FILE *fp)

fgets()

برای خواندن رشته از فایل کاربرد دارد.

الگوی تابع:

char *fgets(char *str,int length,FILE *fp)

VC++ و C++ ،C فایل ها در زبان برنامه نویسی

Mohsen_mahyar@yahoo.com

.:: 8 ::.

rewind()

بردن موقعیت سنج به ابتدای فایل بدون اینکه بخواهیم فایل را بسته و دوباره

قرار دارد و به صورت زیر است: stdio.h آن را باز کنیم.الگوی این تابع در فایل

void rewind(FILE *fp)

ferror()

در حین انجام کار با فایل ممکن است خطایی رخ دهد . به عنوان مثال عدم

وجود فضای کافی برای ایجاد فایل، آماده نبودن دستگاهی که فایل باید در

آنجا تشکیل گردد و یا مواردی از این قبیل، منجر به بروز خطا می شوند . با

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

قرار دارد و به صورت زیر است: stdio.h در فایل

int ferror(FILE *fp)

remove()

برای حذف فایلهای غیر ضروری می توان از این تابع استفاده کرد.

قرار دارد و به صورت زیر است: stdio.h الگوی این تابع در فایل

int remove(char *filename)

به نام فایلی اشاره می کند که باید ح ذف شود . اگر filename در الگوی فوق

عمل تابع با موفقیت انجام شود مقدار صفر وگرنه مقداری غیر از صفر برگردانده

خواهد شد.

fflush()

انتقال کلیه داده های موجود در بافرها به فایل

قرار دارد و به صورت زیر است: stdio.h الگوی این تابع در فایل

int fflush(FILE *fp)

برگردانده EOF اگر عمل تابع با موفقیت انجام شود مقدار صفر وگرنه مقدار

خواهد شد.

VC++ و C++ ،C فایل ها در زبان برنامه نویسی

Mohsen_mahyar@yahoo.com

 : آدرس سایت

.:: 9 ::.

fprintf()

نوشتن داده ها با فرمت خاصی بر روی فایل

قرار دارد و به صورت زیر است: stdio.h الگوی این تابع در فایل

int fprintf(FILE *fp,"*control_string,…",char arg,…)

مثال:

fprintf(fp,"%c",ch);

fscanf()

خواندن داده با فرمت خاص از فایل مورد نطر

قرار دارد و به صورت زیر است: stdio.h الگوی این تابع در فایل

int fscanf(FILE *fp,"control_string,…",char arg,…)

مثال:

fscanf(fp,"%d",&num);

fwrite()

می باشد اما با این تفاوت که دارای سرعت بیشتری نسبت به fprintf() مانند

می باشد. fprintf()

قرار دارد و به صورت زیر است: stdio.h الگوی این تابع در فایل

int fwrite(void *buffer, int num_byte,int count,FILE *fp)

مثال:

Char table[20];

fwrite(table,sizeof(char),200,fp);

fread()

می باشد اما با این تفاوت که دارای سرعت بیشتری نسبت به fscanf() مانند

آن می باشد.

قرار دارد و به صورت زیر است: stdio.h الگوی این تابع در فایل

int fread(void *buffer, int num_byte,int count,FILE *fp)

VC++ و C++ ،C فایل ها در زبان برنامه نویسی

Mohsen_mahyar@yahoo.com

.:: 10 ::.

مثال:

Char arr[10];

fread(arr,sizeof(char),10,fp);

دسترسی تصادفی به فایل (ورودی-خروجی تصادفی)

مفهوم دستیابی تصادفی به فایل این است که در هرجایی از فایل بتوانیم بنویسیم و از هر جایی از فایل بتوانیم

اطلاعات را بخوانیم . اگر بتوانیم " موقعیت سنج فایل" را به هر جایی که خواستیم، منتقل کنیم، به مفهوم تصادفی فایل

استفاده می شود . الگوی این تابع در فایل fseek() دست می یابیم . برای تغییر مکان موقعیت سنج فایل از تابع

قرار داشته و به صورت زیر می باشد: stdio.h

int fseek (FILE *fp,long num_byte,int origin)

مشخص می شود، origin اساس کار این تابع به این صورت است که با شروع از یک محل در فایل، که توسط پارامتر

تغییر مکان می دهد. یعنی تغییر مکان موقعیت سنج فایل به طور نسبی num_byte موقعیت سنج فایل را به طول

محل 100 فایل origin تعیین می گردد سنجیده می شود . به عنوان مثال اگر origin بوده، نسبت به محلی که توسط

برابر 200 باشد، موقعیت سنج فایل به محل 300 منتقل num_byte را به عنوان مبدا حرکت مشخص کند و طول

می تواند بپذیرد در جدول زیر آورده شده است: origin خواهد شد. مقادیری که

مبدا حرکت نام ماکرویی که بیانگر این مبدا است

SEEK_SET ابتدای فایل

SEEK_CUR موقعیت فعلی فایل

SEEK_END انتهای فایل

VC++ و C++ ،C فایل ها در زبان برنامه نویسی

Mohsen_mahyar@yahoo.com

.:: 11 ::.

آورده شده است: MSDN VC++ توابع زیر از

Visual C++

: ftell() تابع

stdio.h را بر می گرداند. الگوی این تابع در فایل File Pointer کار این تابع موقعیت فعلی اشاره گر فایل یا همان

قرار دارد و به صورت زیر می باشد:

long ftell( FILE *stream );

مثال:

موقعیت اشاره ftell() باز می کند و 100 کاراکتر از آن فایل را می خواند. تابع FTELL.C این برنامه یک فایل با نام

گر فایل را شناسایی کرده و موقعیت آنرا به ما می دهد که در نهایت عدد 100 به عنوان خروجی به ما داده می شود.

#include <stdio.h>

FILE *stream;

void main( void )

{

long position;

char list[100];

if( (stream = fopen( "ftell.c", "rb" )) != NULL )

{

/* Move the pointer by reading data: */

fread( list, sizeof( char ), 100, stream );

/* Get position after read: */

position = ftell( stream );

printf( "Position after trying to read 100 bytes: %ld\n",position );

fclose( stream );

}

}

Output

Position after trying to read 100 bytes: 100

VC++ و C++ ،C فایل ها در زبان برنامه نویسی

Mohsen_mahyar@yahoo.com

.:: 12 ::.

_wopen() ، _open() تابع

کار دو تابع فوق باز کردن فایل می باشد.

الگوی آنها به صورت زیر می باشد:

int _open( const char *filename, int oflag [, int pmode] );

int _wopen( const wchar_t *filename, int oflag [, int pmode] );

می باشد. wchar.h و یا io.h در _wopen() و تابع ، io.h در _open() تابع

مقادیر برگشتی این توابع:

خطا دارای مقادیر زیر بسته به نوع خطا می باشد: case این تابع ها عدد 1- را در صورت بروز خطا بر می گرداند که

مقدار برگشتی توضیح

سعی بر نوشتن بر روی فایل فقط خواندنی یا فایلهای به اشتراک گذاشته EACCES

ای که کاربر اجازه تغییر در آنها را نداشته باشد و یا اینکه مسیر داده شده

یک پوشه یا دایرکتوری باشد.

این فایل با این نام قبلا وجود دارد. EEXIST

pmode یا oflag اشتباه بودن آرگومانهای EINVAL

تعداد فایل های باز بسیار بسیار زیاد است. EMFILE

پیدا نشدن فایل یا مسیر مورد نظر ENOENT

VC++ و C++ ،C فایل ها در زبان برنامه نویسی

Mohsen_mahyar@yahoo.com

 

.:: 13 ::.

یک عبارت عددی است که دارای مقادیر ثابت طبق جدول زیر می باشد: oflag() آرگومان

قرار دارد. FCNTL.H ترکیبات جدول زیر در

مقدار برگشتی توضیح

قبل از هرگونه عملیات نوشتنی بر روی فایل اشاره گر فایل را _O_APPEND

به انتهای آن می برد.

فایل را در حالت باینری باز می کند. _O_BINARY

ایجاد کردن و باز کردن یک فایل جدید برای نوشتن. اگر _O_CREAT

فایل قبلا موجود باشد تفاوتی نمی کند. در این حالت ویژه

قرار می دهیم. _O_CREAT را برابر pmode آرگومان

در صورتی که نتوانیم قسمتی از حافظه را پاک کنیم برای ما _O_CREAT | _O_SHORT_LIVED

یک فایل موقت ایجاد می کند. در این حالت خاص آرگومان

قرار می دهیم. _O_CREAT را برابر pmode

هنگامی که آخرین فایل بسته شد فایل حذف می گردد. _O_CREAT | _O_TEMPORARY

را برابر pmode در این حالت خاص آرگومان

قرار می دهیم. _O_CREAT

اگر نام فایل وجود داشته باشد مقدار خطا را بر می گرداند و _O_CREAT | _O_EXCL

همراه باشد. _O_CREAT باید با

دسترسی اولیه تصادفی به دیسک _O_RANDOM

فایل را به صورت فقط خواندنی باز می کند _O_RDONLY

و _O_RDONLY این آرگومان با فلگ های

استفاده نمی شود. _O_WRONLY

VC++ و C++ ،C فایل ها در زبان برنامه نویسی

Mohsen_mahyar@yahoo.com

.:: 14 ::.

باز کردن فایل به صورت خواندنی- نوشتنی _O_RDWR

و _O_RDONLY این آرگومان با فلگ های

استفاده نمی شود. _O_WRONLY

دسترسی اولیه ترتیبی به دیسک _O_SEQUENTIAL

باز کردن فایل متنی _O_TEXT

حذف کردن اطلاعات در فایل تا اندازه آن فایل به صفر _O_TRUNC

برسد. فایل مورد نظر باید اجازه نوشتن بر روی آن داده شده

باشد و محافظت شده نباشد.

_O_RDONLY : فلگی که نمی توان استفاده کرد

برای باز کردن یک _O_CREAT با _O_TRUNC

فایل موجود و یا ایجاد یک فایل جدید به کار می رود.

باز کردن فایل به صورت فقط نوشتنی. _O_WRONLY

با دو فلگ زیر استفاده نمی شود:

_O_WRONLY یا _O_RDWR

در ضمن یک مقدار مشخصی برای دسترسی وجود ندارد.

pmode ، آمده باشد. اگر فایل از قبل موجود بود _O_CREAT فقط هنگامی به کار می رود که pmode() آرگومان

اجازه تنظیمات مختلف فایل را به ما می هد. ، pmode چشم پوشی می شود در غیر اینصورت

مجوز فقط خواندن : S_IREAD

مجوز نوشتن ( اجازه موثر و کارا برای خواندن و نوشتن) : _S_IWRITE

VC++ و C++ ،C فایل ها در زبان برنامه نویسی

Mohsen_mahyar@yahoo.com

 

.:: 15 ::.

مجوز نوشتن و خواندن : _S_IREAD | _S_IWRITE

برای روشن تر شدن مطلب به مثال زیر توجه کنید:

برای ورودی و یک فایل با نام OPEN.C می پردازد. یک فایل با نام _open این مثال به توضیح کاربرد دستور

برای خروجی در نظر گرفته شده است. سپس فایلها بسته می شوند. OPEN.OUT

Example

/* OPEN.C: This program uses _open to open a file

* named OPEN.C for input and a file named OPEN.OUT

* for output. The files are then closed.

*/

#include <fcntl.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <io.h>

#include <stdio.h>

void main( void )

{

int fh1, fh2;

fh1 = _open( "OPEN.C", _O_RDONLY );

if( fh1 == -1 )

perror( "open failed on input file" );

else

{

printf( "open succeeded on input file\n" );

_close( fh1 );

}

fh2 = _open( "OPEN.OUT", _O_WRONLY | _O_CREAT, _S_IREAD | _S_IWRITE );

if( fh2 == -1 )

perror( "Open failed on output file" );

else

{

printf( "Open succeeded on output file\n" );

_close( fh2 );

}

}

Output

Open succeeded on input file

Open succeeded on output file

VC++ و C++ ،C فایل ها در زبان برنامه نویسی

Mohsen_mahyar@yahoo.com

.:: 16 ::.

_close() تابع

قرار دارد: io.h از این تابع برای بستن فایل استفاده می شود. الگوی این تابع به صورت زیر است و در

int _close( int handle );

بعد از اجرای این این تابع اگر مقدار صفر برگردانده شود به مفهوم این می باشد که فایل بسته شده در غیر اینصورت

تنظیم می شود. EBADF به errno

به مثال زیر توجه نمایید:

برای ورودی و یک فایل با نام OPEN.C می پردازد. یک فایل با نام _close این مثال به توضیح کاربرد دستور

برای خروجی در نظر گرفته شده است. سپس فایلها بسته می شوند. OPEN.OUT

#include <fcntl.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <io.h>

#include <stdio.h>

void main( void )

{

int fh1, fh2;

fh1 = _open( "OPEN.C", _O_RDONLY );

if( fh1 == -1 )

perror( "open failed on input file" );

else

{

printf( "open succeeded on input file\n" );

_close( fh1 );

}

fh2 = _open( "OPEN.OUT", _O_WRONLY | _O_CREAT, _S_IREAD |

_S_IWRITE );

if( fh2 == -1 )

perror( "Open failed on output file" );

else

{

printf( "Open succeeded on output file\n" );

_close( fh2 );

}

}

Output

Open succeeded on input file

Open succeeded on output file

VC++ و C++ ،C فایل ها در زبان برنامه نویسی

Mohsen_mahyar@yahoo.com

.:: 17 ::.

_lseek, _lseeki توابع 64

حرکت دادن موقعیت سنج فایل به یک محل خاص (دلخواه)

قرار دارند: io.h الگوی این توابع به صورت زیر می باشد و در

long _lseek( int handle, long offset, int origin );

__int64 _lseeki64( int handle, __int64 offset, int origin );

از موقعیت جدید از ابندای فایل می باشد. long در قالب _lseek() مقدار برگشتی

یک عدد 64 بیتی می باشد. _lseeki مقدار برگشتی 64

-1 را بر می گرداند. L در صورت بروز خطا تابع مقدار

توضیحات مربوط به این دستور قبلا توضیح داده شده است که در این قسمت از یادآوری مجدد آن پرهیز می کنیم.

می تواند بگیرد آورده شده است: orogin در جدول زیر مقادیری را که

مبدا حرکت نام ماکرویی که بیانگر این مبدا است

SEEK_SET ابتدای فایل

SEEK_CUR موقعیت فعلی فایل

SEEK_END انتهای فایل

به مثال زیر توجه نمایید.

VC++ و C++ ،C فایل ها در زبان برنامه نویسی

Mohsen_mahyar@yahoo.com

.:: 18 ::.

Example

/* LSEEK.C: This program first opens a file named LSEEK.C.

* It then uses _lseek to find the beginning of the file,

* to find the current position in the file, and to find

* the end of the file.

*/

#include <io.h>

#include <fcntl.h>

#include <stdlib.h>

#include <stdio.h>

void main( void )

{

int fh;

long pos; /* Position of file pointer */

char buffer[10];

fh = _open( "lseek.c", _O_RDONLY );

/* Seek the beginning of the file: */

pos = _lseek( fh, 0L, SEEK_SET );

if( pos == -1L )

perror( "_lseek to beginning failed" );

else

printf( "Position for beginning of file seek = %ld\n", pos );

/* Move file pointer a little */

_read( fh, buffer, 10 );

/* Find current position: */

pos = _lseek( fh, 0L, SEEK_CUR );

if( pos == -1L )

perror( "_lseek to current position failed" );

else

printf( "Position for current position seek = %ld\n", pos );

/* Set the end of the file: */

pos = _lseek( fh, 0L, SEEK_END );

if( pos == -1L )

perror( "_lseek to end failed" );

else

printf( "Position for end of file seek = %ld\n", pos );

_close( fh );

}

Output

Position for beginning of file seek = 0

Position for current position seek = 10

Position for end of file seek = 1207

VC++ و C++ ،C فایل ها در زبان برنامه نویسی

Mohsen_mahyar@yahoo.com

.:: 19 ::.

_read() تابع

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

قرار دارد. io.h الگوی آن به صورت زیر است و در

int _read( int handle, void *buffer, unsigned int count );

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

برای درک بهتر این تابع به مثال زیر توجه کنید:

/* READ.C: This program opens a file named

* READ.C and tries to read 60,000 bytes from

* that file using _read. It then displays the

* actual number of bytes read from READ.C.

*/

#include <fcntl.h> /* Needed only for _O_RDWR definition */

#include <io.h>

#include <stdlib.h>

#include <stdio.h>

char buffer[60000];

void main( void )

{

int fh;

unsigned int nbytes = 60000, bytesread;

/* Open file for input: */

if( (fh = _open( "read.c", _O_RDONLY )) == -1 )

{

perror( "open failed on input file" );

exit( 1 );

}

/* Read in input: */

if( ( bytesread = _read( fh, buffer, nbytes ) ) <= 0 )

perror( "Problem reading file" );

else

printf( "Read %u bytes from file\n", bytesread );

_close( fh );

}

Output

Read 775 bytes from file

VC++ و C++ ،C فایل ها در زبان برنامه نویسی

Mohsen_mahyar@yahoo.com

.:: 20 ::.

_write() تابع

با استفاده از این تابع می توان اطلاعات را در فایل نوشت.

قرار دارد. io.h الگوی این تابع به شکل زیر می باشد و در

int _write( int handle, const void *buffer, unsigned int count );

اگر عمل نوشتن با موفقیت انجام شود مقدار برگشتی تابع تعداد بایت های نوشته شده خواهد بود.

مثال زیر یک فایل را به عنوان خروجی باز می کند و با استفاده از این تابع بایت هایی را در آن می نویسد.

Example

/* WRITE.C: This program opens a file for output

* and uses _write to write some bytes to the file.

*/

#include <io.h>

#include <stdio.h>

#include <stdlib.h>

#include <fcntl.h>

#include <sys/types.h>

#include <sys/stat.h>

char buffer[] = "This is a test of '_write' function";

void main( void )

{

int fh;

unsigned byteswritten;

if( (fh = _open( "write.o", _O_RDWR | _O_CREAT,

_S_IREAD | _S_IWRITE )) != -1 )

{

if(( byteswritten = _write( fh, buffer, sizeof( buffer ))) == -1 )

perror( "Write failed" );

else

printf( "Wrote %u bytes to file\n", byteswritten );

_close( fh );

}

}

Output

Wrote 36 bytes to file

Mohsen_mahyar@yahoo.com

 

   + MOHSEN GHASEMI - ۸:۱٠ ‎ق.ظ ; ۱۳۸٩/۳/٢٧