我必须编写一个程序,要求用户指定文本文件的文件路径位置,我做了。
然后我希望它在我刚创建的同一个文件上写一个指定数量的随机数。
从而在文本中保存那些随机数。 所有这些只需一次点击即可。
for (int count =userAmountNumber; count <=userAmountNumber; count++)
{
//Crates a random number 1-100
Random newRandomNumber = new Random();
//creating and object with Random called rand
randomNumber = newRandomNumber.Next(1, 100).ToString();
//Use the file path specified by the user here make sure everytime it loops itapeends or writes to the file
outfile = File.AppendText(filepath);
outfile.WriteLine(randomNumber);
outfile.Close();
}
这是我到目前为止的代码。它写入随机数变量的数据,但它只写一次。我认为它取代了它,即使我使用appendtext作为我的方法。有人可以帮忙吗?
答案 0 :(得分:2)
我立即看到您的代码中存在三个问题:
Random
的实例。 count =userAmountNumber
开始而不是count = 0
。解决问题#1之后,您将能够看到问题#2实际上是一个问题。
问题#1是什么?
您当前的实现使用了更多的IO然后它需要。
您在循环的每次迭代中打开,写入和关闭文件。
如何解决?
不要将文本附加到循环内的文件中,最好将文本附加到内存中的缓冲区中,并且只有在循环结束后,才将该缓冲区的所有内容写入文件。
.Net框架为名为StringBulider
的字符串提供了一个很好的缓冲区 - 使用它来存储随机数的字符串表示形式,并在循环完成后将所有字符串构建器内容写入文件。
什么是问题#2?
一旦你解决问题#1,你的循环将运行得更快。实际上,它会运行得如此之快,您会看到文件的内容包含多个连续行的相同数字
这是因为你在循环中初始化了Random
的实例
Random
类根据它在其构造函数中获得的种子生成伪随机数。如果未提供种子,则使用当前系统时间作为种子。当使用相同的种子时,它将提供相同的伪随机数序列 - 因此您将反复获得相同的数字,直到系统时间变化足以更改Random
实例的种子。
如何解决?
只需在循环之前实例化Random
实例。
足够的谈话,让我们看一些代码!
// rnd is kinda the de-facto standard name for instances of the Random class
var rnd = new Random();
// Same for sb and StringBuilder
var sb = new StringBulider();
// And the same for i and for loops...
for (int i = 0; i < userAmountNumber; i++)
{
// Appends the string representation of the next random number to the string builder
sb.AppendLine(rnd.Next(1, 100).ToString());
}
// Appends all the content of the string builder to the text file.
// If the file does not exists, creates it.
System.IO.File.AppendAllText(filepath, sb.ToString());
作为奖励,使用AppendAllText
方法可以省去处理文件流的麻烦 - 它将所有管道代码封装在里面。