PDA

View Full Version : مقاله: ورودی و خروجی فایل در ++C



clover
جمعه 09 مرداد 1388, 21:18 عصر
اکثر مثال هایی که تا کنون در این فروم گفته شده اند برنامه های ++C هستند که از stream های از پیش تعریف شده cin و cout استفاده می کنند .اما ممکن است که برنامه شما نیاز داشته باشد که stream های خاص خودش را برای I/O ایجاد کند . اگر برنامه ای نیاز داشته باشد که یک فایل را برای ورودی یا خروجی ایجاد کند ، باید یک فایل header به نام fstream را لحاظ ( include ) کند .( iostream ، fstream را نیز لحاظ می کند ) . کلاس های ifstream و ofstream به ترتیب از istream و ostream مشتق شده اند و عملگر های استخراج و درج را به ارث برده اند . برنامه ++C زیر نشان می دهد که چگونه به ترتیب با استفاده از ofstream و ifstream می توان یک فایل را برای خواندن و نوشتن تعریف کرد .

#include<iostream>
#include <fstream>
#include<conio.h>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
char ch;

ofstream ofsout("c:\\text.dat",ios::out);
if( !ofsout )
cerr << "\nUnable to open 'text.in' for input .\n";

ch = _getch();
while( ch != 13 ) // While Not Press Enter
{
cout << ch;
ofsout.put(ch);
ch = _getch();
}

ofsout.close();
cout << endl;

ifstream ifsin("c:\\text.dat",ios::in);
if( !ifsin )
cerr << "\nUnable to open 'text.in' for input .\n";

while ( ifsin.get(ch))
cout << ch;
ifsin.close();

cout << endl << "Press any Key ...";
_getch();
return 0;
}

توضیح :
این برنامه شئ ofsout را از کلاس ofstream تعریف می کند و به فایل text.dat که در درایو c قرار دارد متصل می کند ( در صورتی که فایل وجود نداشته باشد ، ایجاد می شود ) .

ofstream ofsout("c:\\text.dat",ios::out);
همیشه برای هر برنامه ای که با فایل کار می کند خوب است که وجود یا ایجاد فایل مشخص شده در مد designated را بررسی کنید . با استفاده از handle فایل ofsout ، می توان از یک دستور if ساده برای بررسی وضعیت فایل استفاده کرد .

if( !ofsout )
cerr << "\nUnable to open 'text.in' for input .\n";
همین روند برای ifsin نیز به کار می رود ولی با این تفاوت که این فایل از کلاس ifstream مشتق می شود .
سپس با استفاده از یک دستور while تا زمانی که کاربر کلید Enter ( کد اسکی 13 ) را فشار نداده است ، کاراکتر ها را با تابع ()put در فایل می نویسد . و پس از اتمام کار فایل مورد نظر را با تابع ()close می بندد . بستن فایل خروجی می تواند برای خالی کردن تمام داده هایی که به صورت داخلی بافر شده اند ضروری باشد .
در ادامه ، برنامه شئ ifsin را از کلاس ifstream تعریف می کند و به همان فایل ( text.dat ) متصل می کند .

ifstream ifsin("c:\\text.dat",ios::in);
سپس با استفاده از دستور while تا زمانی که کاراکتر خوانده شده EOF نباشد به خواندن و چاپ کاراکتر ادامه می دهد .

clover
جمعه 09 مرداد 1388, 22:20 عصر
ممکن است شرایطی پیش بیاید که یک برنامه بخواهد مشخص کردن یک فایل را به تاخیر بیاندازد و یا بخواهد چند stream فایل را به یک مشخصه فایل مرتبط کند . قطعه کد زیر این مفهوم را نشان می دهد :

ifstream ifsin;

.
.
.

ifsin.open( "week1.in" );

.
.
.

ifsin.close();
ifsin.open( "week2.in" );

.
.
.

ifsin.close();


هر وقت که برنامه بخواهد روش باز شدن یا مورد استفاده قرار گرفتن یک فایل را تغییر دهد ، می تواند آرگومان دومی را در سازنده های stream فایل به کار ببرد . برای مثال :

ofstream ofsout( "week1.out", ios::out | ios::app );
این دستور ، شئ ofsout را تعریف کرده و سعی می کند تا آن را به فایلی به نام "week1.out" متصل کند . پارامتر ios::out فایل را برای نوشتن باز می کند و پارامتر ios::app تمام نوشته ها را به انتهای فایل موجود اضافه می کند .
جدول زیر ، فلگ های مربوط به آرگومان دوم سازنده های stream فایل را لیست می کند ، که می توان آنها را به صورت منطقی با هم OR کرد .


--------------------------------------------------------------------------------
ios::in برای خواندن ، فایل را باز می کند .
ios::out برای نوشتن فایل را باز می کند .
ios::ate بعد از اینکه فایل ایجاد شد به EOF می رود .
ios::app تمام نوشته ها به انتهای فایل اضافه می شوند .
ios::trunc اگر فایل وجود داشته باشد آنرا حذف می کند .
ios::nocreate ( تحت کتابخانه جدید iostream به کار نمی رود .) اگر فایل وجود نداشته باشد ، باز کردن فایل با موفقیت انجام نمی شود .
ios::noreplace ( تحت کتابخانه جدید iostream به کار نمی رود .) اگر فایل وجود داشته باشد ، باز کردن فایل با موفقیت انجام نمی شود .
ios::binary فایل را به حالت دودویی باز می کنئ ( به صورت پیش فرض فایل به حالت متنی باز می شود ) .

---------------------------------------------------------------------------------

yasi.88
جمعه 09 مرداد 1388, 22:45 عصر
با سلام و تشکر از دادن این اطلاعات ارزشمند. میشه به من بگید شما عمل حذف از فایل رو به چه روشی انجام می دهید؟ من هدفم اینه که وقتی حذف می کنم ترتیب وارد کردن اطلاعاتم به هم نخوره.در این صورت همه رو شیفت میدم. اما این روش رو دوست ندارم چراکه اگر فایل پر باشه و بخوام اولی رو حذف کنم چه شود:متعجب:اما مجبورم...:ناراحت:شما روش دیگری ندارید. و سوال مهم دیگم اینه که من وقتی فایل رو delete.open(file_name,ios::in||ios::out) این طور باز میکنم seekg عمل می کنه اما seekp نه ....(برای همون عمل شیفت).میشه بگید مشکل کارم کجاست؟