سلام hadii عزيز
نقل قول: با چه دستوراتی میتونم فایل رو باز کنم و کاراکترهاش رو بخونم؟
. براي اينكار دو روش بيشترين كاربرد را دارند:
1) استفاده از Statementهاي Open هست. اين روش خيلي قديمي هست كه براي سازگاري حتا در VB.2008 هم هستش. اشكال اين روش به غير از قديمي بودن، سرعت بسيار كند آن در خواندن يا نوشتن نسبت به روش دوم هست.
2) استفاده از
FileSystemObject Object Modeling كه به اختصار FSO ناميده ميشود. اين روش به غير از به روز بودن از سرعت بيشتري هم برخوردار است. در VS v6.0 و در MSDN، ميتوانيد در اين قسمت "
Programming in the FSO Object Model" اطلاعات بيشتري در مورد آن بيابيد.
. انتخاب هر روش به عهده خودتان هست، اما توصيه من انتخاب روش دوم هست. در ادامه هردو را توضيح ميدهم، اميدوارم كه مفيد واقع شود.
********************
روش اول:
. روش Open فهم و استفاده سادهتري داره. براي استفاده از اين روش به ترتيب بايد اين كارها را انجام دهيد:
1) يافتن آخرين file number آزاد توسط تابع
FreeFile. اين تابع عددي بين 1 تا 255 را باز ميگرداند. از اين عدد در دستور Open و به جاي پارامتر filenumber استفاده ميشود.
2) باز نمودن فايل مورد نظر براي خواندن/نوشتن توسط دستور
Open. توسط اين دستور ميتوان يك فايل متني Text يا باينري Binary را براي انجام اعمال فوق باز نمود. هم چنين ميتوان توسط اين دستور نوع دسترسي خود را به فايل براي ايجاد فايل جديد/ براي فقط خواندن/ خواندن و نوشتن/ رو نويسي Overwrite/ اضافه نمودن به آن Append ... تعيين نماييد. همچنين ميتوانيد يك فايل Sequential يا Random را براي ايجاد يا خواندن باز نماييد. البته اين دستور فقط فايل را براي انجام كارهاي فوق باز ميكند ولي خودش چيزي در آنها يا از آنها نمينويسد/نميخواند. براي اين كار از دستورات زير بايد استفاده نماييد.
3) پس از باز نمودن يك فايل و بر اساس نوع فايل (Text/Binary) و نوع دسترسي به آن از يكي از دستورات زير استفاده نماييد:
...... براي نوشتن در فايلهاي Sequential:
ه
o
Print # (Statement)
Write # (Statement)
o
...... براي خواندن از فايلهاي Sequential:
ه
o
Input # (Statement)
Input (Function)
o
...... براي خواندن از فايلهاي Random:
ه
o
Get # (Statement)
o
...... براي نوشتن در فايلهاي Random:
ه
o
Put # (Statement)
o
4) پس از اتمام عمليات برروي فايل بايد
حتمن دسترسي به آن را به كمك دستور
Close ببنديد.
. به همين سادگي! اما قبل از توضيح روشهاي فوق و دستورات لازم براي انجام كارهايمان در هر روش، بايد با فايلهاي Sequential و Random فايلها و مفهوم آنها آشنا شويم. به طور كلي فايلها بر اساس نوع و نحوه نوشتن(ايجادشدن) و خواند دادهها از آنها به يكي از دو نوع فوق تقسيم ميشوند. در فايلهاي Sequential، دادهها پشت سر هم و از ابتداي فايل تا انتها نوشته ميشوند. اندازه هر Record از دادهها و ترتيب آنها ميتواند متغيير باشد و به عبارت ديگر ميتوان از هيچ قائده و اصولي براي نوشتن دادهها در اين نوع از فايلها استفاده نكرد. براي خواندن از چنين فايلهايي نيز بايد و اجبارن دادهها را از ابتداي فايل شروع به خواندن نمود. به عبارت ديگر دادهها به شكل سري و پشت سر هم در اين نوع فايلها نوشته و به همان شكل هم خوانده ميشوند. (معني Sequential در فارسي = سري، پشت سر هم، پياپي ...) بنابر اين اگر قصد داشته باشيد كه دادهاي را كه در وسط فايل قرار دارد را استخراج نماييد، بايد از ابتداي فايل تا آن مكان را بخوانيد!
. اما فايلهاي Random همانند فايلهاي ديتابيس داراي ساختماني مشخص با دسترسي اتفاقي ميباشند. دادهها در اين نوع فايلها با Recordهايي با اندازههاي ثابت و مشخص درون فايل نوشته ميشوند. در عمل نوشتن اجبارن نيازي نيست كه از ابتداي دادهها درون فايل نوشته شود، بلكه كافيست كه شماره Record را مشخص نماييد تا در آن مكان دادهها نوشته شود. براي خواندن هم به همين ترتيب با مشخص نمودن شماره Record عمل خواندن صورت ميگيرد.
. بر اساس نياز هر كاربري يكي از دو نوع روش ايجاد فايل فوق را براي خود بر ميگزيند. اما در اكثر موارد و براي اكثر دادهها فايل ساده Sequential جوابگو نياز اكثر كاربران ميباشد.
. حالا با Syntax دستورات به كار رفته در روشهاي فوق و همچنين همزمان با نوشتن يه برنامه ساده براي خواندن يه فايل Text (متني) آشنا ميشويم. اول تابع ساده FreeFile، اين تابع يك مقدار Integer بين 1 تا 255 را باز ميگرداند:
توجه نماييد! (در اينجا امكانش نيست كه Syntax كامل دستورات و محدوديتهاي آنها و شرايط خواصشان را ذكر نماييم، حتمن به MSDN مراجعه نماييد)
Returns an Integer representing the next file number available for use by the Open statement.
Syntax
FreeFile[(rangenumber)]
o
. پس دستور فوق به اين شكل نوشته ميشود:
کد:
Dim i_FreeFileHandler as Integer
i_FreeFileHandler = FreeFile
. بعد از به دست آوردن شماره آزاد فايل، نوبت به باز نمودن فايل متني (Text) براي خواندن (Input و Read) ميشود. خوب اول Syntax دستور Open را ببينيم:
Enables input/output (I/O) to a file.
Syntax
Open pathname For mode [Access access] [lock] As [#]filenumber [Len=reclength]
The Open statement syntax has these parts:
Part...............Description
pathname......Required.String expression that specifies a file name — may include directory or folder, and drive.
mode.............Required.Keyword specifying the file mode: Append, Binary, Input, Output, or Random. If unspecified, the file is opened for Random access.
access...........[Optional] Keyword specifying the operations permitted on the open file: Read, Write, or Read Write.
lock...............[Optional] Keyword specifying the operations restricted on the open file by other processes: Shared, Lock Read, Lock Write, and Lock Read Write.
filenumber......Required. A validfile number in the range 1 to 511, inclusive. Use the FreeFile function to obtain the next available file number.
reclength.......[Optional] Number less than or equal to 32,767 (bytes). For files opened for random access, this value is the record length. For sequential files, this value is the number of characters buffered.
. خوب حالا براي استفاده از دستور فوق بايد آدرس و نام فايل متني + شماره فايل آزاد + mode و Access را مشخص نماييم:
کد:
Dim s_TextFile as String
s_TextFile = "C:\YourPath\YourFilename.txt"
Open s_TextFile For Input Access Read AS i_FreeFileHandler
. با اين دستور فايل YourFilename.txt را در مسير C:\YourPath براي Input و دسترسي خواندن (Read) با شماره هندلر i_FreeFileHandler كه قبلن به دست آوردهايم باز نمودهايم. اكنون فايل براي انجام عمل خواندن آماده هست. نكته مهم: فراموش نكنيد كه با مد Input حتمن فايل بايد از قبل موجود باشد وگرنه برنامه خطا ميدهد.
. حالا نوبت خواندن فايل ميشود. به دوروش ميتوان اينجا عمل نمود:
1) به كمك دستور Input يك خط را از فايل را درون يك متغيير رشتهاي (String) قرار داد (منظور از يك خط، تا جايي هست كه آن خط با كاركتر Line Feed به خط بعدي رفته. منظور همان كليد Enter هست يا همان vbNewLine يا CHR(13)
o و...) سپس با دستورات رشتهايي همانند MID تك تك كاراكترها را از درون آن متغيير رشتهاي خارج و به درگاه ارسال نمود.
2) به كمك تابع Input كاراكتر به كاراكتر دادهها را از فايل خواند.
. روش دوم زماني مفيد هست كه همه دادهها در يك خط قرار گرفته باشند، البته ميتوانند در چند خط هم قرار داشته باشند ولي براي تشخيص رفتن به خط بعدي بايد يه دستور كنترلي هم بنويسيد. شما مشخص نفرموديد ساختمان داده فايل Textتان به چه شكل هست. من فرض ميكنم همه دادهها در يك خط و پشت سرهم آمدهاند. پس از روش دوم استفاده ميكنم. اما در ابتدا Syntax هر دو دستور فوق:
Reads data from an open sequential file and assigns the data tovariables.
Syntax
Input #filenumber, varlist
The Input # statement syntax has these parts:
Part.............Description
filenumber...Required. Any validfile number.
varlist..........Required. Comma-delimited list of variables that are assigned values read from the file — can't be anarray orobject variable. However, variables that describe an element of an array oruser-defined type may be used.
o
. و اين هم تابع Input كه به شكل زير هست:
Returns String containing characters from a file opened in Input or Binary mode.
Syntax
Input(number, [#]filenumber)
The Input function syntax has these parts:
Part..............Description
number........Required. Any validnumeric expression specifying the number of characters to return.
filenumber....Required. Any validfile number.
o
يك نكته مهم: چون قصد داريم از فايلهاي sequential دادههايي را بخوانيم و بر اساس توضيحات پيشين، براي خواندن دادهها از اين نوع فايلها مجبوريم از ابتدا و پشت سر هم آنها را بخوانيم. زماني كه شما براي اولين بار از دستور Input يا تابع Input استفاده ميكنيد، بر اساس نوع تعريف متغيير موجود در آنها و پارامترهاي ديگرشان، دادهها از ابتداي فايل خوانده ميشوند و در اجراي مجدد يكي از دو عبارت فوق دوباره دادههاي بعدي خوانده شده و اين كار ادامه ميابد تا به انتهاي فايل برسيم. زماني كه به انتهاي فايل برسيد، مقدار End Of File توسط دو عبارت فوق از انتهاي فايل خوانده ميشود. براي كنترل اين مقدار بايد از تابع EOF استفاده نماييم. شكل Syntax اين دستور به صورت زير ميباشد:
Returns an Integer containing the Boolean value True when the end of a file opened for Random or sequential Input has been reached.
Syntax
EOF(filenumber)
o
. حالا به ادامه برنامه خود و كاملتر كردن آن بپردازيم:
کد:
Dim s_ReadCharacter as String
s_ReadCharacter = Input (1,i_FreeFileHandler)
Do While Not EOF(i_FreeFileHandler)
' .... other statement here
' .... other statement here
' .... other statement here
s_ReadCharacter = Input (1,i_FreeFileHandler)
Loop
. در كد فوق، ابتدا اولين كاراكتر از فايل خوانده شده و در متغيير رشتهاي s_ReadCharacter قرار ميگيرد. در ابتداي حلقه چك ميشود كه آيا به انتهاي فايل رسيدهايم يا نه؟! (ممكنه فايل ما حاوي هيچ دادهاي نباشد!) اگر EndOfFile نشده باشد، دستورات درون حلقه اجرا ميشود و در انتهاي حلقه با تابع Input كاركتر بعدي را از فايل ميخوانيم. (چون فايل Sequential هست عمل خواندن دادهها پشت سر هم انجام ميشود حالا به هر تعداد كاركتر كه بخوانيم در عمل بعدي خواندن از ادامه و آخرين محل خوانده شدن دادهها در دفعه پيشين، عمل جديد خواندن ادامه مييابد) اين حلقه تا زماني ادامه ميابد كه حاصل عبارت Not EOF(i_FreeFileHandler)
o به شكل True باشد. تا زماني كه به انتهاي فايل نرسيديد تابع EOF مقدار False را باز ميگرداند و حاصل عبارت فوق True ميشود، اما به مجرد رسيدن به انتهاي فايل، تابع EOF مقدار True را برگشت ميدهد و حاصل عبارت فوق False ميشود. توجه به اين نكته خيلي مهم هست كه حتمن دستور كنترل EOF بايد درست بعد از اجراي دستور خواندن از فايل قرار گيرد چون آخرين مقدار بازگشت داده شده توسط دستور Input باعث بروز اشكال در دستورات بعدي ميشود و حتمن بايد پروسه متوقف شود.
. پس از اتمام كار خواندن فايل بايد آن را با دستور زير ببنديم:
Concludes input/output (I/O) to a file opened using the Open statement.
Syntax
Close [filenumberlist]
o
. كه كد آن ميشود اين:
کد:
Close i_FreeFileHandler
. پس برنامه در انتها به اين شكل در ميآيد:
کد:
Dim s_TextFile as String
Dim s_ReadCharacter as String
Dim i_FreeFileHandler as Integer
i_FreeFileHandler = FreeFile
s_TextFile = "C:\YourPath\YourFilename.txt"
Open s_TextFile For Input Access Read AS i_FreeFileHandler
s_ReadCharacter = Input (1,i_FreeFileHandler)
Do While Not EOF(i_FreeFileHandler)
' .... other statement here
' .... other statement here
' .... other statement here
s_ReadCharacter = Input (1,i_FreeFileHandler)
Loop
Close i_FreeFileHandler
********************
روش دوم:
.
ادامه دارد......... البته اگر فكر ميكنيد روش فوق كافيست كه ديگر هيچ...!
نقل قول: ...و بتونم محتویات اونو به صورت کاراکتر به کارکتر به یه پورت ارسال کنم.
البته تو قسمت ارسال کاراکترها فعلآ مشکلی ندارم.
. قديمها! زماني كه Commodore داشتم از اينكارها ميكردم! اما بعد از خريد PC و به دليل گراني آن و نداشتن منبع اطلاعاتي و ترس و ...! ديگه در از اين كارها نكردم!! ممنون ميشوم يه توضيح مختصر در اينباره بدهيد يا يه لينك يا منبعي را معرفي نماييد، كه هر سه پورت Serial و Parallel و USB را پوشش دهد... ممنون...
پ.ن.: ( من اساسن كند مينويسم! در زمان نوشتن اين پست دوستان زودتر از من پاسخ دادند. پس اميدوارم كه مفيد واقع شود...)
موفق باشيد.
خداحافظ
IgImAx
88/03/11
![[تصویر: 209266.gif]](http://xs227.xs.to/xs227/08204/209266.gif)