ParsX.com
پذیرش پروژه از دانشجویی ... تا سازمانی 09376225339
 
   ProfileProfile   Log in to check your private messagesLog in to check your private messages  |  FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups Log inLog in   RegisterRegister 

فایل ها در C :

 
Post new topic   Reply to topic    ParsX.com Forum Index -> C/C++ Programming
View previous topic :: View next topic  
Author Message
arash
مدير بخش سي
مدير بخش سي


Joined: 27 Nov 2004
Posts: 1232
Location: www.parsx.com

PostPosted: Fri May 06, 2005 9:29 pm    Post subject: فایل ها در C : Reply with quote

فایل ها در C :
اولین مبحثی که در فایلها مهم می باشد باز کردن فایل ها می باشد . برای باز کردن ابتدا تغییری از نوع فایل را باید تعریف کنیم . برای تعریف یک متغییر از نوع فایل از دستور FILE استفاده می کنیم .
مثال :
FILE *p;

نکته Exclamation:
حروف FILE باید بزرگ نوشته شود ( capital letter )


نکته Exclamation:
متغییری که از نوع فایل تعریف شده باید به شکل اشاره گر تعریف شود .

پس از اینکه یک متغییر از نوع فایل تعریف کردیم باید فایل را باز کنیم .برای باز کردن یک فایل از دستور fopen استفاده می شود . و شکل دستوری آن به شکل زیر است :
p=fopen("نوع باز کردن ","نام فایل");
p=fopen("sts.dat","rt");
fp=fopen("d:text.dft","w");

نام فایل :
نام فایل به معنای آن است که فایل را می خواهیم در کدام دایرکتوری باز کنیم . برای مثال اگر مقدار c:\\text.txt را بدهیم به سراغ یک فایل در دایرکتوری C به نام text که پسوند آن txt می باشد می رود .
برای راحتی کار از فایلهایی با پسوند dat استفاده می شود.
نکتهExclamation:
بهتر است فایل ها را با پسوند dat باز کنیم .
نوع باز کردن فایل:
فایل با چند نوع مختلف می توان باز کرد که این انواع عبارتند از :

