به یازدهمین جلسه از آموزش برنامه نویسی ++C خوش آمدید. در این جلسه با مبحث کار با فایل ها در ++C آشنا خواهیم شد.
کار با فایل ها در ++C
در این جلسه قصد داریم تا به مباحث زیر بپردازیم :
- نوشتن اطلاعات در فایل در ++C
- خواندن اطلاعات از فایل در ++C
سناریوی فرضی ما ساخت یک دفترچه تلفن ساده است. ابتدا تعدادی نام و شماره تلفن را از ورودی دریافت کرده و درون یک فایل متنی می نویسیم. سپس از این فایل ایجاد شده برای جستجوی یک نام خاص استفاده کرده و در صورت یافتن آن در فایل، شماره تلفن موردنظر را در خروجی چاپ می کنیم. با ما همراه باشید تا با نحوه کار با فایل ها در ++C آشنا شویم.
نوشتن اطلاعات در فایل در ++C – ساخت دفترچه تلفن
قطعه کد زیر نحوه نوشتن اطلاعات در فایل در ++C را نشان می دهد. می خواهیم تعدادی نام و شماره تلفن را درون یک فایل متنی ذخیره کنیم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
int main() { ofstream phone_file("phone.txt"); long number; string name; cout << "Enter a number for each name (0 for quit)" << endl; for( ; ; ) { cout << "Number: "; cin >> number; if(number == 0) break; phone_file << number << ' '; cout << "Name: "; cin >> name; phone_file << name << ' '; cout << endl; } } |
در قطعه کد بالا در خط ۳ یک فایل متنی با نام phone_file را تعریف کرده ایم که به یک فایل متنی با نام phone.txt اشاره دارد. همانگونه که می بینید نوع فایل را ofstream در نظر گرفته ایم. هرگاه بخواهیم با فایلها در ++C کار کنیم می بایست عبارت <include<fstream# را به ابتدای برنامه مان اضافه کنیم. فایل fstream شامل دو نوع ofstream (برای نوشتن اطلاعات در فایل) و ifstream (برای خواندن اطلاعات از فایل) است.
پس از تعریف متغیرهای مورد نیاز و چاپ یک پیام برای کاربر، با یک حلقه for تعدادی نام و شماره تلفن را از ووردی دریافت کرده و درون فایل می نویسیم. از آنجا که تعداد نام و شماره تلفن هایی که قرار است وارد شوند از قبل مشخص نیست، ما شرط ورود عدد صفر بجای شماره تلفن را به عنوان شرط خاتمه ورود اطلاعات در نظر گرفته ایم. حلقه for به صورت حلقه بینهایت پیاده سازی شده و تا زمانیکه کاربر بجای شماره تلفن عدد صفر را وارد نکند، ما هر بار یک نام و شماره تلفن را از ورودی دریافت کرده و درون فایل می نویسیم. به همین سادگی می توان عمل نوشتن اطلاعات در فایل در ++C را انجام داد.
چنانچه اطلاعات زیر را بعنوان ورودی به برنامه بدهیم:
1 2 3 4 5 6 7 8 9 10 11 |
Enter a number for each name (0 for quit) Number: 123 Name: john Number: 456 Name: jack Number: 789 Name: tom Number: 0 |
فایلی با نام phone.txt ایجاد شده و محتویات آن بصورت زیر خواهد بود:
1 |
123 john 456 jack 789 tom |
خواندن اطلاعات از فایل در ++C – جستجو در دفترچه تلفن
قطعه کد زیر نحوه خواندن اطلاعات از فایل در ++C را نشان می دهد. می خواهیم در همان دفترچه تلفنی که ایجاد کردیم به جستجوی یک نام خاص پرداخته و چنانچه آن را پیدا کردیم، شماره تلفن موردنظر را در خروجی چاپ کنیم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
int main() { ifstream phone_file("phone.txt"); long number; string name, search_name; bool found = false; cout << "Enter a name for finding its phone number: "; cin >> search_name; cout << endl; while(phone_file >> number) { phone_file >> name; if(name == search_name) { cout << name << " : " << number << endl; found = true; break; } } if(found == false) cout << search_name << " is not in this phonebook" << endl; } |
این بار در خط ۳ فایل موردنظر را از نوع ifstream تعریف کرده ایم، زیرا قصد خواندن اطلاعات از فایل را داریم. در خط ۸ یک متغیر بولین با نام found را تعریف کرده و با مقدار false مقداردهی کرده ایم. این متغیر قرار است پیداشدن یا نشدن نام موردنظر در دفترچه تلفن را برای ما مشخص کند. هر گاه نام مورد نظر را در دفترچه تلفن یافتیم، مقدار آن را به true تغییر می دهیم (خط ۲۰).
پس از دریافت نام موردنظر برای جستجو (خط ۱۱)، در درون حلقه while به دنبال آن می گردیم. در خط ۲۱ نیز یک بهینه سازی انجام داده ایم و جلوی مقایسات بعدی (اضافی) پس از پیدا شدن نام موردنظر را گرفته ایم. در نهایت در خطوط ۲۵ و ۲۶ با بررسی مقدار متغیر found پیغامی مناسب مبنی بر پیدا نشدن نام موردنظر در دفترچه تلفن را به کاربر نشان می دهیم.
نمونه خروجی (جستجوی موفق) :
1 2 3 |
Enter a name for finding its phone number: jack jack : 456 |
نمونه خروجی (جستجوی ناموفق) :
1 2 3 |
Enter a name for finding its phone number: joe joe is not in this phonebook |
به این صورت نیز می توان عمل خواندن اطلاعات از فایل در ++C را انجام داد. این بود مبحث کار با فایل ها در ++C .
به پایان این جلسه آموزشی رسیدیم. در آینده با بخشهای دیگری از زبان ++C آشنا خواهیم شد. با ما همراه باشید…
28 دیدگاه. ارسال دیدگاه جدید
چقددددر خوب و ساده گفتید من اصلا نمیتونستم درک کنم این فایل که تو کتاب درسیا نوشته چیه کجا اجرا میشه خوندن نوشتن فایل یعنی چی….
ممنون برا این ویدیو استاد
خواهش میکنم، موفق باشید.
با سلام
ممنونم از اینکه این آموزش ها رو رایگان در اختیار همه قرار می دید تا کسانی که قدرت خرید ندارند بتونند از این آموزشها استفاده کنند. خدا خیرتون بده و ان شاءالله همواره سالم و سلامت باشید و این راه پر از خیر و برکت رو ادامه بدید… یک دنیا ممنونم
عالی دمتون گرم.
من خیلی برای ofstream و ifstream بودن که برای فایلها استفاده میشن مشکل داشتم.
سلام ، وقت بخیر
ببخشید در مورد کار با فایل ها چطور میشه برنامه ای نوشت که در یک برنامه از کاربر اطلاعاتی رو ذخیره ، در فایل ذخیره و بلافاصله همه آن اطلاعات را چاپ کند ؟؟
دوست عزیز ما در همین جلسه هم این کار رو کردیم.
در زمان ساخت دفترچه تلفن، یک سری اطلاعات (نام و شماره) رو در دفترچه تلفن نوشتیم و در زمان جستجو، اطلاعاتی رو از فایل میخونیم.
سلام استاد
وقتی ما دفترچه تلفن رو ساختیم، اگر بعدا خواستیم چند تا اسم و شماره دیگه به دفترچه اضافه کنیم باید چکار کنیم؟ چون دوباره از اول بخوایم همه رو بنویسیم مشکل هست.
برای اینکار باید از متد open بصورت زیر استفاده کنید:
;phone_file.open(“phone.txt”, ios_base::app)
این دستور فایل رو به منظور اضافه کردن اطلاعات به انتهای اون باز میکنه.
سلام استاد خداقوت
توی خواندن شما اول فایل رو ریختید توی number و بعد ریختید توی name. ترتیب این دو کار باید مثل ترتیب توی قسمت نوشتن فایل باشه یا فرقی نداره؟ یعنی اگر مثلا تو نوشتن فایل، اول name و بعد number تعریف کنیم و توی خواندن، اول number و بعد name بنویسیم مشکل داره؟
بله دوست عزیز ترتیب خواندن مهم هست.
به همون ترتیبی که اطلاعات رو در فایل نوشتیم باید اطلاعات رو بخونیم.
سلام خسته نباشید. واقعا ممنونم.
شما باید به اونایی که برای ما تدریس میکنن تدریس کنین. هم فن بیانتون عالیه هم تدریستون. ممنونم واسه سایت بی نظیرتون
ممنون از شما، لطف دارید.
فوق العاده عالی
سلام استاد زعفری
آقا من دانشجوام. اصلا توانایی حل مساله متاسفانه ندارم. یعنی اصلا نمیفهمم چی میگه!!! ازشون نمیدونم چطور باید استفاده کنم تو حل!!!!
تو این یه ماه چکار کنم ؟؟ تمرین کنم ؟؟؟ کتاب بخونم ؟؟؟
راستی ممنون از آموزش کاملا خوبتون +++++
دوست عزیز رمز موفقیت در هر کاری از جمله برنامه نویسی علاقه و پشتکار هست. غیر از تمرین و تکرار راهی وجود نداره
سلام وقتتون بخیر
آموزش هاتون در رابطه با برنامه نویسی ++C خیلی کامل و مفید هستند
من در رابطه با این جلسه یک سوالی برام پیش اومده اون هم این هست که چطور میتونیم برای فایلی که میسازیم آدرسی تعیین کنیم یا فایلی که قراره بخونه رو از آدرسی به غیر از فولدر پروژه بخونه ؟؟
دوست عزیز برای مثال اگر طبق آموزشهای این جلسه بخوایم فایل “phone.txt” رو بجای اینکه در کنار فایل main.cpp قرار بگیره، در درون فولدری بنام new ایجاد کنیم، کافیه که دستور ایجاد فایل رو بصورت زیر بنویسیم:
;(“ofstream phone_file(“new/phone.txt
یا اگر میخوایم در یک سطح بالاتر (فولدر بیرونی) ایحاد بشه، به این صورت:
;(“ofstream phone_file(“../phone.txt
با سلام
من ساختاری درست کردم و اطلاعات شناسنامه ای افراد رو از کاربر میگیره و در یک فایل ذخیره میکنه
حالا میخوام تابعی درست کنم که نام و نام خانوادگی رو از کاربر بگیره و درون فایل جستجو و اگر اون اسم و فامیل در فایل موجود بود اطلاعات دیگه مثل شماره شناسنامه و … رو چاپ کنه
ممنون میشم راهنماییم کنید با تشکر
دوست عزیز روال کار مشابه همین جلسه آموزشی است. ما اینجا نام و شماره تلفن افراد رو داشتیم، شما اطلاعات شناسنامه ای افراد رو ذخیره کردین.
فقط دقت داشته باشید در سناریوهای این چنینی، جستجو بر اساس اسم افراد روش درستی نیست، چون احتمال تکراری بودن اسامی وجود داره.
عموما در سیستمهای جستجوی اطلاعات، جستجو بر اساس یک فیلد عددی و منحصربفرد انجام میشه.
مثلا شماره دانشجویی، شماره حساب بانکی، شماره پرسنلی، کد ملی و …
خسته نباشید استاد
مرسی بابت آموزش عالیتون، من یه سوال داشتم…
اگه داخل فایل txt ما توی یک خط چند تا عدد مثلا ۲ ۳ ۴ ۵ باشه و بخوایم به برنامه بگیم که هر عدد رو به عنوان یکی از عناصر یک آرایه بخونه، این چجوری ممکن هست؟
آرایه ی ما [int a[4 هست، میخوایم بگیم برنامه از فایل txt، عدد ۲ رو به عنوان عنصر اول آرایه، عدد ۳ رو بعنوان عنصر دوم و … در نظر بگیره.
مرسی بابت راهنمایی تون
دوست عزیز از قطعه کدی شبیه به این میتونین استفاده کنید:
سلام استاد ببخشید یه سوال داشتم
توی بخش سرچ، زمانی که نام و شماره تلفن رو از فایل میخونیم، break موجود در دستور if باعث میشه فقط از if خارج بشه ولی شرط حلقه while رو هم برسی کنه یا اینکه از هر دو بخش خارج میشه؟
دوست عزیز دستور break باعث خروج از هر دو بخش میشه، دیگه وارد حلقه نمیشه و مقایسهای هم صورت نمیگیره.
اینکار برای بهینهسازی و جلوگیری از مقایسات اضافی انجام شده.
وقتتون بخیر مهندس
مهندس در اینجا (while(phone_file>>number کدوم شماره ریخته می شه توی number و یا اینجا ;phone_file>>name کدوم اسم ریخته می شه توی name ؟
دوست عزیز ازونجاییکه هر دو دستور ذکر شده درون حلقه while قرار گرفتن، در هر دور حلقه یکی از شمارهها به همراه اسم مربوطه درون متغیرهای number و name ریخته شده و مقایسات انجام میشه.
یعنی در دور اول شماره و اسم نفر اول، دور دوم شماره و اسم نفر دوم و …
سلام مهندس خوبید
یه سوال داشتم
چرا وقتی یه عدد رو زیادی بلند وارد میکنم قاطی میکنه و شروع می کنه پشت سر هم آخرین ورودیها رو چاپ کردن؟؟
میتونه مربوط به تکمیل ظرفیت long باشه؟ باید چکار کرد که اینجوری نشه؟ من از dev استفاده می کنم!
ممنون
بله دوست عزیز دلیلش همینه
همونطوری که توی جلسات اولیه مطرح شد، هر نوع متغیر ظرفیت ثابت و از قبل مشخصی داره که بیش از اون سرریز میشه و مشکلاتی رو در برنامه ایجاد میکنه.
سلام دوست عزیز برای منم همین طوری شد
یه شماره ی ۱۱ رقمی رو که زدم اینجوری شد راهش اینه که عبارت long رو دو بار بنویسی و بعد متغیر اینجوری ظرفیتش بیشتر میشه
;long long number اینجوری