Проблема с вводом данных с файла в C#e

132
01 августа 2021, 12:00

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

using System;

namespace ConsoleApplication2
{
    internal class Program
    {
        public static void Main(string[] args)
        {
            Console.WriteLine("Введите 1 для работы с одномерными массивами\n" +
                              "2 для работы со ступенчатыми массивами\n" +
                              " 3 для работы с зубчатыми массивами\n" +
                              "Введите 0 для выхода");
            byte x = Convert.ToByte(Console.ReadLine());
            while (x != 0)
            {

                while (x < 1 || x > 3)
                {
                    Console.WriteLine("Вы ввели некорректное число. Введите число от 1 до 3 для работы");
                    x = Convert.ToByte(Console.ReadLine());
                }
                switch (x)
                {
                    case 1:
                        Array1D();
                        break;
                    case 2:
                        Array2D();
                        break;
                    case 3:
                        ArrayZub();
                        break;
                    default: break;
                }
                Console.WriteLine("Введите 1 для работы с одномерными массивами\n" +
                                  "2 для работы со ступенчатыми массивами\n" +
                                  " 3 для работы с зубчатыми массивами\n" +
                                  "Введите 0 для выхода");
                x = Convert.ToByte(Console.ReadLine());
            }
        }
        static void Array1D()
        {
            int[] arr = new int[0];
            InputArray(ref arr);
            int[] chet = new int[0];

            Console.WriteLine("Для вывода элементов массива введите 1 \n" +
                              "для вывода максимального и минимального элементов введите 2 \n" +
                              "для выполнения прямой сортировки нажмите 3 \n" +
                              "для выполнения обратной сортировки нажмите 4 \n" + 
                              "для заполнения нового массива четными элементами исходного нажмите 5");
            byte x = Convert.ToByte(Console.ReadLine());
            while (x < 1 || x > 5)
            {
                Console.WriteLine("Вы ввели некорректное число. Введите число от 1 до 5 для работы");
                x = Convert.ToByte(Console.ReadLine());
            }
            switch (x)
            {
                case 1: PrintArray(arr);
                    break;
                case 2: MaxOfArray(arr); MinOfArray(arr);
                    break;
                case 3: Array.Sort(arr);
                    break; 
                case 4: Array.Sort(arr); Array.Reverse(arr);
                    break;
                case 5: ChetArray(arr, chet);
                    break;
                default: break;
            }
        }
static void InputArray(ref int[] arr)
        {
            Console.WriteLine("Введите кол-во элементов массива, а затем его элементы");
            int n = Convert.ToInt32(Console.ReadLine());
            arr = new int[n];
            for (int i = 0; i < n; i++)
            {
                arr[i] = Convert.ToInt32(Console.ReadLine());
            }
        }
Answer 1
using System;
using System.Linq;
using System.Text;
using System.IO;
namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            byte x = 5;
            while (x != 0) {
                Console.WriteLine("\nВыберите тип массива (от 1 до 3)\n" +
                                  " 1 - одномерный массив;\n" +
                                  " 2 - ступенчатый массив;\n" +
                                  " 3 - зубчатый массив;\n" +
                                  " 0 - выход из программы.");
                Console.Write("Ваш выбор: ");
                string s = Console.ReadLine();
                if(!s.Equals(""))
                    x = Convert.ToByte(s);
                if (x > 3) {
                    Console.WriteLine("Ошибка ввода.");
                    continue;
                }
                else
                    switch (x) {
                        case 1:
                            Array1D();
                            break;
                        case 2:
                            //Array2D();
                            break;
                        case 3:
                            //ArrayZub();
                            break;
                        case 0:
                            return;
                    }
            }
        }
        static void Array1D()
        {
            byte u = 9;
            int[] inarr = new int[50];
            while (u != 0)
            {
                Console.WriteLine("\nЗадайте вид операции (от 1 до 5)\n" +
                                  " 1 - чтение исходного файла в буферный массив;\n" +
                                  " 2 - печать элементов массива,\n" +
                                  " 3 - печать максимального и минимального элементов массива;\n" +
                                  " 4 - прямая сортировка массива;\n" +
                                  " 5 - обратная сортировка массива;\n" +
                                  " 6 - заполнение массива чётными элементами из исходного;\n" +
                                  " 7 - вывод отчета в выходной файл;\n" +
                                  " 0 - возврат в главное меню.");
                Console.Write("Ваш выбор: ");
                string s = Console.ReadLine();
                if(!s.Equals(""))
                    u = Convert.ToByte(s);
                if (u > 7) {
                    Console.WriteLine("Ошибка ввода.");
                    continue;
                }
                switch (u) {
                    case 1: inarr = ReadFile();
                            break;
                    case 2: DisplayArr(inarr);
                            break;
                    case 3: Console.WriteLine("\nМаксимальный элемент = " + Max(inarr).ToString());
                            Console.WriteLine("Минимальный элемент = " + Min(inarr).ToString());
                            break;
                    case 4: Array.Sort(inarr);
                            DisplayArr(inarr);
                            break;
                    case 5: Array.Reverse(inarr);
                            DisplayArr(inarr);
                            break;
                    case 6: inarr = Even(inarr);
                            DisplayArr(inarr);
                            break;
                    case 7: Report();
                            break;
                    case 0: 
                            return;
                }
            }
        }
        static int[] ReadFile()
        {
            int[] arr = new int[50];
            StreamReader sr = new StreamReader("Array1.txt");
            string[] lines = sr.ReadToEnd().Split(new[] { " ", ",", ";", "\r\n"}, StringSplitOptions.None);
            sr.Close();
            for (int i = 0; i < lines.Length; i++) {
                if(!string.Equals(lines[i], ""))
                    arr[i] = System.Convert.ToInt32(lines[i]);
            }
            Console.WriteLine("\nИсходный массив сформирован из файла Array1.txt.");
            return arr;
        }
        static void DisplayArr(int[] arr)
        {
            Console.WriteLine("\nИсходный массив:");
            for (int i = 0; i < arr.Length; i++) {
                Console.Write(arr[i].ToString() + "  ");
                if (i > 0 && (i+1) % 10 == 0)
                    Console.WriteLine();
            }
        }
        static int Max(int[] arr)
        {
            int maxi = arr[0];
            for (int i = 0; i < arr.Length; i++) {
                if (arr[i] > maxi)
                    maxi = arr[i];
            }
            return maxi;
        }
        static int Min(int[] arr)
        {
            int mini = arr[0];
            for (int i = 0; i < arr.Length; i++) {
                if (arr[i] < mini)
                    mini = arr[i];
            }
            return mini;
        }
        static int[] Even(int[] arr)
        {
            int[] evenarr = new int[50];
            for (int i = 0, j = 0; i < arr.Length; i++) {
                if (arr[i] != 0 && arr[i] % 2 == 0) {
                    evenarr[j] = arr[i];
                    j++;
                }
            }
            return evenarr;
        }
        static void WriteArrToFile(int[] arr, StreamWriter swf, string s)
        {
            swf.WriteLine(s);
            for (int i = 0; i < arr.Length; i++) {
                swf.Write(arr[i].ToString() + "  ");
                if (i > 0 && (i + 1) % 10 == 0)
                    swf.WriteLine();
            }
        }
        static void Report()
        {
            int[] arr = new int[50];
            arr = ReadFile();
            StreamWriter sw = new StreamWriter("Report.txt"); 
            WriteArrToFile(arr, sw, "\nИсходный массив:");
            sw.WriteLine("\nМаксимальный элемент = " + Max(arr).ToString());
            sw.WriteLine("Минимальный элемент = " + Min(arr).ToString());
            Array.Sort(arr);
            WriteArrToFile(arr, sw, "\nМассив после прямой сортировки:");
            Array.Reverse(arr);
            WriteArrToFile(arr, sw, "\nМассив после обратной сортировки:");
            arr = Even(arr);
            WriteArrToFile(arr, sw, "\nМассив чётных элементов:");
            sw.Close();
            Console.WriteLine("\nОтчёт сформирован в файле Report.txt.");
        }
    }
}
Answer 2

"Ввод данных через файл" может многое подразумевать.

Хотите использовать файл конфигурации? Внедрите класс ConfigurationManager.AppSettings. https://docs.microsoft.com/ru-ru/dotnet/api/system.configuration.configurationmanager.appsettings?view=netframework-4.8

Хотите считывать собственный файл с информацией? System.IO.File. А там уже читайте все из него и используйте. (как пример - https://docs.microsoft.com/ru-ru/dotnet/api/system.io.file.readalllines?view=netframework-4.8)

READ ALSO
Мониторинг пинга сервера

Мониторинг пинга сервера

Хочу сделать маленький tool для мониторинга статуса сервера своего

155
Работа с процессами на C#

Работа с процессами на C#

Как получить объём используемой оперативной памяти текущих процессов?

321
Изменение стилей при сравнении ворд документов c#

Изменение стилей при сравнении ворд документов c#

Возникла необходимость реализовать версионность вордовских документовС помощью Interop

134
Mysql и периоды дат - как не превысить квоту?

Mysql и периоды дат - как не превысить квоту?

Максимально упрощенно опишу вопрос:

312