Запись данных в текстовый файл

У меня есть простая программа, в которой я пишу 6 из 7 чисел в текстовый файл. По логике все кажется прекрасным.

Однако числа не записываются в файл, как ожидалось.

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

Файл был создан, однако никакие номера не были записаны в файл ... совет, возможно, почему?

2
nl ja de
Я понял это сейчас ... произошла небольшая ошибка в синтаксисе ...
добавлено автор Arianule, источник
StreamWriter sw = новый StreamWriter ("../ .." + fileLotto + .txt ");
добавлено автор Arianule, источник
Должен быть StreamWriter sw = новый StreamWriter ("../../" + fileLotto + .txt ");
добавлено автор Arianule, источник
Вы вызываете fs.Close (); , но не fs.Dispose (); .
добавлено автор Candide, источник
Работает на меня. Это не приятный код, но он работает ...
добавлено автор Jon Skeet, источник
Почему у вас есть BufferedStream , который вы не используете?
добавлено автор Oded, источник

4 ответы

Что ты пытаешься сделать? Как вы объявляете так много потоков ни для чего? Просто используйте:

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

1
добавлено

Обратите внимание, что ваш код не оптимизирован и имеет много ненужных потоков и буферов, но ответ от @Michael описывает правильный код для использования в нем. Мой ответ просто подчеркнет, почему ваш код не работал по-своему.

Ответ на ваш вопрос на самом деле очень прост.

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

Вы забыли добавить / в строку в ../ .. . Если предполагается, что fileLotto имеет значение example , тогда FileStream создаст файл example.txt , но < code> 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();

Снова я говорю, пожалуйста, используйте код Майкла. Это просто подчеркнуть основную проблему с вашим кодом.

1
добавлено

Ну, я должен признать, что это не причудливый код. Но почему это не работает, это
В этой строке

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

Вы открываете файл в папке "../../" , которая находится в двух папках исполняемого файла.
Но в этой строке

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

Тот же параметр "../ .." , который заставляет другой файл открывать родительскую папку исполняемого файла с ".." в начале имени файла. Вы добавили дополнительный '/' в конце параметра StreamWriter, чтобы убедиться, что вы пишете первый файл, созданный с помощью FileStream.

1
добавлено

Давайте упростим это:

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), которые не нужны. Скорее, вы получаете весь текст вместе и записываете все сразу.

0
добавлено
@Oded, не работает ли этот код (в отличие от OP) и в то же время упрощает и добавляет уровень безопасности, потому что не существует никакого смешного количества случайных потоков, которые тоже не закрываются?
добавлено автор Mike Perrenoud, источник
@Oded, я немного смущен. Много раз (как я уверен, вы согласитесь) процесс получения кода для работы - это процесс рефакторинга и изучения новых вещей. Лучшие способы сделать то же самое. Да? Разве это не считается ответом на вопрос? Кроме того, я просто видел комментарий Джона, но он явно не работает для OP, а скорее всего , потому что OP не flushing , но факт заключается в том, что у них есть код неустойчивый да? Разве они не должны использовать лучший способ?
добавлено автор Mike Perrenoud, источник
@ Ой, хм. Но если наша работа заключается в том, чтобы просто позволить людям продолжать плохие привычки, как мы способствовали сообществу? Имеет ли значение, почему код не работает, если рефакторинг, который показывает OP, работает лучше? Может быть, мне не хватает смысла. Я с удовольствием удалю свой ответ, так как ваша репутация ясно показывает, что вы знаете больше об этом сообществе, чем я, но я думал, что помогаю, показывая OP лучше.
добавлено автор Mike Perrenoud, источник
@Oded, понял. По-видимому, код работал на OP, поскольку они приняли мой ответ, и, честно говоря, когда я поместил старый код локально, он работал для меня, но в следующий раз я буду работать с OP, потому что код, который они используют, нуждается в модификации, чтобы они может учиться у него.
добавлено автор Mike Perrenoud, источник
Упростите это, возможно, ответьте на вопрос, который вы не сделали.
добавлено автор Oded, источник
Вы не видели комментарий Джона Скита - код OP делает для него. И вопрос был , почему не работает их код, а не как сделать его проще.
добавлено автор Oded, источник
Конечно, но когда кто-то спрашивает почему не работает X, они хотят знать, почему X не работает, а не видеть Y.
добавлено автор Oded, источник
Моя точка зрения была больше - объясните, почему она не работает, затем показывает лучший способ. Как бы то ни было, ОП не поймет вредных привычек и почему они плохи.
добавлено автор Oded, источник
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot