.NET 3.x Разработать программу, которая позволяла бы создавать файл из заданных структур - C#

Узнай цену своей работы

Формулировка задачи:

Создать пользовательский тип данных – структура, имя и поля которой заданы в таблице. Разработать программу, которая позволяла бы создавать файл из таких структур, добавлять в созданный файл новые данные и делать какую – либо выборку из этого файла (какие данные выбирать из файла определяет сам студент). Структура:
Структура
Ведомость зарплаты за текущий месяц 1. ФИО 2. Номер отдела 3. Табельный номер 4. Количество рабочих часов 5. Размер зарплаты
Вот мой велосипед.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
 
struct salary
{
    public string name;
    public int department;
    public int number;
    public int hours;
    public double salary_amount;
};
namespace LabRab12
{
    class LabRab12
    {
        static void Main(string[] args)
        {
            // вводим имя файла
            Console.Write("Введите имя файла (включая расширение): ");
            string fname = Console.ReadLine();
            // создаем байтовый поток
            FileStream file;
            // ищем файл с именем fname
            try
            {
                file = new FileStream(fname, FileMode.Open, FileAccess.Read);
            }
            catch(Exception exc)
            {
                // выводим сообщение об ошибке, если файл найти не удалось
                Console.WriteLine(exc.Message);
                Console.WriteLine("Создаем новый файл.");
                // создаем файл с именем fname
                file = new FileStream(fname, FileMode.Create);
            }
            Console.WriteLine("Выберите действие.");
            Console.Write("1 - добавить данные; 2 - выборка из файла; 3 - показать весь файл; 0 - выход: ");
            // выбор действия
            int ans = Convert.ToInt32(Console.ReadLine());
            do
            {
                switch (ans)
                {
                    case 0:
                        return;
                    case 1:
                        // вводим данные в поля структуры
                        salary data = new salary();
                        Console.Write("ФИО: ");
                        data.name = Console.ReadLine();
                        Console.Write("Номер отдела: ");
                        data.department = Convert.ToInt32(Console.ReadLine());
                        Console.Write("Табельный номер: ");
                        data.number = Convert.ToInt32(Console.ReadLine());
                        Console.Write("Кол-во рабочих часов: ");
                        data.hours = Convert.ToInt32(Console.ReadLine());
                        Console.Write("Размер зарплаты: ");
                        data.salary_amount = Convert.ToDouble(Console.ReadLine());
                        // передаем в качестве аргумента символьному потоку вывода
                        // байтовый поток file для преобразования символов в байты
                        StreamWriter filestr = new StreamWriter(file);
                        // записываем данные в файл fname
                        filestr.WriteLine(data.name);
                        filestr.WriteLine(data.department);
                        filestr.WriteLine(data.number);
                        filestr.WriteLine(data.hours);
                        filestr.WriteLine(data.salary_amount);
                        filestr.Close();
                        break;
                    case 2:
                        Console.WriteLine("По каким данным делать выборку?");
                        Console.WriteLine("1 - ФИО; 2 - номер отдела; 3 - табельный номер;");
                        Console.Write("4 - кол-во рабочих часов; 5 - размер зарплаты: ");
                        int _ans = Convert.ToInt32(Console.ReadLine());
                        switch (_ans)
                        {
                            case 1:
                                // запрос на ввод ФИО
                                Console.Write("Введите ФИО полностью (например Иванов Иван Иванович): ");
                                string tmp_string1 = Console.ReadLine();
                                // передаем символьному потоку ввода
                                // в качестве аргумента байтовый поток
                                StreamReader filestr_in1 = new StreamReader(file);
                                salary tmp_data1 = new salary();
                                while (!filestr_in1.EndOfStream)
                                {
                                    tmp_data1.name = filestr_in1.ReadLine();
                                    tmp_data1.department = Convert.ToInt32(filestr_in1.ReadLine());
                                    tmp_data1.number = Convert.ToInt32(filestr_in1.ReadLine());
                                    tmp_data1.hours = Convert.ToInt32(filestr_in1.ReadLine());
                                    tmp_data1.salary_amount = Convert.ToDouble(filestr_in1.ReadLine());
                                    if (tmp_data1.name == tmp_string1)
                                    {
                                        Console.WriteLine(tmp_data1.name);
                                        Console.WriteLine(tmp_data1.department);
                                        Console.WriteLine(tmp_data1.number);
                                        Console.WriteLine(tmp_data1.hours);
                                        Console.WriteLine(tmp_data1.salary_amount);
                                    }
                                }
                                filestr_in1.Close();
                                break;
                            case 2:
                                // запрос на ввод номера отдела
                                Console.Write("Введите номер отдела: ");
                                int department = Convert.ToInt32(Console.ReadLine());
                                // передаем символьному потоку ввода
                                // в качестве аргумента байтовый поток
                                StreamReader filestr_in2 = new StreamReader(file);
                                salary tmp_data2 = new salary();
                                while (!filestr_in2.EndOfStream)
                                {
                                    tmp_data2.name = filestr_in2.ReadLine();
                                    tmp_data2.department = Convert.ToInt32(filestr_in2.ReadLine());
                                    tmp_data2.number = Convert.ToInt32(filestr_in2.ReadLine());
                                    tmp_data2.hours = Convert.ToInt32(filestr_in2.ReadLine());
                                    tmp_data2.salary_amount = Convert.ToDouble(filestr_in2.ReadLine());
                                    if (tmp_data2.department == department)
                                    {
                                        Console.WriteLine(tmp_data2.name);
                                        Console.WriteLine(tmp_data2.department);
                                        Console.WriteLine(tmp_data2.number);
                                        Console.WriteLine(tmp_data2.hours);
                                        Console.WriteLine(tmp_data2.salary_amount);
                                    }
                                }
                                filestr_in2.Close();
                                break;
                            case 3:
                                // запрос на ввод табельного номера
                                Console.Write("Введите табельный номер: ");
                                int number = Convert.ToInt32(Console.ReadLine());
                                // передаем символьному потоку ввода
                                // в качестве аргумента байтовый поток
                                salary tmp_data3 = new salary();
                                StreamReader filestr_in3 = new StreamReader(file);
                                while (!filestr_in3.EndOfStream)
                                {
                                    tmp_data3.name = filestr_in3.ReadLine();
                                    tmp_data3.department = Convert.ToInt32(filestr_in3.ReadLine());
                                    tmp_data3.number = Convert.ToInt32(filestr_in3.ReadLine());
                                    tmp_data3.hours = Convert.ToInt32(filestr_in3.ReadLine());
                                    tmp_data3.salary_amount = Convert.ToDouble(filestr_in3.ReadLine());
                                    if (tmp_data3.number == number)
                                    {
                                        Console.WriteLine(tmp_data3.name);
                                        Console.WriteLine(tmp_data3.department);
                                        Console.WriteLine(tmp_data3.number);
                                        Console.WriteLine(tmp_data3.hours);
                                        Console.WriteLine(tmp_data3.salary_amount);
                                    }
                                }
                                filestr_in3.Close();
                                break;
                            case 4:
                                // запрос на ввод кол-ва рабочих часов
                                Console.Write("Введите кол-во рабочих часов: ");
                                int hours = Convert.ToInt32(Console.ReadLine());
                                // передаем символьному потоку ввода
                                // в качестве аргумента байтовый поток
                                salary tmp_data4 = new salary();
                                StreamReader filestr_in4 = new StreamReader(file);
                                while (!filestr_in4.EndOfStream)
                                {
                                    tmp_data4.name = filestr_in4.ReadLine();
                                    tmp_data4.department = Convert.ToInt32(filestr_in4.ReadLine());
                                    tmp_data4.number = Convert.ToInt32(filestr_in4.ReadLine());
                                    tmp_data4.hours = Convert.ToInt32(filestr_in4.ReadLine());
                                    tmp_data4.salary_amount = Convert.ToDouble(filestr_in4.ReadLine());
                                    if (tmp_data4.hours == hours)
                                    {
                                        Console.WriteLine(tmp_data4.name);
                                        Console.WriteLine(tmp_data4.department);
                                        Console.WriteLine(tmp_data4.number);
                                        Console.WriteLine(tmp_data4.hours);
                                        Console.WriteLine(tmp_data4.salary_amount);
                                    }
                                }
                                filestr_in4.Close();
                                break;
                            case 5:
                                // запрос на ввод зарплаты
                                Console.Write("Введите зарплату: ");
                                int _salary = Convert.ToInt32(Console.ReadLine());
                                // передаем символьному потоку ввода
                                // в качестве аргумента байтовый поток
                                salary tmp_data5 = new salary();
                                StreamReader filestr_in5 = new StreamReader(file);
                                while (!filestr_in5.EndOfStream)
                                {
                                    tmp_data5.name = filestr_in5.ReadLine();
                                    tmp_data5.department = Convert.ToInt32(filestr_in5.ReadLine());
                                    tmp_data5.number = Convert.ToInt32(filestr_in5.ReadLine());
                                    tmp_data5.hours = Convert.ToInt32(filestr_in5.ReadLine());
                                    tmp_data5.salary_amount = Convert.ToDouble(filestr_in5.ReadLine());
                                    if (tmp_data5.salary_amount == _salary)
                                    {
                                        Console.WriteLine(tmp_data5.name);
                                        Console.WriteLine(tmp_data5.department);
                                        Console.WriteLine(tmp_data5.number);
                                        Console.WriteLine(tmp_data5.hours);
                                        Console.WriteLine(tmp_data5.salary_amount);
                                    }
                                }
                                filestr_in5.Close();
                                break;
                            default:
                                Console.WriteLine("Неверный ввод.");
                                break;
                        }
                        break;
                    case 3:
                        // передаем символьному потоку ввода
                        // в качестве аргумента байтовый поток
                        StreamReader filestr_in = new StreamReader(file);
                        string line;
                        while (!filestr_in.EndOfStream)
                        {
                            // выводим строки, пока не достигнем конца файла
                            // filestr_in.EndOfStream возвращает true, если
                            // достигнут конец файла
                            line = filestr_in.ReadLine();
                            Console.WriteLine(line);
                        }
                        filestr_in.Close();
                        break;
                    default:
                        // при вводе неверного значения выводим сообщение об ошибке
                        Console.WriteLine("Неверный ввод.");
                        break;
                }
                Console.Write("1 - добавить данные; 2 - выборка из файла; 3 - показать весь файл; 0 - выход: ");
                ans = Convert.ToInt32(Console.ReadLine());
            } while (ans != 0);
            file.Close();
        }
    }
}
Если 29 строку заменить на
file = new FileStream(fname, FileMode.Append, FileAccess.Write);
то выборку из файла и показ содержимого сделать не получится (с исходной строкой не выходит добавить данные). FileAccess.ReadWrite с FileMode.Append работать не хочет (требует только Write). Так же после первого выполнения какого-либо действия повторный вызов того же действия (показ файла или выборка) выдают исключение "System.ArgumentException: Поток был недоступен для чтения.". Голова уже не варит, а по этой теме еще курсовую делать Прошу помочь доработать мой велосипед.

Решение задачи: «.NET 3.x Разработать программу, которая позволяла бы создавать файл из заданных структур»

textual
Листинг программы
   int i = 0;
            while (++i < 3)
            {
                var fl = new FileStream(@"D:\tst.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite);
                StreamReader filestr_in = new StreamReader(fl);
                string line;
                while (!filestr_in.EndOfStream)
                {
                    // выводим строки, пока не достигнем конца файла
                    // filestr_in.EndOfStream возвращает true, если
                    // достигнут конец файла
                    line = filestr_in.ReadLine();
                    Console.WriteLine(line);
                }
                filestr_in.Close();
                fl.Close();
            }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4 из 5
Похожие ответы