دسته اول از نوع text می باشد ( به مفهوم دیگر وقتی فایل به صورت text باز شود می توانیم محتویات فایل را خودمان نیز ببینیم اگر فایل را با Notepad باز کنیم )
r و یا rt که فایل را به عنوان ورودی باز میکند .
نکته Exclamation:
قبلا باید فایل را ساخته شده باشد و گرنه در اشاره گر به فایل (p) مقدار NULL قرار می گیرد
w یا wt که فایل را به عنوان خروجی باز می کند .
نکته Exclamation:
اگر فایل موجود نباشد ساخته می شود و اگر فایل وجود داشته باشد تمام اطلاعات قبلی آن پاک می شود .
a یا at که فایلی از نوع text را طوری باز می کند که بتوان اطلاعات را به انتهای آن اضافه کرد.
نکته Exclamation:
اگر فایل موجود نباشد ساخته می شود .
(r + ( r + t که فایل را در صورتی که وجود داشته باشد از نوع text به صورت ورودی و خروجی باز می کند
(w + ( w + t که فایل از نوع text به صورت ورودی و خروجی باز می کند . و در صورتی که موجود نباشد آنرا می سازد .

دسته دوم باز کردن فایل از نوع باینری می باشد:
rb که یک فایل باینری را به عنوان ورودی باز می کند( در صورتی که فایل موجود نباشد عدد صفر بر می گرداند)
rw که یک فایل باینری را به عنوان خروجی باز می کند . ( محتویات فایل را در صورت وجود پاک می کند و در صورت موجود نبودن آنرا می سازد )
ab فایل را در صورت وجود طوری به صورت باینری باز می کند که بتوان را به آخر آن اضافه کرد و در صورت اینکه فایل موجود نباشد عدد صفر بر می گرداند
r+b فایل را در صورت وجود از نوع ورودی خروجی به صورت باینری باز می کند
w+b فایل را به صورت ورودی خروجی از نوع باینری باز می کند
a+b فایل را از نوع باینری باز می کند به صورت ورودی خروجی ( فایل می تواند قبلا موجود باشد )

نکتهExclamation:
یکی از فرمت های بسیار مهم فرمت +r می باشد که باعث می شود که تا بتوان بروی مقادیر قبلی که در فایل ذخیره شده اند دوباره نوشت .
بستن فایل :
پس از اینکه هر فایل را با فرمت مورد نظر باز کردیم و کار که می خواهیم انجام دادیم باید فایل را ببندیم . این کار را می توان با دو دستور انجام داد .
اول با fclsoe که به فرمت زیر انجام می شود
fclose(اسم فایل);
برای مثال :
fclose(fp);

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

رفتن به اول فایل ( بستن و باز کردن مجدد ) :
برای این که به اول فایل برویم از دستور rewind استفاده می شود .
rewind(fp);

پاک کردن یک فایل از روی فایل :
برای پاک کردن یک فایل از روی هارد از دستور remove استفاده می شود .
remove("c:\\text.txt");

نکتهExclamation:
در صورتی که نام دایکتوری ذکر نشود برنامه به دنبال فایل در دایکتوری جاری می گردد.
نکتهExclamation:
در صورتی که بخواهیم در یک دایرکتوری خاص فایل را باز کنیم به جای \ باید از \\ استفاده کنیم
خواندن و نوشتن در فایل :
کاراکتر به کاراکتر :
اگر بخواهید به صورت کاراکتر به کاراکتر در فایل بنویسیم و یا از آن بخوانیم از توابع getc و putc به شکل زیر استفاده می کنیم :
ch=getc(fp);
putc(ch,fp);

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

رشته به رشته :
برای نوشتن در فایل به شکل رشته ای از توابع gets و puts استفاده کرد . استفاده از این توابع به شکل زیر است :
int  int_length=79 , int_i;
char ch,str[10],str1;
FILE *fp;
 
int_i = fputs(str,fp);
fgets(str1 , int_length , fp);

نوشتن همراه با فرمت :
برای این که با فرمت خاصی بنویسیم از توابع fprintf برای نوشتن و از تابع fscanf برای خواندن استفاده می شود . (منظور از فرمت خاص مثلا با چند فاصله مقدار parsx را در فایل بنویسیم به شکل زیر عمل می کنیم : )
char str[20];
strcpy(str,"parsx");
strcat(str,0);
fprintf(fp,"  >    %s  <    ",str);
fscanf(fp, "%s",str);
   printf("\n%s",str);

خروجی برنامه بالا به شکل زیر می باشد :
  >    parsx  <   

نکتهExclamation:
فرمت قابل استفاده در این دو تابع را دقیقا مانند prinft و scanf است.

نوشتن به شکل رکورد به رکورد :
برای اینکه رکوردی مانند r را از نوع استراکچر struckt در فایل بنویسیم از دستور fwrite و برای خواندن از fread استفاده می کنیم .
stuct struckt{
      int i;
      char name[20];
      }r;
r.i=0;
strcpy(r.name,"parsx");
strcat(r.name,0)
fwrite(&r,sizeof(struct struckt),1,fp);
fread(&r,sizeof(struct struckt),1,fp);
نکته Exclamation:
در اینجا عدد 1 بافر می باشد و به ساختمان داده یا متغییر اشاره می کند که داده خوانده شده از فایل باید در آن قرار گیرند و این پارامتر در تابع fwrite به محلی اشاره می کند که داده های موجود در آن محل باید در فایل نوشته شوند . عدد 1 در هر دو تابع طول داده ای را مشخص می کند که باید خوانده یا نوشته شود .

تشخیص انتهای فایل :
برای تشخیص انتهای فایل می توان از دستور feof(fp) استفاده کرد . وقتی که به اتهای فایل می رسیم این تابع مقدار 0 را بر می گرداند .
در ضمن تابع fwrite و fread وقتی به انتهای فایل می رسند مقدار 0 بر می گردانند .

دسترسی تصادفی به فایل :
برای اینکه در فایل مقادیر را تغییر داد باید بتوان در آن حرکت کرد. برای اینکه در فایل به مقدار مشخصی حرکت کنیم از دستور fseek استفاده می کنیم .
 fseek(fp,حرکت به این مقدار,SEEK_SET);

منظور از SEEK_SET اول فایل می باشد . پس با این دستور اشاره گر به فایل به مقداری که مشخص کرده ایم از سر فایل جلو می رود. مقادیر دیگری هم می توانیم به جای SEEK_SET قرار دهیم که عبارتند از : SEEK_CUR موقعیت فعلی فایل و SEEK_END انتهای فایل .
نکتهExclamation:
در فایل برگشت به عقب نداریم یعنی نمی توانیم به سمت عقب برویم برای همین مجبوریم از fseek استفاده کنیم.
مثال:اگر در مثال بالا در فایل fp سه رکورد نوشته شود برای اینکه رکورد سوم را تغییر دهیم باید اول فایل را ببندیم و سپس با فرمت+r فایل را باز کنیم سپس به سر رکورد اول برویم و بعد شروع به نوشتن در فایل کنیم
ادامه مثال قبل
fclose(fp);
fp=fopen("d:text.dft","r+");
fseek(fp,2*sizeof(struct struckt),SEEK_SET);
strcpy(r.name,"Arash”);
fwrite(&r,sizeof(struct struckt),1,fp);

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

بافر:
بافر حافظه ای است که به فایل اختصاص می یابد تا اعمال ورودی و خروجی بر روی آنها انجام با سرعت بیشتری انجام شود . در حین خروج از برنامه خوب است جهت اطمینان بیشتر به ماشین دستور داد تا کلیه داده های موجود در بافرها را به فایل مربوطه منتقل نمایید . برای این منظور می توان از تابع fflush() استفاده کرد . اگر کار این تابع با موفقیت انجام شود ، مقدار 0 بر می گرداند و گرنه مقدار EOF بر می گرداند.

عیب یابی در فایل :
در حین انجام کار با فایل ممکن است خطایی رخ دهد . به عنوان مثال عدم وجود فضای کافی برای ایجاد فایل یا آماده نبودن دستگاهی که فایل باید در آنجا تشکیل گردد و یا مواردی از این قبیل ، منجر به بروز خطا می شود . با استفاده از تابع ferror می توان از بروز چنین خطاهایی مطلع گردید .
ferror(fp);

fp اشاره گری است که مشخص می کند تابع روی چه فایلی باید خطایابی کند . بهتر است که این تابع را بلافاصله بعد از هر عملی روی فایل استفاده شود. اگر خطایی در رابطه با فایل رخ دهد ارزش درستی و گرنه ارزش نادرستی برمیگرداند .
Back to top
Display posts from previous:   
Post new topic   Reply to topic    ParsX.com Forum Index -> C/C++ Programming All times are GMT + 3.5 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum