2

我有一个简单的程序,我将 7 个数字中的 6 个写入文本文件。逻辑上一切似乎都很好。

但是,数字并未按预期写入文件。

Random random = new Random();

Console.WriteLine("Please enter the name of the numbers file");
string fileLotto = Console.ReadLine();
//creating the lotto file
FileStream fs = new FileStream("../../" + fileLotto + ".txt", FileMode.OpenOrCreate, FileAccess.Write);
BufferedStream bs = new BufferedStream(fs);
Console.WriteLine("File created");
fs.Close();
StreamWriter sw = new StreamWriter("../.." + fileLotto + ".txt");

for(int i = 0; i < 6; i++)
{
    for(int j = 0; j < 7; j++)
    {
        //Console.Write(random.Next(1, 49));
        sw.Write(random.Next(1, 49) + " " );

    }
    sw.WriteLine();

}
sw.Close();

该文件已创建,但是没有将数字写入该文件......也许是关于为什么的建议?

4

4 回答 4

1

你想做什么?为什么你无缘无故宣布这么多流?只需使用:

using(StreamWriter sw = new StreamWriter("../.." + fileLotto + ".txt")){
    for(int i = 0; i < 6; i++){
        for(int j = 0; j < 7; j++)
        {
            //Console.Write(random.Next(1, 49));
            sw.Write(random.Next(1, 49) + " " );

    }
    Console.WriteLine();
    }
}

http://msdn.microsoft.com/en-us/library/6ka1wd3w.aspx

于 2012-12-28T12:39:24.657 回答
1

请注意,您的代码未优化,并且创建了许多不必要的流和缓冲区,但@Michael 的答案概述了在其位置使用的正确代码。我的回答只是强调为什么你的代码没有按预期的方式工作。

你的问题的答案其实很简单。

StreamWriter sw = new StreamWriter("../.." + fileLotto + ".txt");

您忘记将/字符串中的../... 如果fileLotto假定具有该值exampleFileStream则将创建文件example.txt,但StreamWriter将访问..example.txt以进行写入,并且也在不同的文件夹中。

使用变量来定义必须重复使用的值。记住 DRY 原则。

Random random = new Random();

Console.WriteLine("Please enter the name of the numbers file");
string fileLotto = Console.ReadLine();
string fileName = "../../" + fileLotto + ".txt";
//creating the lotto file
FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.Write);
Console.WriteLine("File created");
fs.Close();

StreamWriter sw = new StreamWriter(fileName);

for(int i = 0; i < 6; i++)
{
    for(int j = 0; j < 7; j++)
    {
        //Console.Write(random.Next(1, 49));
        sw.Write(random.Next(1, 49) + " " );

    }
    Console.WriteLine();

}
sw.Close();

我再次说请使用@Michael 的代码。这只是为了突出代码的主要问题。

于 2012-12-28T12:57:39.010 回答
1

好吧,我不得不承认这不是一个花哨的代码。但是为什么这不起作用是
在这一行

FileStream fs = new FileStream("../../" + fileLotto + ".txt", FileMode.OpenOrCreate, FileAccess.Write);

您正在文件夹中打开文件,"../../"该文件夹是可执行文件的两个向上文件夹。
但在这一行

StreamWriter sw = new StreamWriter("../.." + fileLotto + ".txt");

相同的参数"../.."导致另一个文件以".."文件名的开头打开可执行文件的父文件夹。您在 StreamWriter 参数的末尾添加了一个额外'/'的参数,以确保您正在写入使用 FileStream 创建的第一个文件。

于 2012-12-28T12:58:12.947 回答
0

让我们简化一下:

Random random = new Random();
Console.WriteLine("Please enter the name of the numbers file");
string fileLotto = Console.ReadLine();

StringBuilder text = new StringBuilder();
for(int i = 0; i < 6; i++)
{
    for(int j = 0; j < 7; j++)
    {
        text.Append(random.Next(1, 49) + " " );
    }
    Console.WriteLine();
}

File.WriteAllText(string.Format("../../{0}.txt", fileLotto), text.ToString());

这段代码也更安全。您没有打开一堆不必要的流(您没有关闭 BTW)。相反,您将所有文本放在一起并一次编写。

于 2012-12-28T12:36:33.480 回答