stringstream

جریان رشته (string stream) در ++C

مطمئنم با جریان های ورودی/خروجی در ++C آشنا هستید! اگر هم نیستید پس باید بگویم به طور کلی جریان ها یک سری کاراکتر ها هستند که دستگاه ها و حافظه های جانبی برای شما فراهم و یا از شما دریافت کنند. دو ویژگی برای جریان ها اهمیت دارد؛ اولی این که شما می توانید برای پردازش آن ها عملگرهایی داشته باشید، و دومی هم دسته بندی آن ها بر اساس دستگاه های مربوط به آن هاست. کنجکاو شده اید؟ بیشتر بخوانید!

در واقع جریان ها رشته هستند و رشته ها هم جریان هستند! هر دو دنباله ای از کاراکتر ها هستند اما ظاهر و نحوه دسترسی به آن ها متفاوت است. در رشته ها می توانیم به تک تک عتاصر دسترسی مستقیم داشته باشیم. اما در جریان باید به صورت یک دنباله کاملاً پیوسته تمام کاراکترا ها را دریافت یا ارسال کنیم. حالا ما در این مطلب می خواهیم جریانی را معرفی و استفاده کنیم که مقدار دهی آن نه در سطح سخت افزار بلکه در سطح برنامه نویسی انجام می شود. صحبت ما در مورد جریانِ رشته است!

stringstream

لایه های مختلف جریان های ورودی/خروجی در ++C

با اضافه کردن  <sstream> به برنامه خود می توانید جریان هایی از نوع  istringstream برای جریان رشته ورودی،  ostringstream برای جریان رشته خروجی و  stringstream برای داشتن جریان رشته ای به عنوان ورودی و خروجی استفاده کنید. در ادامه با مثال هایی مقدار دهی و ویژگی های یک جریان رشته ورودی/خروجی را بررسی می کنیم.

تعریف یک جریان رشته چه ورودی باشد یا خروجی چه هر دو تقریباً مشابه است.

شکل های تعریف یک جریان رشته:

در هنگام تعریف جریان می توان آن را با استفاده از تابع سازنده اش مقدار دهی کرد. هر چند که بعد از تعریف، مقدار دهی این جریان یا خواندن از آن ها متناسب با این که از چه نوعی هستند (ورودی یا خروجی و یا هردو) می تواند با عملگر های  >> و  << انجام شود. و البته در هر سه حالت این جریان ها یک method از قبل تعریف شده داریم که هم می تواند به جریان مقدار جدیدی بدهد یا بر مقدار آن اضافه کند و یا تمام مقدار فعلی آن را به صورت string برگرداند. در کد زیر از تمام حالت های ذکر شده مثال داریم!

می توانید در اینجا کد بالا را خودتان اجرا کنید و خروجی را ببینید! اما به هر حال خروجی به شکل زیر است.

test

 

استخراج عدد از رشته

حالا با مقدمات آشنا شده ایم؛ بیایید کاربرد دیگری را بررسی کنیم. با استفاده از تعریف عملگر ها برای جریان رشته می توانیم از آن اعداد را استخراج کنیم! در واقع به راحتی می توانیم اعداد داخل یک رشته را جدا کنیم و یا این که یک رشته عددی را فقط با یک جریان رشته به عدد تبدیل کنیم. مثال زیر موضوع را روشن می کند.

این کد را هم می توانید در اینجا خودتان اجرا کنید و خروجی را ببینید! خروجی به شکل زیر است.

extract numbers from string stream

 

در آخر، از آن جا که فکر می کنم این مطلب جای کار بیشتری دارد، صمیمانه از شما خوانــنــدگــان گــرامـــی تقاضا می کنم سوال ها و پیشنهاد های خود را درباره مطلب جریان رشته ها در بخش نظرات، با ما مطرح کنید.

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)

