Skip to content

6. Metin dosyaları

Metin dosyası, metin satırları içeren bir dosyadır. Örnekler üzerinden bu tür dosyaların oluşturulmasını ve kullanımını inceleyelim.

6.1. Oluşturma ve kullanım

Program
Sonuçlar
C:\>cscript fic1.vbs

C:\>dir

FIC1     VBS           352  07/01/02   7:07 fic1.vbs
TESTFILE TXT            25  07/01/02   7:07 testfile.txt

C:\>more testfile.txt

Ceci est un autre test.

Açıklamalar

  • 7. satır, CreateObject("Scripting.FileSystemObject") işlevi aracılığıyla "Scripting.FileSystemObject" türünde bir dosya nesnesi oluşturur. Bu tür bir nesne, sadece metin dosyalarına değil, sistemdeki tüm dosyalara erişim sağlar.
  • 9. satır, "TextStream" nesnesini oluşturur. Bu nesnenin oluşturulması, testfile.txt dosyasının oluşturulmasıyla ilişkilidir. Bu dosya, c:\dir1\dir2\....\testfile.txt gibi mutlak bir adla değil, testfile.txt gibi göreceli bir adla belirtilir. Dolayısıyla, dosyanın çalıştırma komutunun verildiği dizinde oluşturulacaktır.
  • Windows dosya sistemi, metin dosyası veya metin dışı dosya gibi kavramları tanımaz. Sadece dosyaları tanır. Dolayısıyla, bu dosyayı metin dosyası olarak işleyip işlemeyeceğine karar vermek, dosyayı kullanan programa kalmıştır.
  • 9. satır, atama için kullanılan set komutunun kaynağı olan bir nesne oluşturur. Bir metin dosyası nesnesinin oluşturulması, 2 nesnenin oluşturulmasını gerektirir:
    • Scripting.FileSystemObject nesnesinin oluşturulması (7. satır)
    • ardından, birden fazla parametre kabul eden Scripting.FileSystemObject nesnesinin OpenTextFile yöntemi aracılığıyla "TextStream" (metin dosyası) nesnesinin oluşturulması:
      • işlenecek dosyanın adı (zorunlu)
      • dosyanın kullanım modu. Bu, 3 olası değeri olan bir tamsayıdır:
        • 1: dosyanın okuma modunda kullanılması
        • 2: Dosyanın yazma modunda kullanılması. Dosya henüz mevcut değilse ve 3. parametre mevcutsa ve değeri true ise, dosya oluşturulur; aksi takdirde oluşturulmaz. Dosya zaten mevcutsa, üzerine yazılır.
        • 8: dosyaya ekleme modunda kullanım, c.a.d. dosyanın sonuna yazma. Dosya henüz mevcut değilse ve 3. parametre mevcutsa ve değeri true ise, dosya oluşturulur; aksi takdirde oluşturulmaz.
  • 11. satır, oluşturulan TextStream nesnesinin WriteLine yöntemini kullanarak bir metin satırı yazar.
  • 13. satır dosyayı "kapatır". Bundan sonra dosyaya ne yazılabilir ne de okunabilir.
  • 16. satır, daha önce olduğu gibi aynı dosyayı işlemek üzere, ancak bu sefer "ekleme" modunda yeni bir "TextStream" nesnesi oluşturur. Yazılacak satırlar, mevcut satırların arkasına eklenecektir.
  • 18. satır, vbCRLF sabitinin metin dosyalarında satır sonu işareti olduğunu bilerek iki yeni satır yazar.
  • 20. satır dosyayı tekrar kapatır
  • 23. satır dosyayı "okuma" modunda yeniden açar: dosyanın içeriğini okuyacağız.
  • 27. satır, TextStream nesnesinin ReadLine yöntemini kullanarak bir metin satırını okur. Dosya "açıldığında", dosyanın ilk metin satırında konumlandırılırız. Bu satır ReadLine yöntemi ile okunduktan sonra, imleç ikinci satıra geçer. Böylece Readline yöntemi sadece geçerli satırı okumakla kalmaz, ardından otomatik olarak bir sonraki satıra "ilerler".
  • Tüm metin satırlarını işlemek için, ReadLine yöntemi bir döngü içinde tekrar tekrar uygulanmalıdır. Bu döngü (26. satır), TextStream nesnesinin AtEndOfStream özniteliği true değerine ulaştığında sona erer. Bu, dosyada okunacak satır kalmadığı anlamına gelir.

