رشته های کاراکتری و فایل ها در ++C استاندارد
اسلاید 1: بسم الله الرحمن الرحيم
اسلاید 2: تعداد واحد: 3تهيه كننده: دکتر حسن توکلیبرنامه سازي
اسلاید 3: جلسه هشتم« رشتههاي كاراكتري و فايلها در ++C استاندارد»
اسلاید 4: مروري بر اشارهگرهارشتههاي كاراكتري در Cورودي/خروجي رشتههاي کاراکتريچند تابع عضو cin و coutتوابع كاراكتري C استانداردآرايهاي از رشتههاتوابع استاندارد رشتههاي کاراکتريآنچه در اين جلسه مي خوانيد›››
اسلاید 5: رشتههاي کاراکتري در C++ استانداردنگاهي دقيقتر به تبادل دادههاورودي قالببندي نشدهنوع string در ++C استانداردفايلهاهدف کلي: آشنايي با کلاسها و اصول اوليۀ بهکارگيري آنها.
اسلاید 6: هدف کلي: معرفي رشتههاي کاراکتري به سبک c و c++ و نحوۀ ايجاد و دستکاري آنها و همچنين نحوۀ استفاده از فايلهاي متني براي ذخيرهسازي و بازيابي اطلاعات.
اسلاید 7: هدفهاي رفتاري: انتظار ميرود پس از پايان اين جلسه بتوانيد:- رشتههاي کاراکتري به سبک C استاندارد را ايجاد نماييد.- توابع معرفي شده عضو cin و cout را شناخته و وظيفۀ هر يک را شرح دهيد.- رشتههاي کاراکتري به سبک C++ استاندارد را ايجاد نماييد.- مفهوم «ورودي قالببندي شده» و «ورودي قالببندي نشده» را دانسته و هر کدام را در مکانهاي مناسب به کار ببريد.- نوع string را شناخته و رشتههايي از اين نوع ايجاد کنيد و با استفاده از توابع خاص، اين رشتهها را دستکاري نماييد.- اطلاعات کاراکتري و رشتهاي را در يک فايل متني نوشته يا از آن بخوانيد.
اسلاید 8: مقدمه:دادههايي که در رايانهها پردازش ميشوند هميشه عدد نيستند. معمولا لازم است که اطلاعات کاراکتري مثل نام افراد – نشانيها – متون – توضيحات – کلمات و ... نيز پردازش گردند، جستجو شوند، مقايسه شوند، به يکديگر الصاق شوند يا از هم تفکيک گردند.در اين جلسه بررسي ميکنيم که چطور اطلاعات کاراکتري را از ورودي دريافت کنيم و يا آنها را به شکل دلخواه به خروجي بفرستيم. در همين راستا توابعي معرفي ميکنيم که انجام اين کارها را آسان ميکنند.
اسلاید 9: يك اشارهگر متغيري است که حاوي يک آدرس از حافظه ميباشد. نوع اين متغير از نوع مقداري است که در آن آدرس ذخيره شده. با استفاده از عملگر ارجاع & ميتوان آدرس يک شي را پيدا کرد. همچنين با استفاده از عملگر مقداريابي * ميتوانيم مقداري که در يک آدرس قرار دارد را مشخص کنيم. به تعاريف زير نگاه کنيد:مروري بر اشارهگرها:int n = 44;int* p = &n;
اسلاید 10: رشتههاي كاراكتري در Cدر زبان C++ يك «رشتۀ کاراکتري» آرايهاي از کاراکترهاست که اين آرايه داراي ويژگي مهم زير است:1- يك بخش اضافي در انتهاي آرايه وجود دارد که مقدار آن، کاراکتر NUL يعني 0‘ است. پس تعداد کل کاراکترها در آرايه هميشه يکي بيشتر از طول رشته است.2 – رشتۀ کاراکتري را ميتوان با ليترال رشتهاي به طور مستقيم مقدارگذاري کرد مثل: char str[] = string;توجه كنيد كه اين آرايه هفت عنصر دارد: s و t و r و i و n و g و 0
اسلاید 11: 3– کل يک رشتۀ کاراکتري را ميتوان مثل يک متغير معمولي چاپ کرد. مثل:cout << str;در اين صورت، همۀ کاراکترهاي درون رشتۀ کاراکتري str يکي يکي به خروجي ميروند تا وقتي که به کاراکتر انتهايي NUL برخورد شود.4 – يک رشتۀ کاراکتري را ميتوان مثل يک متغير معمولي از ورودي دريافت کرد مثل:cin >> str;در اين صورت، همۀ کاراکترهاي وارد شده يکي يکي درون str جاي ميگيرند تا وقتي که به يک فضاي خالي در کاراکترهاي ورودي برخورد شود. برنامهنويس بايد مطمئن باشد که آرايۀ str براي دريافت همۀ کاراکترهاي وارد شده جا دارد.
اسلاید 12: 5 – توابع تعريف شده در سرفايل <cstring> را ميتوانيم براي دستکاري رشتههاي کاراکتري به کار بگيريم. اين توابع عبارتند از: تابع طول رشته strlen() توابع کپي رشته strcpy() و strncpy()توابع الصاق رشتهها strcat() و strncat() توابع مقايسۀ رشتهها strcmp() و strncmp() و تابع استخراج نشانه strtok() .
اسلاید 13: رشتههاي کاراکتري با كاراكتر NUL خاتمه مييابندبرنامۀ کوچک زير نشان ميدهد که کاراکتر 0 به رشتههاي کاراکتري الصاق ميشود:int main(){ char s[] = ABCD; for (int i = 0; i < 5; i++) cout << s[ << i << ] = << s[i] << n;}
اسلاید 14: رشتۀ کاراکتري s داراي پنج عضو است که عضو پنجم، کاراکتر 0 ميباشد. تصوير خروجي اين مطلب را تاييد مينمايد. وقتي کاراکتر 0 به cout فرستاده ميشود، هيچ چيز چاپ نميشود. حتي جاي خالي هم چاپ نميشود. خط آخر خروجي، عضو پنجم را نشان مي دهد که ميان دو علامت آپستروف هيچ چيزي چاپ نشده.S0A1B2C3D4Ø
اسلاید 15: ورودي/خروجي رشتههاي کاراکتري:در C++ به چند روش ميتوان رشتههاي کاراکتري را دريافت کرده يا نمايش داد. يک راه استفاده از عملگرهاي کلاس string است که در بخشهاي بعدي به آن خواهيم پرداخت. روش ديگر، استفاده از توابع کمکي است که آن را در ادامه شرح ميدهيم.
اسلاید 16: مثال 2-8 روش سادۀ دريافت و نمايش رشتههاي کاراکتري:در برنامۀ زير يک رشتۀ کاراکتري به طول 79 کاراکتر اعلان شده و کلماتي که از ورودي خوانده ميشود در آن رشته قرار ميگيرد:int main(){ char word[80]; do { cin >> word; if (*word) cout << t << word << n; } while (*word);}
اسلاید 17: چند تابع عضو cin و coutبه cin شيء فرآيند ورودي ميگويند. اين شي شامل توابع زير است: همۀ اين توابع شامل پيشوند cin هستند زيرا آنها عضوي از cin ميباشند. به cout شيء فرآيند خروجي ميگويند. اين شي نيز شامل تابع cout.put() است. نحوۀ کاربرد هر يک از اين توابع عضو را در ادامه خواهيم ديد.فراخواني cin.getline(str,n); باعث ميشود که n کاراکتر به درون str خوانده شود و مابقي کاراکترهاي وارد شده ناديده گرفته ميشوند.cin.getline() cin.get() cin.ignore() cin.putback()cin.peek()
اسلاید 18: با دو پارامتر cin.getline() تابعاين برنامه ورودي را خط به خط به خروجي ميفرستد:int main(){ char line[80]; do { cin.getline(line,80); if (*line) cout << t[ << line << ]n; } while (*line);}
اسلاید 19: با سه پارامتر cin.getlineتابع() برنامه زير، متن ورودي را جمله به جمله تفکيک مينمايد: int main(){ char clause[20]; do { cin.getline(clause, 20, ,); if (*clause) cout << t[ << clause << ]n; } while (*clause);}
اسلاید 20: تابع cin.get()اين برنامه تعداد حرف e در جريان ورودي را شمارش ميكند. تا وقتي cin.get(ch) کاراکترها را با موفقيت به درون ch ميخواند، حلقه ادامه مييابد:int main(){ char ch; int count = 0; while (cin.get(ch)) if (ch = = e) ++count; cout << count << es were counted.n;}
اسلاید 21: تابع cout.put()برنامۀ زير، اولين حرف از هر کلمۀ ورودي را به حرف بزرگ تبديل کرده و آن را مجددا در خروجي چاپ ميکند:int main(){ char ch, pre = 0; while (cin.get(ch)) { if (pre = = || pre = = n) cout.put(char(toupper(ch))); else cout.put(ch); pre = ch; }}
اسلاید 22: cin.ignore() و cin.putback() توابعبا استفاده از برنامۀ زير، تابعي آزمايش ميشود که اين تابع اعداد صحيح را از ورودي استخراج ميکند: int nextInt();int main(){ int m = nextInt(), n = nextInt(); cin.ignore(80,n); // ignore rest of input line cout << m << + << n << = << m+n << endl;}int nextInt(){ char ch; int n; while (cin.get(ch)) if (ch >= 0 && ch <= 9) // next character is a digit { cin.putback(ch); // put it back so it can be cin >> n; // read as a complite int break; } return n;}
اسلاید 23: تابع cin.peek()int nextInt(){ char ch; int n; while (ch = cin.peek()) if (ch >= 0 && ch <= 9) { cin >> n; break; } else cin.get(ch); return n;}اين نسخه از تابع nextInt() معادل آن است كه در مثال قبلي بود:
اسلاید 24: توابع كاراكتري C استاندارددر مثال 6-8 به تابعtoupper() اشاره شد. اين فقط يکي از توابعي است که براي دستکاري کاراکترها استفاده ميشود. ساير توابعي که در سرفايل <ctype.h> يا <cctype> تعريف شده به شرح زير است:شرحنام تابعint isalnum(int c);اگر c کاراکتر الفبايي يا عددي باشد مقدار غيرصفر وگرنه صفر را برميگرداندisalnum()int isalpha(int c);اگر c کاراکتر الفبايي باشد مقدار غيرصفر و در غير آن، صفر را برميگرداندisalpha()
اسلاید 25: شرحنام تابعint iscntrl(int c);اگر c کاراکتر کنترلي باشد مقدار غيرصفر و در غير آن، صفر را برميگرداندiscntrl()int isdigit(int c);اگر c کاراکتر عددي باشد، مقدار غيرصفر و در غير آن، صفر را برميگرداندisdigit()int isgraph(int c);اگر c کاراکتر چاپي و غيرخالي باشد مقدار غيرصفر وگرنه صفر را برميگرداندisgraph()int islower(int c);اگر c حرف کوچک باشد مقدار غيرصفر و در غير آن، صفر را برميگرداندislower()int isprint(int c);اگر c کاراکتر قابل چاپ باشد مقدار غيرصفر و در غير آن، صفر را برميگرداندisprint()
اسلاید 26: شرحنام تابعint ispunct(int c);اگر c کاراکتر چاپي به غير از حروف و اعداد و فضاي خالي باشد، مقدار غيرصفر برميگرداند وگرنه مقدار صفر را برميگرداندispunct()int isspace(int c);اگر c کاراکتر فضاي سفيد شامل فضاي خالي و عبور فرم f و خط جديد n و بازگشت نورد r و پرش افقي t و پرش عمودي v باشد، مقدار غيرصفر را برميگرداند وگرنه صفر را برميگرداندisspace()int isupper(int c);اگر c حرف بزرگ باشد، مقدار غيرصفر برميگرداند وگرنه صفر را برميگرداندisupper()int isxdigit(int c);اگر c يکي از ده کاراکتر عددي يا يکي از دوازده حرف عدد شانزدهدهي شامل a و b و c و d و e و f و A و B و C و D و E و F باشد، مقدار غيرصفر برميگرداند وگرنه مقدار صفر را برميگرداندisxdigit()int tolower(int c);اگر c حرف بزرگ باشد، کاراکتر کوچک معادل آن را برميگرداند وگرنه خود c را برميگرداندtolower()int toupper(int c);اگر c حرف کوچک باشد، کاراکتر بزرگ معادل آن را برميگرداند وگرنه خود c را برميگرداندtoupper()
اسلاید 27: توجه کنيد که همۀ توابع فوق يک پارامتر از نوع int دريافت ميکنند و يک مقدار int را برميگردانند. علت اين است که نوع char در اصل يک نوع صحيح است. در عمل وقتي توابع فوق را به کار ميبرند، يک مقدار char به تابع ميفرستند و مقدار بازگشتي را نيز در يک char ذخيره ميکنند. به همين خاطر اين توابع را به عنوان «توابع کاراکتري» در نظر ميگيريم.
اسلاید 28: آرايهاي از رشتههابه خاطر داريد که گفتيم يک آرايۀ دوبعدي در حقيقت آرايهاي يک بعدي است که هر کدام از اعضاي آن يک آرايۀ يک بعدي ديگر است. مثلا در آرايۀ دو بعدي که به شکل مقابل اعلان شده باشد:char name[5][20]; اين آرايه در اصل پنج عضو دارد که هر عضو ميتواند بيست کاراکتر داشته باشد. اگر آرايۀ فوق را با تعريف رشتههاي کاراکتري مقايسه کنيم، نتيجه اين ميشود که آرايۀ بالا يک آرايۀ پنج عنصري است که هر عنصر آن يک رشتۀ کاراکتري بيست حرفي است. اين آرايه را ميتوانيم به شکل مقابل تصور کنيم.
اسلاید 29: از طريق name[0] و name[1] و name[2] و name[3] و name[4] ميتوانيم به هر يک از رشتههاي کاراکتري در آرايۀ بالا دسترسي داشته باشيم. يعني آرايۀ name گرچه به صورت يک آرايۀ دوبعدي اعلان شده ليکن به صورت يک آرايۀ يک بعدي با آن رفتار ميشود.
اسلاید 30: آرايهاي از رشتههاي کاراکتري برنامۀ زير چند رشتۀ کاراکتري را از ورودي ميخواند و آنها را در يک آرايه ذخيره کرده و سپس مقادير آن آرايه را چاپ ميکند:int main(){ char name[5][20]; int count=0; cout << Enter at most 4 names with at most 19 characters:n; while (cin.getline(name[count++], 20)) ; --count; cout << The names are:n; for (int i=0; i<count; i++) cout << t << i << . [ << name[i] << ] << endl;}
اسلاید 31: يك آرايۀ رشتهاي پويا اين برنامه نشان ميدهد که چگونه ميتوان از کاراکتر $ به عنوان کاراکتر نگهبان در تابع getline() استفاده کرد. مثال زير تقريبا معادل مثال 9-9 است. برنامۀ زير مجموعهاي از اسامي را ميخواند، طوري که هر اسم روي يک خط نوشته ميشود و هر اسم با کاراکتر n پايان مييابد. اين اسامي در آرايۀ name ذخيره ميشوند. سپس نامهاي ذخيره شده در آرايۀ name چاپ ميشوند:
اسلاید 32: int main(){ char buffer[80]; cin.getline(buffer,80,$); char* name[4]; name[0] = buffer; int count = 0; for (char* p=buffer; *p ! 0; p++) if (*p == n) { *p = 0; // end name[count] name[++count] = p+1; // begin next name } cout << The names are:n; for (int i=0; i<count; i++) cout << t << i << . [ << name[i] << ] << endl;}
اسلاید 33: مقداردهي يك آرايۀ رشتهاي اين برنامه هم آرايۀ رشتهاي name را مقداردهي کرده و سپس مقادير آن را چاپ مينمايد:int main(){char* name[]= { Mostafa Chamran, Mehdi Zeinoddin, Ebrahim Hemmat }; cout << The names are:n; for (int i = 0; i < 3; i++) cout << t << i << . [ << name[i] << ] << endl;}
اسلاید 34: توابع استاندارد رشتههاي کاراکتري:سرفايل <cstring> که به آن «کتابخانۀ رشتههاي کاراکتري» هم ميگويند، شامل خانوادۀ توابعي است که براي دستکاري رشتههاي کاراکتري خيلي مفيدند.مثال بعدي سادهترين آنها يعني تابع طول رشته را نشان ميدهد. اين تابع، طول يک رشتۀ کاراکتري ارسال شده به آن (يعني تعداد کاراکترهاي آن رشته) را برميگرداند.
اسلاید 35: تابع strlen():برنامۀ زير يک برنامۀ آزمون ساده براي تابع strlen() است. وقتي strlen(s) فراخواني ميشود، تعداد کاراکترهاي درون رشتۀ s که قبل از کاراکتر NUL قرار گرفتهاند، بازگشت داده ميشود:#include <cstring>int main(){ char s[] = ABCDEFG; cout << strlen( << s << ) = << strlen(s) << endl; cout << strlen() = << strlen() << endl; char buffer[80]; cout << Enter string: ; cin >> buffer; cout << strlen( << buffer << ) = << strlen(buffer) << endl;}
اسلاید 36: توابع strrchr(), strchr(), strstr():برنامۀ زير، مکانيابي يک کاراکتر يا زيررشتۀ خاص را در رشتۀ کاراکتري s نشان ميدهد:#include <cstring>int main(){ char s[] = The Mississippi is a long river.; cout << s = << s << n; char* p = strchr(s, ); cout << strchr(s, ) points to s[ << p - s << ].n; p = strchr(s, e); cout << strchr(s, e) points to s[ << p - s << ].n; p = strrchr(s, e); cout << strrchr(s, e) points to s[ << p - s << ].n; p = strstr(s, is); cout << strstr(s, is) points to s[ << p – s << ].n; p = strstr(s, isi); cout << strstr(s, is) points to s[ << p – s << ].n; if (p == NULL) cout << strstr(s, isi) returns NULLn;}
اسلاید 37: تابع strcpy():برنامۀ زير نشان ميدهد که فراخواني strcpy(s1, s2) چه تاثيري دارد:#include <iostream>#include <cstring>int main(){ char s1[] = ABCDEFG; char s2[] = XYZ; cout << Before strcpy(s1,s2):n; cout << ts1 = [ << s1 << ], length = << strlen(s1) << endl; cout << ts2 = [ << s2 << ], length = << strlen(s2) << endl; strcpy(s1,s2); cout << After strcpy(s1,s2):n; cout << ts1 = [ << s1 << ], length = << strlen(s1) << endl; cout << ts2 = [ << s2 << ], length = << strlen(s2) << endl;}
اسلاید 38: تابع :strncpy()برنامۀ زير بررسي ميکند که فراخوانيstrncpy(s1, s2, n) چه اثري دارد: int main(){ char s1[] = ABCDEFG; char s2[] = XYZ; cout << Before strncpy(s1,s2,2):n; cout << ts1 = [ << s1 << ], length = << strlen(s1) << endl; cout << ts2 = [ << s2 << ], length = << strlen(s2) << endl; strncpy(s1,s2,2); cout << After strncpy(s1,s2,2):n; cout << ts1 = [ << s1 << ], length = << strlen(s1) << endl; cout << ts2 = [ << s2 << ], length = << strlen(s2) << endl;}
اسلاید 39: تابع الصاق رشته :strcat()برنامۀ زير بررسي ميکند که فراخواني strcat(s1, s2) چه تاثيري دارد: int main(){ char s1[] = ABCDEFG; char s2[] = XYZ; cout << Before strcat(s1,s2):n; cout << ts1 = [ << s1 << ], length = << strlen(s1) << endl; cout << ts2 = [ << s2 << ], length = << strlen(s2) << endl; strcat(s1,s2); cout << After strcat(s1,s2):n; cout << ts1 = [ << s1 << ], length = << strlen(s1) << endl; cout << ts2 = [ << s2 << ], length = << strlen(s2) << endl;}
اسلاید 40: رشتههاي کاراکتري در C++ استاندارد :رشتههاي کاراکتري که تاکنون تشريح شد، در زبان C استفاده ميشوند و البته بخش مهمي از C++ نيز محسوب ميشوند زيرا وسيلۀ مفيدي براي پردازش سريع دادهها هستند. اما اين سرعت پردازش، هزينهاي هم دارد: خطر خطاهاي زمان اجرا. ين خطاها معمولا از اين ناشي ميشوند که فقط بر کاراکتر NUL به عنوان پايان رشته تکيه ميشود. C++ رشتههاي کاراکتري خاصي نيز دارد که امنتر و مطمئنتر هستند. در اين رشتهها، طول رشته نيز درون رشته ذخيره ميشود و لذا فقط به کاراکتر NUL براي مشخص نمودن انتهاي رشته اکتفا نميشود.
اسلاید 41: نگاهي دقيقتر به تبادل دادههاوقتي ميخواهيم دادههايي را وارد کنيم، اين دادهها را در قالب مجموعهاي از کاراکترها تايپ ميکنيم. همچنين وقتي ميخواهيم نتايجي را به خارج از برنامه بفرستيم، اين نتايج در قالب مجموعهاي از کاراکترها نمايش داده ميشوند. لازم است که اين کاراکترها به نحوي براي برنامه تفسير شوند. مثلا وقتي قصد داريم يک عدد صحيح را وارد کنيم، چند کاراکتر عددي تايپ ميکنيم
اسلاید 42: حالا ساز و کاري لازم است که از اين کاراکترها يک مقدار صحيح بسازد و به برنامه تحويل دهد. همچنين وقتي قصد داريم يک عدد اعشاري را به خروجي بفرستيم، بايد با استفاده از راهکاري، آن عدد اعشاري به کاراکترهايي تبديل شود تا در خروجي نمايش يابد. C++ بر عهده دارند.
اسلاید 43: جريانها اين وظايف را در C++ بر عهده دارند. جريانها شبيه پالايهاي هستند که دادهها را به کاراکتر تبديل ميکنند و کاراکترها را به دادههايي از يک نوع بنيادي تبديل مينمايند. به طور کلي، وروديها و خروجيها را يک کلاس جريان به نام stream کنترل ميکند. اين کلاس خود به زيرکلاسهايي تقسيم ميشود:
اسلاید 44: شيء istream جرياني است که دادههاي مورد نياز را از کاراکترهاي وارد شده از صفحه کليد، فراهم ميکند. شيء ostream جرياني است که دادههاي حاصل را به کاراکترهاي خروجي قابل نمايش روي صفحۀ نمايشگر تبديل مينمايد. شيء ifstream جرياني است که دادههاي مورد نياز را از دادههاي داخل يک فايل، فراهم ميکند. شيء ofstream جرياني است که دادههاي حاصل را درون يک فايل ذخيره مينمايد. اين جريانها و طريقۀ استفاده از آنها را در ادامه خواهيم ديد.
اسلاید 45: استفاده از عملگر بيرونكشي براي كنترل کردن يك حلقه :int main(){ int n; while (cin >> n) cout << n = << n << endl;}
اسلاید 46: ورودي قالببندي نشده:سرفايل <iostream> توابع مختلفي براي ورودي دارد. اين توابع براي وارد کردن کاراکترها و رشتههاي کاراکتري به کار ميروند که کاراکترهاي فضاي سفيد را ناديده نميگيرند. رايجترين آنها، تابع cin.get() براي دريافت يک کاراکتر تکي و تابع cin.getline() براي دريافت يک رشتۀ کاراکتري است.
اسلاید 47: دريافت كاراكترها با استفاده از تابع :cin.get() while (cin.get(c)){ if (c >= a && c <= z) c += A - a; // capitalize c cout.put(c);}
اسلاید 48: وارد كردن يک رشتۀ کاراکتري به وسيلۀ تابع :cin.getline()برنامۀ زير نشان ميدهد که چطور ميتوان دادههاي متني را خط به خط از ورودي خوانده و درون يک آرايۀ رشتهاي قرار داد:::const int LEN=32; // maximum word lengthconst int SIZE=10; // array sizetypedef char Name[LEN]; // defines Name to be a C_string typeint main(){ Name martyr[SIZE]; // defines martyr to be an array of 10 names int n=0; while(cin.getline(martyr[n++], LEN) && n<SIZE) ; --n; for (int i=0; i<n; i++) cout << t << i+1 << . << martyr[i] << endl;}
اسلاید 49: نوع string در ++C استاندارد:در C++ استاندارد نوع دادهاي خاصي به نام string وجود دارد که مشخصات اين نوع در سرفايل <string> تعريف شده است. براي آشنايي با اين نوع جديد، از طريقۀ اعلان و مقداردهي آن شروع ميکنيم. اشيايي که از نوع string هستند به چند طريق ميتوانند اعلان و مقداردهي شوند:string s1; // s1 contains 0 charactersstring s2 = PNU University; // s2 contains 14 charactersstring s3(60, *); // s3 contains 60 asterisksstring s4 = s3; // s4 contains 60 asterisksstring s5(s2, 4, 2); // s5 is the 2-character string Un
اسلاید 50: استفاده از نوع stringکد زير يک مجموعه کاراکتر را از ورودي ميگيرد و سپس بعد از هر کاراکتر E يک علامت ويرگول , اضافه مينمايد. مثلا اگر عبارت The SOFTWARE MOVEMENT is began وارد شود، برنامۀ زير، آن را به جملۀ زير تبديل ميکند: The SOFTWARE, MOVE,ME,NT is began متن برنامه اين چنين است: string word;int k;while (cin >> word){ k = word.find(E) + 1; if (k < word.length()) word.relace(k, 0, ,); cout << word << ;}
اسلاید 51: فايلها يکي از مزيتهاي رايانه، قدرت نگهداري اطلاعات حجيم است. فايلها اين قدرت را به رايانه ميدهند. اگر چيزي به نام فايل وجود نميداشت، شايد رايانهها به شکل امروزي توسعه و کاربرد پيدا نميکردند. چون اغلب برنامههاي امروزي با فايلها سر و کار دارند، يک برنامهنويس لازم است که با فايل آشنا باشد و بتواند با استفاده از اين امکان ذخيره و بازيابي، کارايي برنامههايش را ارتقا دهد.
اسلاید 52: پردازش فايل در C++ بسيار شبيه تراکنشهاي معمولي ورودي و خروجي است زيرا اينها همه از اشياي جريان مشابهي بهره ميبرند. جريان fstream براي تراکنش برنامه با فايلها به کار ميرود. fstream نيز به دو زيرشاخۀ ifstream و ofstream تقسيم ميشود. جريان ifstream براي خواندن اطلاعات از يک فايل به کار ميرود و جريان ofstream براي نوشتن اطلاعات درون يک فايل استفاده ميشود.
اسلاید 53: فراموش نکنيد که اين جريانها در سرفايل <fstream> تعريف شدهاند. پس بايد دستور پيشپردازندۀ #include <fstream> را به ابتداي برنامه بيافزاييد. سپس ميتوانيد عناصري از نوع جريان فايل به شکل زير تعريف کنيد: ifstream readfile(INPUT.TXT);ofstream writefile(OUTPUT.TXT);طبق کدهاي فوق، readfile عنصري است که دادهها را از فايلي به نام INPUT.TXT ميخواند و writefile نيز عنصري است که اطلاعاتي را در فايلي به نام OUTPUT.TXT مينويسد. اکنون ميتوان با استفاده از عملگر >> دادهها را به درون readfile خواند و با عملگر << اطلاعات را درون writefile نوشت. به مثال زير توجه کنيد.
اسلاید 54: يک دفتر تلفنبرنامۀ زير، چند نام و تلفن مربوط به هر يک را به ترتيب از کاربر دريافت کرده و در فايلي به نام PHONE.TXT ذخيره ميکند. کاربر براي پايان دادن به ورودي بايد عدد 0 را تايپ کند. #include <fstream>#include <iostream>using namespace std;int main(){ ofstream phonefile(PHONE.TXT); long number; string name; cout << Enter a number for each name. (0 for quit): ; for ( ; ; ) { cout << Number: ; cin >> number; if (number == 0) break; phonefile << number << ; cout << Name: ; cin >> name; phonefile << name << ; cout << endl; }}
اسلاید 55: جستجوي يک شماره در دفتر تلفناين برنامه، فايل توليد شده توسط برنامۀ قبل را به کار ميگيرد و درون آن به دنبال يک شماره تلفن ميگردد:#include <fstream>#include <iostream>using namespace std;int main(){ ifstream phonefile(PHONE.TXT); long number; string name, searchname; bool found=false; cout << Enter a name for findind its phone number: ; cin >> searchname; cout << endl; while (phonefile >> number) { phonefile >> name; if (searchname == name) { cout << name << << number << endl; found = true; } if (!found) cout << searchname << is not in this phonebook. << endl;}
اسلاید 56: پايان جلسه هشتم
نقد و بررسی ها
هیچ نظری برای این پاورپوینت نوشته نشده است.