310 likes | 458 Views
دستور های ورودی-خروجی بر اساس استفاده از فايل. File-based Input and Output. مقدمه. تاکنون در تمام دستورهای ورودی و خروجی از “*” استفاده می شد استفاده از “*” به معنی ورودی و خروجی اطلاعات از و يا به تجهيزات پيش فزض است در بسياری از موارد اينکار مناسب، پسنديده و يا امکان پذير نيست
E N D
دستور های ورودی-خروجی بر اساس استفاده از فايل File-based Input and Output دستورهای خروجی بر اساس فايل عباسپور
مقدمه • تاکنون در تمام دستورهای ورودی و خروجی از “*” استفاده می شد • استفاده از “*” به معنی ورودی و خروجی اطلاعات از و يا به تجهيزات پيش فزض است • در بسياری از موارد اينکار مناسب، پسنديده و يا امکان پذير نيست • ذخيره موقتی اطلاعات (intermediate results) • ذخيره مقدار متنابهی از اطلاعات • موقعی که خروجی يک برنامه موردنياز برای برنامه ديگر باشد • موقعی که اطلاعات خاصی به صورت تکراری مورد نياز باشد دستورهای خروجی بر اساس فايل عباسپور
جهت ذخيره سازی اطلاعات از فايل هايي شبيه source file می توان استفاده کرد • با استفاده از دستور FORMAT می توان به شکل دلخواهی اطلاعات را وارد نمود • نام فايل را می توان با هر extension انتخاب تا توسط نرم افزار ديگری قابل باز خوانی باشد. • فايلها به صورت Text هستند لذا با هر Editor مثل کامپايلر فرترن، MS Word و غيره قابل edit شدن هستند • در برنامه هادسترسی به اين فايلها از طريق واحد های ورودی و خروجی Unit امکان پذير می شود • به هر فايل يک شماره Unit Number می توان اختصاص داد • لذا هر فايل در برنامه با آن شماره شناخته می شود • در فرترن اين شماره می تواند از 1 تا 100 باشد. دستورهای خروجی بر اساس فايل عباسپور
شماره واحد Unit Number • برای دسترسی به يک فايل در داخل برنامه • درواقع هر شماره، کانالی است که برنامه را به يک فايل يا يکی از تجهيزات جانبی متصل می کند • UN می تواند يک INTEGER و يا يک عبارت محاسباتی با خروجی INTEGER باشد • علامت “ * “ که مربوط به واحد های پيش فرض ( صفحه کليد و مونيتور) است • بعضی از شماره ها به صورت پيش فرض به تجهيزات خاص اختصاص می يابد مثلاً 5 و 6 برای صفحه کليد و مونيتور ويا شماره 10 در سيستم های UNIX برای فايلی به نام fort10 اختصاص می يابد دستورهای خروجی بر اساس فايل عباسپور
برای نوشتن در يک فايل و خواندن از يک فايل بايد از دستور WRITE و READ استفاده نمود • هر فايلی که در برنامه مورد استفاده واقع می شود بايد توسط دستور OPEN باز و در اختيار برنامه قرار گيرد • فرم کلی READ برای فايل: READ (clist) [I/O list] Clist عبارت از: [UNIT=] unit-number, [FMT=] format-spec [,REC= record-number] [,IOSTAT=ios] [,ADVANCE=adv] [,SIZE=integer-variable] [,EOR=label] [,END=label] [,ERR=label] دستورهای خروجی بر اساس فايل عباسپور
مثال READ *,I,J از صفحه کليد READ *,LINE از صفحه کليد READ (*,*) A,B,C از صفحه کليد READ (5,*) LINE از صفحه کليد READ (5,100) X, Y, Z از صفحه کليد با فورمت 100 READ (UNIT=10,FMT=100,ERR=10,IOSTAT=ios) از فايل 10 با فورمت 100 در اخر اگر خطايي در خواندن باشد کنترل به دستور شماره 10 می رود و متغير ios يک مقدار مثبت (بسته به سيستم) می گيرد، اگر خواندن با موفقيت انجام شود ios مقدار صفر می گيرد در اين دستور حتما اول UNIT و سپس FMT آورده می شود. بقيه موارد اختياری هستند دستورهای خروجی بر اساس فايل عباسپور
دستور خروجی WRITE (clist) [I/O list] where clist is defined as [UNIT=] unit-number, [FMT=] format-spec [,REC= record-number] [,IOSTAT=ios] [ADVANCE=adv] [,SIZE=integer-variable] [,EOR=label] [,ERR=label] دستورهای خروجی بر اساس فايل عباسپور
مثال PRINT*, I,J بر روی مونيتور WRITE (*,*) I,J بر روی مونيتور WRITE (6,*) I,J بر روی مونيتور WRITE (6,100) I بر روی مونيتوربا فورمت 100 WRITE (6,*,ERR=10) LINE WRITE (UNIT=file1,FMT=100,REC=recordnumber, ERR=10) newline دستورهای خروجی بر اساس فايل عباسپور
دستور OPEN • برای باز کردن و در اختيار برنامه گرفتن فايل ها • فرم کلی: OPEN (u, [olist] ) u: شماره اختصاص داده شده به فايل در دستور های ورودی و خروجی استفاده می شود WRITE (u,*) variables list Olist تعدادی لغات کليدی که وضعيت فايل را مشخص می کنند : OPEN(10) OPEN (UNIT=10) OPEN (UNIT=IFILE) OPEN (15, FILE=“output.test”) دستورهای خروجی بر اساس فايل عباسپور
لغات کليدی در Olist 1- STATUS= st St: می تواند يکی از حالت های زير را به خود بگيرد Old: • برای فايل هايي که قبلا ايجاد شده اند • برای فايل های ورودی Input file • اگر در لحظه اجرای دستور open موجود نباشند پيام خطا صادر می شود NEW: • برای فايل هايي که قبلاً وجود ندارند • با اجرای اين دستور يک فايل جديد ايجاد می گردد • اگر در لحظه اجرا فايلی با اين نام باشد پيام خطا صادر می شود دستورهای خروجی بر اساس فايل عباسپور
REPLACE: • اگر فايلی از قبل با اين نام موجود باشدآن را Delete و فايل جديدی با همان نام ايجاد می کند • اطلاعات قبلی بر روی اين فايل از بين می رود ُSCRATCH: • در اين حالت وقتی دستور Close اجرا شود فايل حذف می شود • برای استفاده موقتی از اطلاعات در داخل برنامه UNKNOWN: • برای فايل های خروجی بکار می رود • اگر از قبل موجود باشد آنرا باز کرده و اگر موجود نباشد آنرا ايجاد و باز خواهد کرد دستورهای خروجی بر اساس فايل عباسپور
2- ERR= Label • همانطور که قبلاًً اشاره شد اگر در هنگام باز کردن فايل خطايي بروز کند کنترل به دستور با شماره Label می رود 3- IOSTAT=ivar • در ارتباط با دستور ERR=Label می باشد. اگر در موقع باز کردن فايل خطايي بروز کند ivar به صورت زير مقدار می گيرد • اگر خطا بروز کند مقدار مثبت می گيرد • وقتی به انتهای فايل يا آخرين رکورد برسد مقداری منفی می گيرد • اگر دستور موفقيت آميز اجرا شود مقدار صفر دستورهای خروجی بر اساس فايل عباسپور
مثال هايي از دستور OPEN OPEN (UNIT=10,FILE=‘data.out') OPEN (UNIT=11,FILE=‘data1.xls', & STATUS='NEW',ERR=10) ....... 10 CONTINUE WRITE(6,*) 'Error opening file: data1.xls' OPEN (UNIT=12, FILE='student.records', STATUS='OLD', & ERR=20) ........ 20 CONTINUE IF (ERR >= 0) THEN WRITE (6,*) 'Error opening file: student.records.' ENDIF STOP دستورهای خروجی بر اساس فايل عباسپور
دستور بستن فايل ها Close • با اين دستور اتصال برنامه با فايل مورد نظر در حين اجرای برنامه و يا در انتهای برنامه قطع می گردد. • می توان با دستور Open ارتباط برنامه را با فايل ديگر و يا با همين فايل ولی با Option های ديگر بر قرار کرد • اگر فايلی با دستور Close بسته شود و برنامه به هر دليلی قطع گردد اطلاعات موجود در فايل حفظ می شود • فرم کلی: Close ([Unit=Unit_number], [ERR=label], & [STATUS=st]) St: می تواند Keep و يا Delete باشد. فايلی که به صورت SCRATCH باز شده است نمی تواند مقدار keep بگيرد دستورهای خروجی بر اساس فايل عباسپور
مثال دستور Close CLOSE (10) CLOSE (UNIT=10, ERR=10) CLOSE (UNIT=NUNIT, STATUS='DELETE', & ERR=10) دستورهای خروجی بر اساس فايل عباسپور
دستور های • REWIND • برگشت به اول رکورد در يک فايل • BACKSPACE • برگشت به يک رکورد قبل • INCLUDE filename • برای فايل هايي که حالت ورودی و خروجی ندارند • حاوی عمدتاًً دستورات اعلان و ديگر دستورات غير اجرايي هستند دستورهای خروجی بر اساس فايل عباسپور
مثال OPEN (UNIT=7, FILE=“test”, STATUS=“new”, IOSTAT& =m1, ERR=88) a=12.0; b=13.5 c=14.7 WRITE (7,1) a, b, c 1 FORMAT (1x, 3f5.1) CLOSE (UNIT=7, STATUS=“keep”, IOSTAT =m2, & ERR=99) WRITE (*,2) 2 FORMAT (//, “file written successfully”) STOP 88 WRITE (6,3) m1 3 FORMAT (“Had trouble opening file, error code:”,I12) STOP 99 WRITE (6,4) m2 4 FORMAT (“Had trouble closing file, error code:”,I12) END دستورهای خروجی بر اساس فايل عباسپور
با اجرای برنامه فايل test ايجاد می شود • پس از اجرای برنامه در دايرکتوری اين فايل مشاهده خواهد شد • اگر مجدداً برنامه را اجرا کنيد کنترل به دستور 88 می رود چون فايل test وجود دارد • اگر در دستور CLOSE به جای keep از delete استفاده شود برنامه با مشکل مواجه نمی گردد • اگر در دستور OPEN به جای NEW از Unknown استفاده شود چه تغييری حاصل می شود؟؟؟؟؟؟؟؟ دستورهای خروجی بر اساس فايل عباسپور
فایل پردازی در C File based Programming in C دستورهای خروجی بر اساس فايل عباسپور
انواع فایل • دودویی (باینری) • سرعت بالا (در مقایسه با پرینت) • حجم کمتر • امکان دسترسی تصادفی • حفظ امنیت داده ها • متنی • امکان باز کردن در برنامه های ویرایش متنی مختلف • داده ها به دلخواه برنامه نویس مرتب می شوند • برای چاپ اطلاعات دستورهای خروجی بر اساس فايل عباسپور
نحوه دستیابی به فایل ها • دستیابی به یک فایل از طریق مراحل زیر • تعریف یک متغیر برای فایل • باز کردن فایل • خواندن و یا نوشتن در فایل • بستن فایل دستورهای خروجی بر اساس فايل عباسپور
تعریف فایل • استفاده از نوع داده ای به نام FILE • نوعی ساختار (زیر برنامه) است • در فایل سرآمد stdio.h • اطلاعات موجود در ساختار FILE : • نام خارجی فایل (نام فایل در سیستم عامل) • نوع فایل (ورودی، خروجی، دودویی، متنی) • ادرس محل واسط بین برنامه و فایل • اشاره گر مکان فعلی فایل • وضعیت خطا ها در خواندن و نوشتن دستورهای خروجی بر اساس فايل عباسپور
مراحل استفاده از فایل در برنامه • تعریف یک متغیر از نوع اشاره گر به ساختار فایل • مثال: FILE *inputFile; با این دستور متغیر inputFile که از نوع اشاره گر است به ساختار FILE تعریف می کند توجه: ازعملگر * برای تعریف اشاره گر استفاده می شود دستورهای خروجی بر اساس فايل عباسپور
2- باز کردن فایل • استفاده از تابع fopen : FILE* fopen (char fileName[ ], char [ ]); ارگومان این تابع حاوی دو رشته نویسه ای بعنوان پارامتر های ورودی است و یک اشاره گر به فایل را بعنوان خروجی باز می گرداند fileName رشته نویسه ای است که نام خارجی فایل را مشخص می کند. این رشته می تواند علاوه بر نام فایل مسیر فایل را نیز مشخص کند مثال: “C:\\myletters\\letter.txt” به علامت\\ توجه شود!!! دستورهای خروجی بر اساس فايل عباسپور
پارامتر mode در تابع fopen • رشته نویسه ای که نحوه باز کردن فایل را نشان می دهد • متشکل از دو بخش • بخش اول تعیین کننده عملیات قابل اجرا بر روی فایل (خواندن و یا نوشتن) • بخش دوم تعیین کننده نوع فایل است (باینری b و متنی t ). پیش فرض t است (متنی) دستورهای خروجی بر اساس فايل عباسپور
مثال باز کردن فایل FILE *inputFile; inputFile=fopen (“letter.txt”, “rt”); در این مثال فایل letter.txt بصورت متنی برای خواند باز می شود. حال می توان با استفاده از inputfile داده هایی را از این فایل خواند مثال: FILE *itemFile; itemFile=fopen (“C:\\data\\items”, “w+t”); دستورهای خروجی بر اساس فايل عباسپور
3- بستن فایل • استفاده از تابع fclose • بستن از طریق اشاره گر تعریف شده برای آن صورت می گیرد FILE *inputFile; ……… ………. fclose (inputFile); • اگر فایل بسته نشود پس از خاتمه برنامه خود بخود بسته می شود. • اگر برنامه به هر دلیلی قطع شود اطلاعات آن ممکن است ناقص و یا دچار اشکال شود دستورهای خروجی بر اساس فايل عباسپور
4- ورودی و خروجی از فایل (خواندن و نوشتن) • نوشتن بر روی فایل • استفاده از تابع fprintf با فرم کلی زیر fprintf (<file-pointer>,<control string>,<variable-list>); مثال: FILE *outPut; outPut=fopen (“data.txt”, “wt”); fprintf(outPut, " %d\n",grade); دستورهای خروجی بر اساس فايل عباسپور
مثال نوشتن # include <stdio.h> void main() { FILE *outFile; int i, n,sum; outFile= fopen ("sales.txt","wt"); if (!outFile) { printf("can't open file"); return; } printf("enter the upper limit") ; scanf("%d", &n); sum=0; for (i=0;i<=n ; i++){ sum=sum+i fprintf(outFile, " %d\n",sum); } fclose (outFile); } این برنامه میزان فروش شرکتی را در طی سال از طریق صفحه کلید دریافت و در یک فایل ذخیره می کند دستورهای خروجی بر اساس فايل عباسپور
خواندن • خواندن از روی فایل • استفاده از تابع fscanf با فرم کلی زیر fscanf (<file-pointer>,<control string>,<variable-addres-list>); دستورهای خروجی بر اساس فايل عباسپور
مثال خواندن # include <stdio.h> void main() { FILE *inFile; int sales, counter=0; float average=0.0 inFile= fopen ("sales.txt",“rt"); if (!inFile) { printf("can't open file"); return; } printf(“calculation of average sale") ; while (!feof (inFile)) { average+=sales; counter++; fscanf(inFile,"%d", &sales); } fclose (inFile); average/=counter; printf (“average= %f”, average); } اگر فایل موجود نباشد اجرا می شود تابع feof دارای ارگومانی از نوع اشاره گر به فایل است در صورتی که اشاره گر به انتهای فایل برسد مقدار درست (غیر صفر) و در غیر اینصورت مقدار نادرست (صفر) را باز می گرداند دستورهای خروجی بر اساس فايل عباسپور