PDA

View Full Version : سوال: خواندن و نوشتن در فايل



hamid67fathi
یک شنبه 03 شهریور 1387, 22:31 عصر
سلام
من ميخوام چندتا متغير رو تو فايل ذخيره کنم و بخونم ميشه راهنمايم کنيد
تا حالا با فايل ها کار نکردم

mehdad.koulab
دوشنبه 04 شهریور 1387, 06:36 صبح
سلام
اول بايد فايل رو تعريف كنيد بعد براي باز كردن فايل دستور fopen براي خواندن فايل از fread براي نوشتن روي فاين از fwrite و براي بستن فايل از fclose استفاده كنيد

hamid67fathi
دوشنبه 04 شهریور 1387, 14:03 عصر
ميشه يه مثال ساده بزنيد ؟!؟!؟ شرمنده !!!

Nima_NF
دوشنبه 04 شهریور 1387, 18:08 عصر
قبلا در سایت مطالب و مثال های بسیار زیادی معرفی شده است.

از طریق جستجوی گوگل یا جستجوی پیشرفته در سایت، کلمه fopen را برای زبان C و ifstream - ofstream - fstream را برای زبان ++C جستجو کنید به نتایج بسیاری می رسید.

سایر نمونه ها:
برای زبان C
C File I/O and Binary File I/O (http://www.cprogramming.com/tutorial/cfileio.html)
Random Access Files in C (http://www.oldsaybrook.k12.ct.us/HSWebsite/Class_Resources/C_rsrcs/Bin_Files_C.html)
Intro to File Input/Output in C (http://www.cs.bu.edu/teaching/c/file-io/intro/)
http://barnamenevis.org/forum/showthread.php?t=73418

برای C++
C++ File I/O - binary files using fstream (http://www.codersource.net/cpp_file_io_binary.html)
http://barnamenevis.org/forum/showthread.php?t=94404
http://barnamenevis.org/forum/showth...t=97755&page=2 (http://barnamenevis.org/forum/showthread.php?t=97755&page=2)

hamid67fathi
دوشنبه 04 شهریور 1387, 19:46 عصر
اونا چندتا بحث رو با هم قاطی کردن
من که چيزی نفهميدم
جانه من يه مثاله ساده ميخوام
يه مثال بزن برام !!!!

Salar Ashgi
دوشنبه 04 شهریور 1387, 21:41 عصر
با سلام خدمت شما دوست گرامی !!!!

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


FILE *fopen(char *filename,*mode)

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

mode مشخص میکند که فایل چگونه باز شود ؟؟!!!

یک مثال ساده :


FILE *fp;
fp = fopen("D:test","w");

این دستور فایلی بنام test رو بر روی درایو D ایجاد میکند !!!

hamid67fathi
چهارشنبه 06 شهریور 1387, 08:21 صبح
سلام
من با اين کد ميتونم رو فايل بنويسم اما نوشته های قبلی فايل پاک ميشه

چی کارش کنم ؟




FILE * pFile;
pFile = fopen ("myfile.txt","w");
fputs ("\n",pFile);
fputs (name,pFile);a
fclose (pFile);

bsng110
چهارشنبه 06 شهریور 1387, 16:28 عصر
هوالحکیم.
سلام.
همانطور که تا کنون فهمیده اید، هر فایلی یک اشاره گر دارد(البته هنگامی که باز می شود) و این اشاره گر مشخص می کند که از کجای فایل اطلاعات خوانده شوند و یا در کجا اطلاعات نوشته شوند. به صورت پیش فرض، این اشاره گر به ابتدای فایل اشاره می کند به همین دلیل وقتی شما فایل را باز می کنید و روی آن می نویسید، در همان مکان های قبلی اطلاعات نوشته می شود. توسط تابع fseek می توانید این اشاره گر را جابجا کنید. این تابع اگر اشتباه نکنم، سه پارامتر می گرفت. ترتیب آنها را از MSDN پیدا کنید. یک پارامتر خود فایل، پارامتر دیگر مکانی که قصد جابجایی از آن قسمت را دارید و پارامتر دیگر مقدار جابجایی است. مثلاً در پارامتر دوم می گویید که می خواهید از ابتدای فایل جابجایی را انجام دهید و در پارامتر اندازه می گویید که از این مکان، اه اندازه 10 کاراکتر جابجا شود که بعد از اجرای این دستور، اشاره گر به دهمین کاراکتر فایل اشاره می کند. مثلاً اگر می خواهید اشاره گر را در انتهای فایل قرار دهید، بگویید که مکان جابجایی انتهای فایل باشد و مقدار جابجایی را صفر تعیین کنید. راه حل دیگر استفاده از "a" به جای "w" است. "a" مخفف کلمه append به معنای اضافه کردن یا concat کردن و یا یه همچین معنی است و باعث می شود که شما فقط بتوانید به انتهای فایل متنی اضافه کنید. دقت کنید که چنانچه فایل را در این حالت باز کنید و حتی اگر توسط تابع fseek اشاره گر فایل را به ابتدای فایل ببرید، باز هم اطلاعات در انتهای فایل درج می شود بنابراین فقط در مواردی که قصد اضافه کردن اطلاعات در انتهای یک فایل را دارید، از این تابع استفاده کنید.
اعلان این تابع را جستم، به صورت زیر است(ms-help://MS.MSDNQTR.v80.en/MS.MSDN.v80/MS.WINCE.v50.en/wceappdev5/html/wce50lrffseek.htm):


int fseek(
FILE* stream,
long offset,
int origin
);
همچنین خروجی آن نیز به صورت زیر است:


If successful, fseek returns 0.
Otherwise, it returns a nonzero value.
On devices incapable of seeking, the return value is undefined.

جهت مشخص کردن نواحی(region) نیز از ثوابت زیر استفاده کنید:


SEEK_CUR : Current position of file pointer
SEEK_END : End of file
SEEK_SET : Beginning of file

همچنین نکته دیگری که دیدم در کد رعایت نکردید، اطمینان از صحت باز شدن فایل می باشد. شاید می دانستید و جهت خلاصه نویسی ذکر نکردید، ولی به هر حال حواستان باشد که چنانچه تابع fopen موفق به باز کردن فایل نشد، اشاره گر NULL بر می گرداند بنابراین بعد از استفاده از fopen بررسی کنید که چنانچه اشاره گر حاصل مثلاً pFile شما برابر NULL است، به کاربر خطا دهید که نمی توانید فایل را باز کنید و یا عملی که خودتان می دانید در نظر بگیرید. من یک جایی نیاز به یک فایل temp داشتم برای همین از تابع tmpname (که در ویژوال استودیو به صورت tmpname_s وجود دارد) استفاده کردم و نام یک فایل موقتی در شاخه فایل های موقتی ویندوز را از آن گرفتم و بعد فایل را باز کردم. چنانچه موفق به باز کردن فایل نمی شدم، مجدداً نام دیگری در خواست می کردم تا بالاخره فایلی بتوانم باز کنم(البته بهتر است محدودیتی برای این کار قرار دهید وگرنه ممکن است در شرایط ویژوه ای برنامه در حلقه بینهایت بیفتد و ...). نهایتاً پس از اینکه کارم با فایل تمام شد، توسط تابع remove در کتابخانه stdio.h که نام فایل را می گیرد، آن فایل موقتی را پاک می کردم. نکته دیگری که در مورد فایل ها وجود دارد، نوع استفاده از آنها می باشد. همانطور که می دانید، فایل ها یا متنی هستند و یا باینری و شما در بالا فایل را به صورت متنی باز کرده اید و اطلاعات در آن ریخته اید و از آن اطلاعات می خوانید ولی می توانید فایل را به صورت باینری نیز باز کنید و اطلاعات در آن بنویسید و یا از آن بخوانید که این روش نیز مزایا و معایبی دارد.
ببخشید که فرصت نکردم بیش از این توضیح دهم.
امیدوارم که مطالب بالا مفید واقع شود.
سوالی بود، در خدمتیم.
یا علی
خدانگهدارتان

hamid67fathi
چهارشنبه 06 شهریور 1387, 16:59 عصر
سلام
ممنون از راهنماييتون
من دقيقا ميخوام هر دفعه سه تا متغيير رو ذخيره کنم و در صورت لزوم بخونم.
ميشه ميشتر راهنمايم کنيد ؟

hamid67fathi
چهارشنبه 06 شهریور 1387, 22:44 عصر
جانه من کمک کنيد
من ميخوام از يه فايل متنی بخونم
ساختار متنش هم به اين صورت هستش :

hamid karimi 1367
majid karimi 1369

.
.
.
.

hamid67fathi
جمعه 08 شهریور 1387, 17:53 عصر
کمک نمیکنید ؟؟؟؟

bsng110
شنبه 09 شهریور 1387, 17:26 عصر
هوالحکیم سلام ببخشید اگه کمی دیر شد. گفتم شاید دوستان کمک کنند! یک سوال؟ آیا بین فیلد های شما، فاصله های خالی و ... وجود دارد یا خیر؟ اگر وجود ندارد، یک راه حل ساده برایتان می گویم و الا راه حل های مختلفی وجود دارد. مثلاً اگر فیلد اول شما ali reza و فیلد دوم hasani esfahani و فیلد سوم 12 45 78 است، نمی توانید از روشی که می گویم استفاده کنید و مجبورید از روش های دیگر استفاده کنید(مثلاً از cin.getline در ++C و یا متدهای خواندن رشته و تکه تکه کردن آنها در C مانند strtok و ...). اما روش به این صورت است که برای نوشتن این مقادیر در فایل، از تابع fprintf استفاده کنید. این تابع مانند printf عمل می کند، فقط پارامتر اضافی(همان فایل شما را) می گیرد. جهت خواندن هم از fscanf استفاده کنید که مجدداً این تابع نیز فایل را به عنوان پارامتر می گیرد. مثلاً برای نوشتن در فایل از دستور ;(fprintf(myfile,"%s %s %i",name,family,age استفاده کنید و برای خواندن نیز از عبارتی دستور قبل اما با استفاده از fscanf استفاده کنید. دقت کنید که در تابع fprintf حتماً بین هر دو s% یا i% یک فاصله خالی بگذارید تا فیلد ها با فاصله خالی در فایل نوشته شوند و در هنگام خواندن از فایل نیز مشکلی بوجود نیاید. یا علی خدانگهدارتان