6.2. Hata durumları

Sık karşılaşılan iki hata durumu vardır:

  • var olmayan bir dosyanın okuma modunda açılması
  • OpenTextFile yönteminin çağrılmasında üçüncü parametre olarak false değerinin kullanılmasıyla, mevcut olmayan bir dosyanın yazma modunda açılması veya eklenmesi.

Aşağıdaki program, bu hataları nasıl tespit edebileceğinizi gösterir:

Program
' bir metin dosyasının oluşturulması ve doldurulması
Option Explicit
Dim objFichier,MyFile
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Dim codeErreur

' bir dosya nesnesi oluşturulur
Set objFichier=CreateObject("Scripting.FileSystemObject")

' önceden mevcut olması gereken bir metin dosyasını okuma modunda açma
On Error Resume Next
Set MyFile= objFichier.OpenTextFile("abcd", ForReading)
codeErreur=err.number
On Error GoTo 0
If codeErreur<>0 Then  
    ' dosya mevcut değil
    wscript.echo "Le fichier [abcd] n'existe pas"
Else
    ' metin dosyasını kapatma  
    MyFile.Close
End If


' yazma erişimi için mevcut olması gereken bir metin dosyası açılıyor
On Error Resume Next
Set MyFile= objFichier.OpenTextFile("abcd", ForWriting, False)
codeErreur=err.number
On Error GoTo 0
If codeErreur<>0 Then  
    wscript.echo "Le fichier [abcd] n'existe pas"
Else
    ' metin dosyası kapatılıyor
    MyFile.Close
End If

' zaten mevcut olması gereken bir metin dosyası ekleme modunda açılıyor
On Error Resume Next
Set MyFile= objFichier.OpenTextFile("abcd", ForAppending, False)
codeErreur=err.number
On Error GoTo 0
If codeErreur<>0 Then  
    wscript.echo "Le fichier [abcd] n'existe pas"
Else
    ' metin dosyası kapatılıyor
    MyFile.Close
End If

' son
wscript.quit 0
Sonuçlar
C:\>dir

FIC1     VBS           964  07/01/02   7:54 fic1.vbs
TESTFILE TXT             0  07/01/02   8:18 testfile.txt
FIC2     VBS         1 252  07/01/02   8:23 fic2.vbs
3 fichier(s)              2 216 octets
2 répertoire(s)        4 007.11 Mo libre

C:\>cscript fic2.vbs

Le fichier [abcd] n'existe pas
Le fichier [abcd] n'existe pas
Le fichier [abcd] n'existe pas

6.3. IMPOTS uygulaması ve bir metin dosyası

Vergi hesaplama uygulamasını, vergi hesaplaması için gerekli verilerin data.txt adlı bir metin dosyasında olduğunu varsayarak ele alıyoruz:

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

Bu üç satır, sırasıyla uygulamanın sınır tabloları olan coeffR ve coeffN'teki verileri içermektedir. Uygulamamızın modüler yapısı sayesinde, değişiklikler esas olarak bu üç tabloyu oluşturmakla görevli getData prosedüründe yapılmaktadır. Yeni program şu şekildedir:

Program
' bir vergi mükellefinin vergisinin hesaplanması
' program üç parametre ile çağrılmalıdır: evli, çocuk sayısı, maaş
' evli: evliyse O, evli değilse N karakteri
' çocuklar: çocuk sayısı
' maaş: sentler hariç yıllık maaş

' değişkenlerin zorunlu bildirilmesi
Option Explicit
Dim erreur

' argümanlar, geçerlilikleri kontrol edilerek alınır
Dim marie, enfants, salaire
erreur=getArguments(marie,enfants,salaire)
' hata mı?
If erreur(0)<>0 Then wscript.echo erreur(1) : wscript.quit erreur(0)

' vergi hesaplaması için gerekli veriler alınır
Dim limites, coeffR, coeffN
erreur=getData(limites,coeffR,coeffN)
' hata mı?
If erreur(0)<>0 Then wscript.echo erreur(1) : wscript.quit 5

' sonuç görüntüleniyor
wscript.echo "impôt=" & calculerImpot(marie,enfants,salaire,limites,coeffR,coeffN)

' hata olmadan çıkılıyor
wscript.quit 0

' ------------ işlevler ve prosedürler

' ----------- getArguments
Function getArguments(byref marie, ByRef enfants, ByRef salaire)
    ' ana programa argüman olarak geçirilen üç değeri almalıdır
    ' bir argüman, önüne ve arkasına boşluk eklenmeden programa aktarılır
    ' verilerin geçerliliğini kontrol etmek için düzenli ifadeler kullanılacak

    ' 2 değerli bir hata dizisi varyantı döndürür
    ' hata(0): hata kodu; hata yoksa 0
    ' hata(1): hata varsa hata mesajı, yoksa boş dize

    Dim syntaxe
    syntaxe= _
    "Syntaxe : pg marié enfants salaire" & vbCRLF & _
    "marié : caractère O si marié, N si non marié" & vbCRLF & _
    "enfants : nombre d'enfants (entier >=0)" & vbCRLF & _
    "salaire : salaire annuel sans les centimes (entier >=0)"

    ' 3 argüman olup olmadığı kontrol edilir
    Dim nbArguments
    nbArguments=wscript.arguments.count
    If nbArguments<>3 Then
        ' hata mesajı
        getArguments= array(1,syntaxe & vbCRLF & vbCRLF & "erreur : nombre d'arguments incorrect")
        ' son
        Exit Function
    End If

    Dim modele, correspondances
    Set modele=new regexp

    ' medeni durum, oOnN karakterlerinden biri olmalıdır
    modele.pattern="^[oOnN]$"
    Set correspondances=modele.execute(wscript.arguments(0))
    If correspondances.count=0 Then
        ' hata mesajı
        getArguments=array(2,syntaxe & vbCRLF & vbCRLF & "erreur : argument marie incorrect")
        ' çıkılıyor
        Exit Function
    End If
    ' değeri alınıyor
    If lcase(wscript.arguments(0)) = "o"Then
        marie=true
    Else
        marie=false
    End If

    ' çocuk sayısı 0'dan büyük bir tamsayı olmalıdır
    modele.pattern="^\d{1,2}$"
    Set correspondances=modele.execute(wscript.arguments(1))
    If correspondances.count=0 Then
        ' hata
        getArguments= array(3,syntaxe & vbCRLF & vbCRLF & "erreur : argument enfants incorrect")
        ' çıkılıyor
        Exit Function
    End If
    ' değeri alınıyor
    enfants=cint(wscript.arguments(1))

    ' maaş, 0'dan büyük veya 0'a eşit bir tamsayı olmalıdır
    modele.pattern="^\d{1,9}$"
    Set correspondances=modele.execute(wscript.arguments(2))
    If correspondances.count=0 Then
        ' hata
        getArguments= array(4,syntaxe & vbCRLF & vbCRLF & "erreur : argument salaire incorrect")
        ' çıkılıyor
        Exit Function
    End If
    ' değeri alıyoruz
    salaire=clng(wscript.arguments(2))

    ' hata olmadan tamamlandı
    getArguments=array(0,"")
End Function

