Записать результат выполнения программы в файл
Есть код, нужно записать результат выполнения в файл , при использовании StreamWriter файл который создан в папке с кодом остается пустым, не пойму почему?
Подаскажите пожалуйста!
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
class ArrayClass2D
{
const int MAX = 100;
static void Print2DArray(int m, int n,char[] arr,char[,] a)
{
/* k - starting row index
m - ending row index
l - starting column index
n - ending column index */
int count = 0;
int k = 0, l = 0;
while (k < m && l < n)
{
for (int i = l; i < n; ++i)
{
a[k,i] = arr [count++];
}
k++;
for (int i = k; i < m; ++i)
{
a[i,n - 1] = arr [count++];
}
n--;
if (k < m)
{
for (int i = n - 1; i >= l; --i)
{
a[m - 1,i] = arr [count++];
}
m--;
}
if (l < n)
{
for (int i = m - 1; i >= k; --i)
{
a[i,l] = arr [count++];
}
l++;
}
}
}
static void Main()
{
string path = "/home/kura1/codeprojects/Test1/CharArray/sample.txt";
string s = Console.ReadLine();
int m = 4, n = 5;
string trimed = String.Concat(s.Where (c=> !Char.IsWhiteSpace(c)));
char [] arr = trimed.ToCharArray();
char [,] a = new char [MAX,MAX];
Print2DArray(m,n,arr,a);
try
{
StreamWriter sw = new StreamWriter (path);
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
sw.Write( "{0,3}",a[i,j]);
}
sw.Write("\n");
}
}
catch(Exception ex)
{
Console.WriteLine ("Expet" + ex.Message);
}
}
}
Ответы (2 шт):
Ответ написан на основе комментария @LaukhinAndrey
Для того, чтобы записывать что-либо в файл с помощью StreamWriter необходимо после функции Write вызывать функцию Flush.
Но можно поступить проще и использовать using, который автоматически вызывает эту функцию и освобождает ресурсы после выхода из конструкции using.
Делается это так:
using (StreamWriter sw = new StreamWriter(path))
{
//тут код записи в файл необходимых данных с помощью StreamWriter
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
sw.Write( "{0,3}",a[i,j]);
}
sw.Write("\n");
}
}
Вот вы файл открыли для записи, записали туда что-то, а закрывать кто будет?
Вариант 1
Ненадежное решение
StreamWriter sw = new StreamWriter(path);
// тут запись
sw.Close(); // или sw.Dispose(); - без разницы
Если при записи будет выброшено исключение, то строка sw.Close() не выполнится, вследствие чего файл может на какое-то время оставаться открытым
Вариант 2
Надежное решение
StreamWriter sw = new StreamWriter(path);
try
{
// тут запись
}
finally
{
sw.Close();
}
Вариант 3
То же самое что Вариант 2, только с использованием дополнительного C# синтаксиса, чтобы код был короче
using (StreamWriter sw = new StreamWriter(path))
{
// тут запись
}
Вариант 4
Современный C# 8 синтаксис
using StreamWriter sw = new StreamWriter(path);
// тут запись
Здесь файл будет закрыт на следующей закрывающей блоко-скобке }.
Эти же самые фокусы следует применять и при чтении файла.