فایل‌ها و استریم‌ها در ++C

تا اینجا از کتابخانه‌ی استاندارد iostream استفاده می‌کردیم، که متدهای cin و cout را به ترتیب برای خواندن از ورودی استاندارد و نوشتن در خروجی استاندارد به کار می‌برد.

این آموزش به شما نحوه خواندن و نوشتن در فایل‌ها را نشان خواهد داد. برای اینکار به یک کتابخانه استاندارد از ++C به نام fstream نیاز داریم که سه نوع داده جدید تعریف می‌کند.

ردیف

نوع داده و توصیف آن

1

ofstream

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

2

ifstream

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

3

fstream

این نوع داده استریم فایل عمومی ‌را معرفی می‌کند و قابلیت‌های ofstream و ifstream را همزمان پشتیبانی می‌کند، یعنی می‌تواند فایل ایجاد کرده، اطلاعات در فایل‌ها بنویسد و از آنها اطلاعات بخواند.

برای پردازش فایل‌ها در ++C، باید هدرفایل‌های <iostream> و <fstream> را در سورس فایل ضمیمه کرد.

بازکردن یک فایل

قبل از خواندن یا نوشتن در یک فایل، باید حتما آن را باز کرد. برای بازکردن یک فایل به قصد نوشتن در آن می‌توان از Ofstream و یا fstream استفاده کرد. از شی ifstream تنها به قصد خواندن فایل می‌توان استفاده کرد.

شکل استاندارد تابع ()open، که عضوی از اشیا fstream، ifstream و ofstream است در زیر آمده است.

void open(const char *filename, ios::openmode mode);

در این عبارت، آرگومان اول مشخص کننده نام و مکان فایلی که قرار است باز شود و آرگومان دوم تابع ()open، حالتی (مد) که فایل قرار است برای آن باز شود را تعیین می‌کند.

مطلب پیشنهادی:  آموزش کار با CMake

ردیف

پرچم حالت (Mode Flag) و توضیح آن

1

ios::app

مد افزودن (append mode)، همه خروجی به انتهای فایل افزوده می‌شود.

2

ios::ate

فایل را برای خروجی باز کرده و کنترل خواندن/نوشتن را به انتهای فایل منتقل می‌کند.

3

ios::in

فایل را به منظور خواندن باز می‌کند.

4

ios::out

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

5

ios::trunc

اگر فایل از پیش موجود باشد، محتوای آن قبل از باز کردن پاک (truncate) خواهد شد.

می‌توان دو یا چند مورد از این مقادیر را باهم OR کرد. برای مثال، اگر بخواهید یک فایل را در حالت نوشتن باز کرده و در صورت از پیش موجود بودن محتویات آن را پاک کنید، شکل دستور به صورت زیر خواهد بود.

ofstream outfile;
outfile.open("file.dat", ios::out | ios::trunc );

به طرز مشابه، می‌توان یک فایل را به منظور نوشتن و خواندن باز کرد.

fstream  afile;
afile.open("file.dat", ios::out | ios::in );

بستن یک فایل

وقتی که برنامه ++C خاتمه می‌یابد، به صورت خودکار همه استریم‌ها را خالی کرده (flush)، حافظه تخصیص یافته را آزاد کرده و فایل‌های باز را می‌بندد. اما به عنوان یک برنامه نویس خوب، بهتر است که قبل از خاتمه کار برنامه فایل‌های باز را ببندید.

ساختار استاندارد برای تابع ()close که عضوی از اشیا fstream، ifstream و ofstream است به صورت زیر است.

void close();

نوشتن در یک فایل

هنگام نوشتن برنامه در ++C، با استفاده از عملگر درج استریم (>>)، دقیقاً به همان شکلی که اطلاعات را در صفحه نمایش نوشتیم، می‌توان در یک فایل نیز نوشت. تنها تفاوت این است که به جای شی cout، از اشیا fstream و ofstream استفاده می‌کنیم.

خواندن در یک فایل

دقیقاً به شکلی که اطلاعات را از صفحه کلید دریافت کردیم، با استفاده از عملگر استخراج استریم (<<) می‌توان از یک فایل نیز اطلاعات را خواند. تنها تفاوت اینجاست که به جای استفاده از شی cin، از اشیا fstream و ifstream استفاده می‌کنیم.

مثال از خواندن و نوشتن

برنامه زیر یک فایل را در حالت خواندن و نوشتن باز می‌کند. بعد از نوشتن اطلاعات از طرف کاربر در فایل به نام afile.dat، برنامه اطلاعات را از همان فایل خوانده و در صفحه نمایش نشان می‌دهد.

#include <fstream>
#include <iostream>
using namespace std;
 
int main () {
   char data[100];

   // open a file in write mode.
   ofstream outfile;
   outfile.open("afile.dat");

   cout << "Writing to the file" << endl;
   cout << "Enter your name: "; 
   cin.getline(data, 100);

   // write inputted data into the file.
   outfile << data << endl;

   cout << "Enter your age: "; 
   cin >> data;
   cin.ignore();
   
   // again write inputted data into the file.
   outfile << data << endl;

   // close the opened file.
   outfile.close();

   // open a file in read mode.
   ifstream infile; 
   infile.open("afile.dat"); 
 
   cout << "Reading from the file" << endl; 
   infile >> data; 

   // write the data at the screen.
   cout << data << endl;
   
   // again read the data from the file and display it.
   infile >> data; 
   cout << data << endl; 

   // close the opened file.
   infile.close();

   return 0;
}

با اجرای کد فوق، خروجی زیر حاصل می‌شود.

$./a.out
Writing to the file
Enter your name: Zara
Enter your age: 9
Reading from the file
Zara
9

مثال بالا از توابعی مانند ()getline برای خواندن یک خط و تابع ()ignore برای نادیده گرفتن کارکترهای باقی مانده از دستور خواندن قبلی استفاده می‌کند.

اشاره‌گرهای مکان در فایل

هم istream و هم ostream توابع عضوی برای بیان اشاره‌گر مکان در فایل فراهم کرده‌اند. این توابع عضو (”seekg(“seek put برای istream و (”seekp(“seek put برای ostream می‌باشند.

آرگومان توابع seekg و seekp در حالت عادی یک long integer است. آرگومان دوم مشخص کننده جهت seek می‌باشد. جهت seek می‌تواند ios::beg (پیش فرض) مکان نسبت به آغاز استریم، ios:cur مکان نسبت به مکان فعلی در یک استریم و یا ios::end  برای مکان نسبت به انتهای استریم باشد.

اشاره‌گر مکان درفایل، یک مقدار integer است که مکان درون یک فایل را به صورت تعداد بایت‌ها از مکان آغاز فایل مشخص می‌کند. مثال‌هایی از مکان‌یابی با استفاده از اشاره‌گر get در زیر آمده است.

// position to the nth byte of fileObject (assumes ios::beg)
fileObject.seekg( n );

// position n bytes forward in fileObject
fileObject.seekg( n, ios::cur );

// position n bytes back from end of fileObject
fileObject.seekg( n, ios::end );

// position at end of fileObject
fileObject.seekg( 0, ios::end );

منبع: ترجمه از سایت tutorialspoint.com

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

مطالعه دیگر جلسات این آموزش<< جلسه قبلی                    جلسه بعدی >>
مطلب پیشنهادی:  آموزش برنامه نویسی ++C

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *