将数据写入文本文件

本文关键字:文本 文件 数据 | 更新日期: 2023-09-27 17:49:41

我有一个简单的程序,其中我将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();

文件被创建,但是没有数字被写入文件…为什么呢?

将数据写入文本文件

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

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

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

您忘记将字符串中的/添加到../..。如果假定fileLotto的值为example,则FileStream将创建文件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的代码。这只是为了突出代码的主要问题。

你想干什么?为什么你声明了这么多流却一无所获呢?只使用:

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

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

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

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

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

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

让我们简化一下:

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());

这个代码也更安全。你没有打开一堆不必要的流(顺便说一句,你没有关闭)。相反,你是把所有的文本放在一起,然后一次写完。