2017-02-27 5 views
0

Alle meine Daten (Name/Rollnummer/Klasse) hat eine feste Länge (14 Bytes), ich möchte, dass das Programm einen zufälligen Namen aus dem Array nehmen, dann Mach eine zufällige Rollnummer und schreibe weiter in eine Datei, bis ich "A" drücke.Ich kann keine Daten in eine Binärdatei in einer Schleife schreiben

Nachdem ich das Programm beendet habe, sind die ersten 14 Bytes immer leer und dann sind meine Daten in den nächsten 14 Bytes. Nicht mehr, nicht weniger. Ich weiß nicht, warum es nur einen Datensatz geschrieben hat.

Dies ist mein Code:

Dim randomvalue As Integer 

    'Making this array so that each data entry has 14 bytes to it 

    Dim array1(91) As Integer 

    array1(1) = 14 
    For x = 2 To 91 
     array1(x) = array1(x) + 14 
    Next 

    Dim n1, n2, n3, n4 As Integer 

    'Array with names of fixed lenght, I want to take a name from only these 9: 

    Dim array2(9) As String 
    array2(1) = "aleen" 
    array2(2) = "talha" 
    array2(3) = "waddi" 
    array2(4) = "hasna" 
    array2(5) = "hassa" 
    array2(6) = "zainn" 
    array2(7) = "faqeh" 
    array2(8) = "furru" 
    array2(9) = "ibrah" 

    'There is a structure above submain with studentname/rollnumber/class all declared as string 

    Dim newstudent As student 
    Dim studentstream As New FileStream("C:\Users\Students\Desktop\A2Filing.dat", FileMode.OpenOrCreate) 
    Dim bw As New BinaryWriter(studentstream) 

    While Console.ReadLine <> "A" 
     Console.WriteLine("Press any key other than 'A' if you want to make another entry into the file") 


     'CInt(Math.Floor((upperlimit - lowerlimit + 1) * Rnd())) + lowerlimit 
     'Randomize a number b/w 1-9 to get a studentname from the array 

     randomvalue = CInt(Math.Floor((9 - 1 + 1) * Rnd())) + 1 
     newstudent.studentname = array2(randomvalue) 

     n1 = Rnd() + (Rnd() * 50) 
     n2 = Rnd() * 10 
     n3 = Rnd() * 255 
     n4 = Rnd() * Rnd() 
     newstudent.rollnumber = Convert.ToString(Left(n1, 1) + Left(n2, 1) + Left(n3, 1) + Left(n4, 1)) 

     newstudent.studentclass = "A2" 

     'Randomize a number between 91 and 1 to place the data in 

     Dim randomvalue2 As Integer 
     randomvalue2 = CInt(Math.Floor((91 - 1 + 1) * Rnd())) + 1 
     studentstream.Position = array1(randomvalue2) 


     bw.Write(newstudent.studentname) 
     bw.Write(newstudent.rollnumber) 
     bw.Write(newstudent.studentclass) 
    End While 

Antwort

1

Es gibt einige Hinweise hier:

  • die array1 Artikel, wie Sie init alle 14 sein wird, können Sie es zu folgenden Änderungen haben, aber als Ich werde später sagen, dass es nicht erforderlich ist, ein solches Array zu definieren!

    For x = 2 To 91 
        array1(x) = array1(x - 1) + 14 'modified to array1(x - 1) 
    Next 
    
  • vor bw.Write, Sie haben dies: studentstream.Position = array1(randomvalue2), die die Dateiposition außer Kraft gesetzt werden! auch alle Artikel in array1 sind gleich 14. deshalb bekommst du immer eine kleine Dateigröße (nicht mehr und nicht weniger). Sie müssen die Position nicht auf diese Weise festlegen. Entfernen Sie einfach diese Zeile aus Ihrem Code, um Daten nacheinander anzuhängen.

  • Laut Dokumentation, wenn Sie eine BinaryWriter verwenden, um Strings zu schreiben, wird es mit String-Länge vorangestellt werden! see this question.

    Dim bw As New BinaryWriter(studentstream, System.Text.Encoding.ASCII) 
    
    bw.Write("A") 'writes: 1 A => where 1 is length of string "A" 
    bw.Write("BC") 'writes: 2 B => where 2 is length of string "BC" 
    
    'note that for Unicode Encoding, it will be 2 bytes per char 
    Dim bw As New BinaryWriter(studentstream, System.Text.Encoding.Unicode) 
    bw.Write("A") '2 A 0  where 2 is length of unicde string [A 0] 
    bw.Write("BC") '4 B 0 C 0 where 4 is length of unicde string [B 0 C 0] 
    
  • Wenn Sie Strings ohne Längenpräfix schreiben wollen, können Sie System.Text.Encoding.ASCII.GetBytes(str) verwenden, um Byte-Array zu konvertieren:

    bw.Write(System.Text.Encoding.ASCII.GetBytes(newstudent.studentname)) 
    
  • Eine weitere Option wird auch StreamWriter statt BinaryWriter wie es zu verwenden scheint du brauchst es nicht. see this link

  • beachten Sie, dass es besser ist, Dateien mit Using Block zu öffnen. Andernfalls vergessen Sie nicht, die Close Methode (studentstream.Close()) aufzurufen, wenn Sie fertig sind. Wenn Sie dies nicht tun, verlieren Sie möglicherweise den letzten Teil oder die gesamten Daten!

    Using studentstream As New FileStream("C:\...\Desktop\A2Filing.dat", FileMode.Create) 
    
  • Verwendung FileMode.Create um die Datei zu überschreiben, wenn es bereits vorhanden ist

+0

es Ihnen danken! Es funktionierte, entschied ich mich, diese studentstream.Position = array1 (randomvalue2) zu halten, weil ich keine Daten an die Datei anhängen wollte, ich möchte es an einem zufälligen Ort (auch ein Überlauf-Ding gemacht: eine While-Schleife, die + hinzufügt) 1 bis zur studentstream.position, bis sie auf einen leeren Platz trifft) –

Verwandte Themen