0 / 0 / 0
Регистрация: 13.06.2018
Сообщений: 1
1

Как перехватить поток ввода-вывода одной программы через другую (межпроцессорного обмена данными)?

14.06.2018, 00:12. Показов 1595. Ответов 2

Ребята, извиняюсь за некорректность возможную, поскольку я совсем-совсем новичок. у меня есть программа межпроцессорного обмена данными. она находит минимум и максимум, но преподаватель требует ее сделать без временного файла, а с помощью именно перехвата:
управляющая прога
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
 
Console.WriteLine("Введите числа через запятую:");
string mass = Console.ReadLine();
try
{
CheckOnlyDigits(mass);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Main(args);
}
}
 
static void CheckOnlyDigits(string mass)
{
foreach (char ch in mass)
{
if (!Char.IsDigit(ch) && ch != ' ' && ch != ',')
throw new Exception("Ошибка! Обнаруженны неподходящие символы! Проверте правильность ввода.");
 
}
 
File.WriteAllText(@"C:\Users\alex9\OneDrive\Documents\Projects\ConsoleApp1\new_file.txt", mass);
 
Console.WriteLine("Нажмите М чтобы найти максимум");
Console.WriteLine("Нажмите N чтобы найти минимум");
 
switch (Console.ReadKey().Key)
{
case ConsoleKey.M:
 
Process.Start(@"C:\Users\alex9\OneDrive\Documents\Projects\max\max\bin\Debug\max.exe");
Console.WriteLine();
Console.WriteLine("Нажмите Escape чтобы выйти");
break;
case ConsoleKey.N:
Process.Start(@"C:\Users\alex9\OneDrive\Documents\Projects\min\min\bin\Debug\min.exe");
Console.WriteLine();
Console.WriteLine("Нажмите Escape чтобы выйти");
break;
}
 
switch (Console.ReadKey().Key)
{
case ConsoleKey.Escape:
Environment.Exit(0);
break;
}
Console.WriteLine("Нажмите Escape чтобы выйти");
 
}
}
}
максимум
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
 
Console.WriteLine("Введите числа через запятую:");
string mass = Console.ReadLine();
try
{
CheckOnlyDigits(mass);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
Main(args);
}
}
 
static void CheckOnlyDigits(string mass)
{
foreach (char ch in mass)
{
if (!Char.IsDigit(ch) && ch != ' ' && ch != ',')
throw new Exception("Ошибка! Обнаруженны неподходящие символы! Проверте правильность ввода.");
 
}
 
File.WriteAllText(@"C:\Users\alex9\OneDrive\Documents\Projects\ConsoleApp1\new_file.txt", mass);
 
Console.WriteLine("Нажмите М чтобы найти максимум");
Console.WriteLine("Нажмите N чтобы найти минимум");
 
switch (Console.ReadKey().Key)
{
case ConsoleKey.M:
 
Process.Start(@"C:\Users\alex9\OneDrive\Documents\Projects\max\max\bin\Debug\max.exe");
Console.WriteLine();
Console.WriteLine("Нажмите Escape чтобы выйти");
break;
case ConsoleKey.N:
Process.Start(@"C:\Users\alex9\OneDrive\Documents\Projects\min\min\bin\Debug\min.exe");
Console.WriteLine();
Console.WriteLine("Нажмите Escape чтобы выйти");
break;
}
 
switch (Console.ReadKey().Key)
{
case ConsoleKey.Escape:
Environment.Exit(0);
break;
}
Console.WriteLine("Нажмите Escape чтобы выйти");
 
}
}
}
минимум
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
namespace max
{
class Program
{
 
static void Main(string[] args)
{
string file = File.ReadAllText(@"C:\Users\alex9\OneDrive\Documents\Projects\ConsoleApp1\new_file.txt");
int[] nums = file
.Split(new char[] { ' ', ',' }, StringSplitOptions.RemoveEmptyEntries)
.Select(n => int.Parse(n))
.ToArray();
foreach (int i in nums) ;
 
int min = nums[0];
for (int i = 0; i < nums.Length; i++)
{
if (min > nums[i])
{
min = nums[i];
}
}
Console.Write(min);
Console.ReadKey();
}
}
}
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.06.2018, 00:12
Ответы с готовыми решениями:

Передавать большой поток данных из одной программы в другую по сети
нужно передавать достаточно приличный поток данных из одной программы в другую по сети. данные -...

Запись пробелов вместе с вводом данных через поток ввода/вывода
Есть банальный код, который спрашивает у пользователя логин и пароль и записывает данные в...

Как перехватить обмен данными через COM
Как перехватить обмен данными через COM порт, например от мыши, модема или иного устройства ? Если...

как записывать данные в поток ввода-вывода?
доброго времени суток, появилась &quot;гениальная&quot; идея, перехватить сообщения идущие в поток...

2
15 / 14 / 9
Регистрация: 21.11.2015
Сообщений: 86
15.06.2018, 20:38 2
В классе Process есть свойства RedirectStandardOutput, RedirectStandardError. Выставляем их значение в "True", цепляем ивенты ErrorDataReceived, OutputDataReceived. Запускаем дочерний процесс, наслаждаемся результатом. Не забываем про синхронизацию потоков...
Пример использования:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
static void Main(string[] args)
{
    ProcessStartInfo StartInfo = new ProcessStartInfo()
    {
        FileName = "cmd",
        Arguments = @"/C ping 8.8.8.8",
        RedirectStandardOutput = true, // Что нам нужно
        RedirectStandardError = true,   //  Что нам нужно #2
        UseShellExecute = false,
        CreateNoWindow = true
    };
 
    Process childProc = new Process()
    {
        StartInfo = StartInfo
    };
    childProc.ErrorDataReceived += Error_out;  // Цепляем ивенты
    childProc.OutputDataReceived += Out_data;//Цепляем ивенты #2
    childProc.Start();
    childProc.BeginOutputReadLine();
    childProc.BeginErrorReadLine();
    childProc.WaitForExit();
}
 
static void Error_out(object sender, DataReceivedEventArgs e)
{
    Console.WriteLine(e.Data); // Пишем вывод ошибок в консоль
}
static void Out_data(object sender, DataReceivedEventArgs e)
{
    Console.WriteLine(e.Data); // Пишем стандартный вывод в консоль
}
Добавлено через 2 минуты
Заметил что у вас в коде зачем-то используется Console.ReadLine(), его бы убрать, дабы приложение само закрывалось

Добавлено через 1 минуту
И да, точно с таким же успехом можно перехватить StandartInput
0
Эксперт .NET
5309 / 4105 / 1183
Регистрация: 12.10.2013
Сообщений: 11,909
Записей в блоге: 2
15.06.2018, 21:40 3
Цитата Сообщение от AngelaBah Посмотреть сообщение
преподаватель требует ее сделать без временного файла
Как вариант, использовать WCF с именованными каналами через NetNamedPipeBinding.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.06.2018, 21:40

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Как можно сделать виртуальный поток ввода / вывода?
есть программа, которая считает кол-во слов в строке причудливым способом, конечно можно сделать...

Вывод одной программы через другую
Есть 2 программы #include&lt;vector&gt; #include&lt;string&gt; #include&lt;algorithm&gt; #include&lt;iostream&gt; ...

Открытие одной программы через другую.
Привет всем. Проблема такая: Есть две программы ( будем называть их 1 и 2) Запускаешь программу...

Копировать таблицу с данными, перенос таблицы из одной БД в другую (также с данными)
Доброе времени суток всем! Помогите разобраться, как скопировать таблицу вместе с данными в PL/SQL...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.