6. فایلهای متنی
یک فایل متنی فایلی است که شامل خطوط متنی است. بیایید با استفاده از مثالها، ایجاد و استفاده از چنین فایلهایی را بررسی کنیم.
6.1. ایجاد و استفاده
برنامه |
![]() |
نتایج |
توضیحات
- خط ۷ یک شیء فایل از نوع "Scripting.FileSystemObject" را با استفاده از تابع CreateObject("Scripting.FileSystemObject") ایجاد میکند. چنین شیءای امکان دسترسی به هر فایلی در سیستم را فراهم میکند، نه فقط فایلهای متنی.
- خط ۹ یک شیء «TextStream» ایجاد میکند. ایجاد این شیء به ایجاد فایل testfile.txt وابسته است. این فایل با یک مسیر مطلق مانند c:\dir1\dir2\....\testfile.txt مشخص نشده، بلکه با یک مسیر نسبی، testfile.txt، مشخص شده است. بنابراین، این فایل در دایرکتوریای که دستور اجرای آن از آنجا فراخوانی میشود، ایجاد خواهد شد.
- سیستم فایل ویندوز با مفاهیمی مانند فایلهای متنی یا غیرمتنی آشنا نیست. این سیستم فقط فایلها را تشخیص میدهد. بنابراین، این وظیفه برنامه کاربری که از این فایل استفاده میکند است که تعیین کند آیا باید آن را به عنوان یک فایل متنی در نظر بگیرد یا خیر.
- خط ۹ یک شیء ایجاد میکند که از آن برای تخصیص دستور set استفاده میشود. ایجاد یک شیء فایل متنی مستلزم ایجاد دو شیء است:
- ایجاد یک شیء Scripting.FileSystemObject (خط ۷)
- که به دنبال آن ایجاد یک شیء «TextStream» (فایل متنی) با استفاده از متد OpenTextFile شیء Scripting.FileSystemObject انجام میشود، که چندین پارامتر را میپذیرد:
- نام فایلی که باید پردازش شود (الزامی)
- حالت دسترسی به فایل. این یک عدد صحیح با سه مقدار ممکن است:
- ۱: دسترسی فقط خواندنی به فایل
- ۲: حالت نوشتن. اگر فایل از قبل وجود نداشته باشد و پارامتر سوم موجود باشد و روی true تنظیم شده باشد، فایل ایجاد میشود؛ در غیر این صورت، ایجاد نمیشود. اگر از قبل وجود داشته باشد، جایگزین میشود.
- ۸: حالت الحاق؛ c.a.d در انتهای فایل مینویسد. اگر فایل از قبل وجود نداشته باشد و پارامتر سوم موجود و روی true تنظیم شده باشد، فایل ایجاد میشود؛ در غیر این صورت، ایجاد نمیشود.
- خط ۱۱ با استفاده از متد WriteLine از شی TextStream که ایجاد شده است، یک خط متن را مینویسد.
- خط ۱۳ فایل را «بسته» میکند. پس از آن دیگر نمیتوان در آن نوشت یا از آن خواند.
- خط ۱۶ یک شیء جدید به نام «TextStream» برای پردازش همان فایل قبلی ایجاد میکند، اما این بار در حالت «append» ( الحاقی). هر خط جدیدی که نوشته شود به انتهای خطوط موجود اضافه خواهد شد.
- خط ۱۸ دو خط جدید مینویسد، با در نظر گرفتن اینکه ثابت vbCRLF نشانگر پایان خط برای فایلهای متنی است.
- خط ۲۰ فایل را دوباره میبندد
- خط ۲۳ آن را در حالت «خواندن» دوباره باز میکند: ما قصد داریم محتویات فایل را بخوانیم.
- خط ۲۷ یک خط متن را با استفاده از متد ReadLine از شیء TextStream میخواند. هنگامی که فایل به تازگی «باز» شده باشد، مکاننما روی خط اول متن آن قرار میگیرد. پس از اینکه این خط توسط متد ReadLine خوانده شد، مکاننما روی خط دوم قرار میگیرد. بنابراین، متد Readline نه تنها خط فعلی را میخواند، بلکه به طور خودکار به خط بعدی «حرکت» میکند.
- برای پردازش تمام خطوط متن، متد ReadLine باید به طور مکرر در یک حلقه اجرا شود. این حلقه (خط ۲۶) زمانی پایان مییابد که ویژگی AtEndOfStream از شیء TextStream مقدار true را داشته باشد. این بدان معناست که دیگر خطی برای خواندن از فایل باقی نمانده است.
6.2. سناریوهای خطا
دو سناریوی خطای رایج وجود دارد:
- تلاش برای باز کردن فایلی برای خواندن که وجود ندارد
- باز کردن یک فایل برای نوشتن یا افزودن فایلی که وجود ندارد، با تنظیم پارامتر سوم روی false در فراخوانی متد OpenTextFile.
برنامه زیر نشان میدهد چگونه این خطاها را تشخیص دهیم:
6.3. برنامه IMPOTS با یک فایل متنی
اکنون به برنامه محاسبه مالیات میپردازیم، با این فرض که دادههای مورد نیاز برای محاسبه مالیات در یک فایل متنی به نام data.txt قرار دارد:
12620 13190 15640 24740 31810 39970 48360 55790 92970 127860 151250 172040 195000 0
0 0,05 0,1 0,15 0,2 0,25 0,3 0,35 0,4 0,45 0,5 0,55 0,6 0,65
0 631 1290,5 2072,5 3309,5 4900 6898,5 9316,5 12106 16754,5 23147,5 30710 39312 49062
این سه خط به ترتیب حاوی دادههای جدولهای آستانه برنامه، coeffR و coeffN هستند. به لطف طراحی مدولار برنامه ما، تغییرات عمدتاً در رویه getData که مسئول ساخت این سه جدول است، اعمال میشوند. برنامه جدید به شرح زیر است:
برنامه |
|
توضیحات:
- در فایل متنی data.txt، مقادیر ممکن است با یک یا چند فاصله از هم جدا شوند که استفاده از تابع split برای استخراج مقادیر از خط را غیرممکن میسازد. لازم بود از یک عبارت منظم استفاده شود.
- تابع getData علاوه بر سه آرایه محدودکننده (coeffR و coeffN)، یک نتیجه بازمیگرداند که نشان میدهد آیا خطایی رخ داده است یا خیر. این نتیجه یک آرایه واریانت حاوی دو عنصر است. عنصر اول یک کد خطا است (0 در صورت عدم وجود خطا) و عنصر دوم پیام خطا در صورت وقوع خطا است.
- تابع getData اعتبار مقادیر یافتشده در فایل data.txt را بررسی نمیکند. در یک سناریوی دنیای واقعی، این کار باید انجام شود.
