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

コードは最適化されておらず、多くの不要なストリームとバッファが作成されていますが、@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);

"../../"実行可能ファイルの 2 つのアップ フォルダーであるフォルダー内の ファイルを開いています。
しかし、この行では

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

同じパラメーターは、ファイル名の先頭に"../.."ある実行可能ファイルの親フォルダーを開く別のファイルを引き起こします".."'/'FileStream を使用して作成した最初のファイルを確実に書き込むために、StreamWriter パラメーターの最後にエクストラを追加しました。

于 2012-12-28T12:58:12.947 に答える
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 に答える
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 に答える