۲۸ - ۹تمرین‌های فصل

ویژنر و I/O ِ فایل

با استفاده از رمزنگارِ ویژنر که در فصلِ نوع‌داده‌های جبری درست کردین، و تست‌هاش رو در فصلِ تستینگ نوشتین، یه فایلِ اجراشدنی درست کنین که دو آرگومان می‌گیره: یکی کلید ِ رمزنگاری و یکی هم مود. اگه مود‌ِش ‏‎-d‎‏ بود، ورودی‌ای که از ورودیِ استاندار می‌گیره رو رمزگشایی و در خروجیِ استاندارد چاپ کنه. اگه مود‌ِش ‏‎-e‎‏ بود، روی ورودی از ورودیِ استاندارد (‏‎stdin‎‏) بلوکه شه و خروجیِ رمزنگاری‌شده رو به ‏‎stdout‎‏ چاپ کنه.

این رو به چشم یه فرصت برای یادگیریِ طرز کارِ دستگیره‌های فایل، و این عضوهای کتابخونه ِ ‏‎base‎‏ ببینین:

System.Environment.getArgs :: IO [String]
System.IO.hPutStr :: Handle -> String -> IO ()
System.IO.hGetChar :: Handle -> IO Char
System.IO.stdout :: Handle
System.IO.stdin :: Handle

هر سیستم‌عاملی که دارین، باید یاد بگیرین چطور به برنامه‌تون فایلِ ورودی بدین، و چطور خروجیِ استاندارد رو به یه فایل هدایت کنین. بخشی از تمرین اینه که خودتون اینها رو یاد بگیرین. برای اینکه یه نوشته که رمزگذاری یا رمزگشایی شده رو قبول کنین، باید بیشتر از یک بار از ‏‎hGetChar‎‏ استفاده کنین.

به برنامه‌تون مهلتِ زمانی اضافه کنین

با استفاده از ‏‎hWaitForInput‎‏ کاری کنین که در صورتِ ندادنِ ورودی به برنامه، بعد از مدت زمانِ دلخواه‌تون، برنامه بسته بشه. اگر هم خواستین میشه یه آگومانِ command-line ِ اختیاری باشه. با یه کدِ خطای غیرصفر و یه پیغام خطایی که بجای ‏‎stdout‎‏، به خطای استاندار (‏‎stderr‎‏) چاپ میشه، خارج بشین.

System.IO.hWaitForInput :: Handle -> Int -> IO Bool
System.IO.stderr :: Handle

پوشه‌های پیکربندی

با استفاده از پارسرِ INI که در فصلِ پارسینگ نوشتین، یه آدرس ِ فایل‌های پیکربندیِ INI رو به یه ‏‎Map‎‏ پارس کنین؛ کلیدها اسمِ فایل‌ها، و مقادیر نتیجه‌ی پارس ِ فایلِ INI باشن. فقط فایل‌هایی از پوشه که پسوندِ ‏‎.ini‎‏ دارن رو پارس کنین.