我的所有数据(名称/ rollnumber / class)都是固定长度(14个字节),我希望程序继续从数组中取一个随机名称,然后制作一个随机的rollnumber并继续将其写入文件直到我按下" A"。
运行完程序后,前14个字节始终为空,然后我的数据在接下来的14个字节中。更不用说了。我不知道为什么它只写了一个数据记录。
这是我的代码:
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
答案 0 :(得分:1)
这里有一些注意事项:
{init}的<script>
function scrollDown() {
$('html, body').animate({scrollTop: $("footer").offset().top}, 200);
}
</script>
<a href="javascript: void(0);" onclick="javascript:scrollDown();">Click</a>
项都是14,你必须把它改成以下,但正如我后面说的那样,不需要定义这样的数组!
array1
在For x = 2 To 91
array1(x) = array1(x - 1) + 14 'modified to array1(x - 1)
Next
之前,您有:bw.Write
将覆盖文件位置! studentstream.Position = array1(randomvalue2)
中的所有项目都等于14.这就是为什么你总是得到一个小文件大小(仅此而已)。你不需要这样设置位置。 只需从代码中删除该行即可逐个添加数据。
根据文档,如果您使用array1
来编写字符串,它将以字符串长度为前缀! see this question。
BinaryWriter
如果要编写不带长度前缀的字符串,可以使用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]
将其转换为字节数组:
System.Text.Encoding.ASCII.GetBytes(str)
另一种选择也是使用bw.Write(System.Text.Encoding.ASCII.GetBytes(newstudent.studentname))
代替StreamWriter
,因为您似乎不需要它。 see this link
请注意,使用BinaryWriter
块打开文件会更好。否则,完成后不要忘记调用Using
方法(Close
)。如果你不这样做,你可能会失去最后一块或整个数据!
studentstream.Close()
使用Using studentstream As New FileStream("C:\...\Desktop\A2Filing.dat", FileMode.Create)
覆盖文件(如果文件已存在)