class Program
{
static void Main(string[] args)
{
string name_f1 = "input.txt";
string name_f2 = "otput.txt";
FileStream inp_f = new FileStream(name_f1, FileMode.Create);
StreamWriter write_f1 = new StreamWriter(inp_f);
Console.WriteLine("Введите входные данные: ");
string inp_data = Console.ReadLine();
write_f1.Write(inp_data);
write_f1.Close();
FileStream out_f = new FileStream(name_f2, FileMode.Create);
try
{
StreamReader reader_f = new StreamReader(inp_f);
string content_f = reader_f.ReadToEnd();
StreamWriter write_f2 = new StreamWriter(out_f);
write_f2.Write(content_f);
reader_f.Close();
write_f2.Close();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Console.ReadKey();
}
}
}
В приведенном выше коде происходит ArgumentException с сообщением "Поток был недоступен для чтения". Сначала я подумал, что я рано закрываю поток или его вообще не надо закрывать, но ни то ни другое не помогло. Как мне кажется, ошибка происходит в следующем участке кода:
FileStream out_f = new FileStream(name_f2, FileMode.Create);
try
{
StreamReader reader_f = new StreamReader(inp_f);
string content_f = reader_f.ReadToEnd();
StreamWriter write_f2 = new StreamWriter(out_f);
write_f2.Write(content_f);
reader_f.Close();
write_f2.Close();
}
После записи в поток Вам необходимо переместить указатель на его начало, но в Вашем примере это не поможет, потому что когда Вы закрываете StreamReader, Вы закрываете и Stream, с которым он связан, то есть, Ваше предположение о несвоевременном закрытии потока в общем-то верно, однако, в Вашем коде достаточно много ошибок присущих новичку, поэтому позволю себе привести свой вариант кода:
class Program
{
static void Main(string[] args)
{
/*
* Переменные в C# принято именовать в camelCase, а не в under_score,
* имена лучше давать осмысленные, например, intermediateFileName, но никак не name_f1),
* кроме того, литеральные значения, которые не будут меняться лучше объявлять константами.
*/
const string intermediateFileName = "input.txt";
const string destinationFileName = "otput.txt";
Console.WriteLine("введите строку: ");
string input = Console.ReadLine();
/*
* Все операции, могущие вызвать исключение должны быть обернуты в try-catch.
* Все манипуляции с Disposable-типами, такими, как Stream должны быть обернуты в блоки using или,
* при невозможности, в try-catch-finally.
*/
Stream intermediateStream = null;
Stream destinationStream = null;
try
{
intermediateStream = new FileStream(intermediateFileName, FileMode.Create);
StreamWriter intermediateWriter = new StreamWriter(intermediateStream);
intermediateWriter.Write(input);
intermediateWriter.Flush();
// Устанавливаем указатель на начало потока.
intermediateStream.Seek(0, SeekOrigin.Begin);
// Копировать из одного файла в другой лучше все же побайтово через буфер
destinationStream = new FileStream(destinationFileName, FileMode.Create);
// Количество байт, прочитанных при последнем чтении
int lastCount = 0;
// Буфер длиной 256 байт
byte[] buffer = new byte[256];
do
{
/*
* читаем из входного потока, записываем в выходной, если прочитано меньше, чем размер буфера,
* значит поток прочитан полностью
*/
lastCount = intermediateStream.Read(buffer, 0, buffer.Length);
destinationStream.Write(buffer, 0, lastCount);
}
while (lastCount == buffer.Length);
}
catch (Exception x)
{
Console.WriteLine($"Произошла ошибка [{x.Message}]:\r\n\r\n{x.StackTrace}");
}
finally
{
// Если стримы инициализированы, закрываем их.
intermediateStream?.Close();
destinationStream?.Close();
}
Console.WriteLine("Нажмите любую клавишу");
Console.ReadKey();
}
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Здравствуйте, начинаю заниматься web-разработкой и возник вопрос как сделать анимацию в react js и как с ней работатьНашел англоязычную статью...
Подскажите как лучше реализовать уведомления (Notifications) в react-native
Подскажите, как реализовать следующую задачу: пользователь кликает по карте получает адрес той точки, на которую нажал, далее строится маршрут...