' ----------- getData
Function getData(byref limites, ByRef coeffR, ByRef coeffN)
    ' üç sınır tablosunun verileri, coeffR, coeffN, bir metin dosyasında bulunuyor
    ' adlı data.txt adlı bir metin dosyasında yer almaktadır. Her tablo, val1 val2 ... valn şeklinde bir satırı kaplar
    ' dosyasında sırasıyla coeffR ve coeffN sınır tabloları bulunur

    ' olası hataları yönetmek için 2 elemanlı bir hata tablosu varyantı döndürür
    ' hata(0): hata yoksa 0, aksi takdirde >0 bir tamsayı
    ' hata(1): hata varsa hata mesajı

    Dim objFichier,MyFile,codeErreur
    Const ForReading = 1, dataFileName="data.txt"

    ' bir dosya nesnesi oluşturulur
    Set objFichier=CreateObject("Scripting.FileSystemObject")
    ' data.txt dosyasını okuma modunda açıyoruz
    On Error Resume Next
    Set MyFile= objFichier.OpenTextFile(dataFileName, ForReading)
    ' hata mı?
    codeErreur=err.number
    On Error GoTo 0
    If codeErreur<>0 Then
        ' bir hata oluştu - not ediliyor
        getData=array(1,"Impossible d'ouvrir le fichier des données [" & dataFileName & "] en lecture")
        ' içeri giriliyor
        Exit Function
    End If

    ' artık içeriğin doğru olduğunu varsayıyoruz ve herhangi bir doğrulama yapmıyoruz
    ' 3 satırı okunuyor

    ' sınırlar
    Dim ligne, i
    ligne=MyFile.ReadLine
    getDataFromLine ligne,limites

    ' coeffR
    ligne=MyFile.ReadLine
    getDataFromLine ligne,coeffR


    ' coeffN
    ligne=MyFile.ReadLine
    coeffN=split(ligne," ")
    getDataFromLine ligne,coeffN

    ' dosya kapatılıyor
    MyFile.close

    ' hata olmadan tamamlandı
    getData=array(0,"")
End Function

' ----------- getDataFromLine
Sub getDataFromLine(byref ligne, ByRef tableau)
    ' satırda bulunan sayısal değerleri tabloya aktarıyor
    ' bu değerler bir veya daha fazla boşlukla ayrılmıştır

    ' başlangıçta tablo boştur
    tableau=array()
    ' satırı için bir şablon tanımlanıyor
    Dim modele, correspondances
    Set modele= New RegExP
    With modele
        .pattern="\d+,\d+|\d+"    ' 140,5 ou 140
        .global=true              ' toutes les valeurs
    End With

    ' satır analiz ediliyor
    Set correspondances=modele.execute(ligne)
    Dim i
    For i=0 To correspondances.count-1
        ' tablonun boyutları yeniden ayarlanıyor
        ReDim Preserve tableau(i)
        ' yeni öğeye bir değer atanır
        tableau(i)=cdbl(correspondances(i).value)
    Next

    'son
End Sub




' ----------- calculerImpot
Function calculerImpot(byval marie,ByVal enfants,ByVal salaire, ByRef limites, ByRef coeffR, ByRef coeffN)

    ' pay sayısı hesaplanıyor
    Dim nbParts
    If marie=true Then
        nbParts=(enfants/2)+2
    Else
        nbParts=(enfants/2)+1
    End If
    If enfants>=3 Then nbParts=nbParts+0.5

    ' aile payı ve vergilendirilebilir gelir hesaplanır
    Dim revenu, qf
    revenu=0.72*salaire
    qf=revenu/nbParts

    ' vergi hesaplanır
    Dim i, impot
    i=0
    Do While i<ubound(limites) And qf>limites(i)
        i=i+1
    Loop
    calculerImpot=int(revenu*coeffr(i)-nbParts*coeffn(i))
End Function

Açıklamalar:

  • data.txt metin dosyasında değerler bir veya daha fazla boşlukla ayrılmış olabilir; bu nedenle satırdaki değerleri almak için split işlevini kullanmak mümkün değildir. Bu nedenle bir düzenli ifade kullanmak zorunda kalındı
  • getData işlevi, üç sınır tablosunun yanı sıra (coeffR, coeffN), hata olup olmadığını belirten bir sonuç da verir. Bu sonuç, iki öğeden oluşan bir tablo varyantıdır. İlk eleman bir hata kodudur (hata yoksa 0), ikincisi ise hata olması durumunda hata mesajıdır.
  • getData işlevi, data.txt dosyasında bulunan değerlerin geçerliliğini kontrol etmez. Gerçek bir senaryoda bunu yapması gerekir.