۱۰ دیدگاه

  • سلام و خسته نباشید….
    من تمام مطالبتون رو خوندم تقریبا واقعا عالی بود… خیلی به دردم خورد فقط اگه میشه درباره ساختارکلاس ها هم توضیح بدین و اینکه چطوری میتونم یک کلاس رو داخل یک کلاس دیگ تعریف کنم واز اشیاء اون کلاس در کلاس دیگ استفاده کنم..ممنون

  • ممنون…
    با همین c++ … یخورده فقط بفهمم چجوری شروع کنم بقیشو می گردم پیدا می کنم… مثلا برای شروع بخوام دو عدد رو از کاربر بگیرم و جمعشون رو برگردونم ولی اعداد رو تو text box بگیرم و کلا از این محیط سیاه فراتر برم… با visual studio میشه نوشت؟

  • منم سعی کردم تغییرش بدم و بخاطر همین کلی چیز جدید یاد گرفتم… تقریبا تمام محدودیت ها رو برطرف کردم ولی برای اون مشکل جدا کردن با space اول جمله رو بدون space از کاربر می گرفتم و خودم قبل از هر ‘+’ ,’-‘ یک space می زدم با تابع .insert …
    الان هم دارم سعی می کنم نمودار تابعش رو با ‘*’ رسم کنم…
    در کل واقعا ممنونم… بخاطر فهمیدن کد شما با کلی مفهموم جدید آشنا شدم… ولی تقریبا دوشب نخوابیدم |:
    حالا می خوام یواش یواش همزمان با یادگیری بقیه مباحث پایه شروع به یادگیری برنامه نویسی ویژوال کنم.. اگه منبع مناسبی می شناسید لطف کنید معرفی کنید که استفاده کنم… انگلیسی باشه هم زیاد مشکلی نیست… تقریبا دارم تمام مطالب سایت شما رو می خونم… خیلی با حوصله توضیح میدید که متاسفانه همچین ویژگی رو خیلی کم میشه پیدا کرد… ببخشید طولانی شد ولی خواستم بگم که بدونید زحمتتون بیهوده نیست و من ارزشش رو میدونم. بازم ممنون الان میرم سراغ کد جدیدی که نوشتید ببینم چی می تونم بفهمم (:
    کدی که خودم نوشتم وتغییراتی که دادم…
    http://upload7.ir/preview.php?user=&file=313b8a7bf4248c4ea907f7c198a8aff9f3430735

    • محمد امین جان ممنون از لطفت، کلی انرژی دادی!
      لینک کدی رو که توی کامنت قبلی برات گذاشتم عوض کردم. لینک جدید رو چک کن.
      منابع زیادی برای زبان هایی که میشه باهاشون ویژوال برنامه ساخت، هست. برای چه زبانی می خوای؟

  • سلام خیلی ممنون از مطلب مفیدتون…
    یک چند جمله ای داریم ( مثلاً ۲۲٫۲x^5-3x+29-6.2x ) و می خواهیم بجای x مقدار بدیم(مثلا ۲) و نتیجه رو اعلام کنیم… و نکته اینجاست که اون چند جمله ای رو باید از کاربر بصورت رشته بگیریم… حالا بنظرتون چی کار کنیم؟ چطوری ضریب ها رو جدا کنیم؟ خیلی ممنون میشم راجع به این هم یک توضیحی بدید اگه ممکنه…
    ———————————————–
    سلام مجدد آقا حامد…
    ببخشید می خواستم تغییراتی تو برنامه بدم که بعضی محدودیت ها رفع بشه…
    ۱-اگه x ضریب نداشت(مثلا x^2 ) خودش ضریب ۱ رو براش درنظر بگیره..
    ۲-توان های چند رقمی رو هم ساپورت کنه
    ۳-نیازی نباشه کاربر جملات رو با space جدا کنه…
    ببخشید دوباره ازتون سوال کردم آخه هر چی زور زدم نتونستم انجامشون بدم… ممنون میشم دوباره راهنمایی کنید…

    • سلام
      اعتراف می کنم کد قبلی واقعاً افتضاح بود! هم به نکته هایی که شما اشاره کردین توجهی نکرده بودم هم در مورد معادله مثالی شما، نتیجه اشتباه می داد! 🙂
      پردازش دلخواه ما برای یک معادله چند جمله ای با جریان رشته پیچیده می شه. بهتره این جا جداسازی جملات رو بر اساس علامت های + و – انجام بدیم. برای این کار از متد ()find_first_of عضو کلاس string استفاده کردم. کد جدید رو آماده کردم براتون و جاهایی که تغییرات مهم داره، کامنت گذاشتم
      http://bit.ly/solvingPE

      اطلاعات بیشتر:
      http://www.cplusplus.com/reference/string/string/find_first_of

  • فرهاد دلیرانی

    خودم یک چند وقتی که می خواستم این تکنیک یاد بگیرم تنبلی می کردم – تشکر 🙂

پاسخ دهید

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