Как записать массив в файл си шарп
Ярким примером ссылочного типа данных являются массивы (как объекты!).
Объявление массивов
Для того чтобы воспользоваться массивом в программе, требуется двухэтапная процедура. Во-первых, необходимо объявить переменную, которая может обращаться к массиву. И во-вторых, нужно создать экземпляр массива (объект), используя оператор new.
Важно! Если массив только объявляется, но явно не инициализируется, каждый его элемент будет установлен в значение, принятое по умолчанию для соответствующего типа данных (например, элементы массива типа bool будут устанавливаться в false, а элементы массива типа int — в 0). В примере, если мы удалим строки с инициализацией, будет напечатано пять нулей.
Примечание. Такие же действия с полями экземпляра структуры выполняет конструктор по умолчанию (без параметров).
Доступ к элементам массива
Для обращения к элементам массива используются индексы . Индекс представляет номер элемента в массиве, при этом нумерация начинается с нуля, поэтому индекс первого элемента будет равен 0. А чтобы обратиться к пятому элементу в массиве, нам надо использовать индекс 4, к примеру: myArr[4] .
Инициализация массива
Помимо заполнения массива элемент за элементом (как показано в предыдущем примере), можно также заполнять его с использованием специального синтаксиса инициализации массивов.
Для этого необходимо перечислить включаемые в массив элементы в фигурных скобках < >. Такой синтаксис удобен при создании массива известного размера, когда нужно быстро задать его начальные значения:
1) инициализация массива с использованием ключевого слова new:
int[] m1 = new int[] ;
Обратите внимание, что в случае применения синтаксиса с фигурными скобками размер массива указывать не требуется (как видно на примере создания переменной m1), поскольку этот размер автоматически вычисляется на основе количества элементов внутри фигурных скобок.
Кроме того, применять ключевое слово new не обязательно (как при создании массива m2).
Неявно типизированные массивы
Ключевое слово var позволяет определить переменную так, чтобы лежащий в ее основе тип выводился компилятором. Аналогичным образом можно также определять неявно типизированные локальные массивы. С использованием такого подхода можно определить новую переменную массива без указания типа элементов, содержащихся в массиве.
Определение массива объектов
В большинстве случаев при определении массива тип элемента, содержащегося в массиве, указывается явно.
В результате получается, что в случае определения массива объектов находящиеся внутри него элементы могут представлять собой что угодно.
Если обратимся к определению массива, данному выше: «Массив представляет собой совокупность переменных одного типа с общим для обращения к ним именем», то это выглядит несколько противоречиво. Но тем не менее, все это возможно потому, что каждый элемент является объектом. Приведем пример:
Обратите внимание на четвертый тип цикла foreach (object me in arrByObject). Легко запомнить: Для каждого (for each) объекта с именем me, входящего в (in) массив arrByObject (учите английский!). На печать выводится как сам объект (элемент массива объектов), так и тип этого объекта (метод GetType(), присущий всем объектам класса Object, от которого наследуются все типы).
Свойство Length
Когда запрашивается длина многомерного массива, то возвращается общее число элементов, из которых может состоять массив. Благодаря наличию у массивов свойства Length операции с массивами во многих алгоритмах становятся более простыми, а значит, и более надежными.
Вставим в предыдущем примере перед Console.ReadKey() оператор
Console.WriteLine(arrByObject.Length);
Будет напечатано значение, равное 4 (число объектов в массиве). Чаще всего оно используется для задания числа элементов массива в цикле for<>.
Многомерные массивы
Многомерным называется такой массив, который отличается двумя или более измерениями, причем доступ к каждому элементу такого массива осуществляется с помощью определенной комбинации двух или более индексов. Многомерный массив индексируется двумя и более целыми числами.
Двумерные массивы. Простейшей формой многомерного массива является двумерный массив. Местоположение любого элемента в двумерном массиве обозначается двумя индексами. Такой массив можно представить в виде таблицы, на строки которой указывает первый индекс, а на столбцы — второй. Пример объявления и инициализации двумерного массива показан ниже:
Обратите особое внимание на способ объявления двумерного массива. Схематическое представление массива myArr[,] показано ниже:
Заметим, что в программе используется еще один объект – ran, принадлежащий к классу Random, метод которого (функция Next() ) возвращает целое число в заданном диапазоне (1,15).
Инициализация многомерных массивов
Первое значение в каждом ряду сохраняется на первой позиции в массиве, второе значение — на второй позиции и т.д.
Обратите внимание на то, что блоки инициализаторов разделяются запятыми, а после завершающей эти блоки закрывающей фигурной скобки ставится точка с запятой.
Ниже в качестве примера приведена общая форма инициализации двумерного массива (4 строки, 2 столбца):
Перейдем к рассмотрению примеров решения задач, где применяются массивы и циклы.
Требуется найти сумму и произведение N элементов массива, используя три варианта циклов (for, while, do-while).
Решение. В классе Program объявим статический массив действительных чисел a[1000] и 7 методов (кроме Main()), ввод исходных данных и вычисление сумм и произведений с использованием трех типов циклов.
Тогда наша программа может быть написана так:
В этой статье есть несколько примеров, демонстрирующих различные способы записи текста в файл. В первых двух примерах используются удобные статические методы класса System.IO.File для записи каждого элемента любого объекта IEnumerable<string> и string в текстовый файл. В третьем примере показано, как добавить текст в файл, если необходимо обрабатывать отдельно каждую строку по мере ее записи в файл. В первых трех примерах происходит перезапись всего существующего содержимого файла. В последнем примере показано, как добавить текст в существующий файл.
Запись коллекции строк в файл
Предыдущий пример исходного кода:
Создает экземпляр массива строк с тремя значениями.
- Асинхронно создает имя файла WriteLines.txt. Если целевой файл уже существует, он будет перезаписан.
- Записывает заданные строки в файл.
- Закрывает файл, выполняет автоматическую очистку и удаление по мере необходимости.
Запись одной строки в файл
Предыдущий пример исходного кода:
Создает экземпляр строки с заданным назначенным строковым литералом.
- Асинхронно создает имя файла WriteText.txt. Если целевой файл уже существует, он будет перезаписан.
- Записывает заданный текст в файл.
- Закрывает файл, выполняет автоматическую очистку и удаление по мере необходимости.
Запись выбранных строк из массива в файл
Предыдущий пример исходного кода:
- Создает экземпляр массива строк с тремя значениями.
- Создает экземпляр StreamWriter с путем к файлу WriteLines2.txt как с помощью объявления.
- Выполняет итерацию по всем строкам.
- Условно ожидает вызов StreamWriter.WriteLineAsync(String), который записывает строку в файл, если строка не содержит "Second" .
Добавление текста в существующий файл
Предыдущий пример исходного кода:
- Создает экземпляр массива строк с тремя значениями.
- Создает экземпляр StreamWriter с путем к файлу WriteLines2.txt как с помощью объявления, передавая true для добавления.
- Ожидает вызов StreamWriter.WriteLineAsync(String), который записывает строку в файл как добавленную строку.
Исключения
При следующих условиях возможно возникновение исключения:
-
: Файл существует и является файлом только для чтения. : Имя пути имеет слишком большую длину. : Диск может быть переполнен.
Существуют дополнительные условия, которые могут привести к возникновению исключений при работе с файловой системой, поэтому программировать следует с осторожностью.
Мне нужно руководство, кто-то, чтобы указать мне в правильном направлении. Как говорится в заголовке, мне нужно сохранить информацию в файл: дата, строка, целое число и массив целых чисел. И мне также нужно иметь доступ к этой информации позже, когда пользователь захочет просмотреть ее. Необязательно: Файл представляет собой простой текст, и я могу непосредственно проверить его, и это понятно. Бонусные баллы при выбранном методе могут быть «легко» конвертированы в работу с базой данных в будущем вместо отдельных файлов.
Итак, что вы, ребята, предлагаете?
4 ответа
Первый читабелен; второй будет меньше. Оба отлично справятся с «Date, string, integer и массивом целых чисел» или массивом таких объектов. Для Protobuf-net потребуется добавить некоторые атрибуты, но действительно просто.
Что касается работы с базой данных в качестве столбцов . то здесь есть целый массив целых чисел, потому что большинство баз данных не поддерживают "массив целых чисел" в качестве типа столбца. Я бы сказал, «разделение интересов» - есть отдельная модель для сохранения БД. Если вы используете базу данных исключительно для хранения документов, то: почти каждая БД будет поддерживать данные CLOB и BLOB, поэтому любой из них можно использовать. Многие базы данных теперь имеют встроенную поддержку JSON (вспомогательные методы и т. Д.), Что может сделать JSON как CLOB более заманчивым.
Преимуществом этого также является создание класса, который впоследствии можно будет использовать для работы с объектно-реляционным сопоставителем.
Для открытого текста вы правы. Использовать 1 строку для каждой записи: Строка даты Integer Массив Integer
Если вы читаете Файл в своем коде, вы можете легко отделить их, читая строку за строкой.
Создайте строку с определенным разделителем из массива: [1,2,3] -> "1,2,3" Когда вы читаете строку, вы можете разделить строку на "," и получите массив строк. Разобрать каждую запись в int в массив Int такой же длины.
Если вы действительно хотите перейти к базе данных, попробуйте формат JSON для вашего файла. С ним легко работать, и есть несколько хороших плагинов для работы.
Я прошу прощения, если мой Синтаксис нуждается в некоторой работе, и я извиняюсь, что в настоящее время я не могу просто набрать немного кода для решения вашей проблемы, но я знаю,
Изменить: вот лучшая попытка:
Должен быть результат. («Кавычки» не должны появляться в показаниях , это просто для улучшения читаемости)
Чтение данных и запись данных в файл задача мене тривиальная, чем можно предположить. Функционал System.IO представляет несколько способов сделать это, в зависимости от задач и ограничений, которые стоят перед программистом.
Способы чтения и записи в файл:
- Статическими методами класса File.
- С помощью методов классов StreamReader и Streamwriter.
- С помощью методов классов BinaryReader и BinaryWriter.
Первый способ самый удобный, поскольку позволяет считать или заполнить весь файл буквально в одну строку кода. Благодаря тому, что методы класса File статические, нет необходимости создавать экземпляры объектов, работающих с файлами. Для большинства задач его методы подходят.
Обьекты StreamReader и StreamWriter (BinaryReader и BinaryWriter) возвращаются методами класса FileInfo, как экземпляры, непосредственно работающие с файлом. Код становится более громоздким, но и более гибким, поскольку позволяет организовать сложную систему считывания/записи данных файл, внутри единого блока try/catch для обработки исключений.
Для использования любого из методов в этом разделе нужно включить в код программы библиотеку System.IO перед их вызовом.
Каждый из классов рассматривается нами подробно в отдельных разделах. Сейчас перейдем непосредственно к примерам.
Считывание данных из файла
Функционал класса File позволяет считывать из файла данные в виде строк. Основной метод, который используется при этом – ReadAllText.
При вызове через имя класса он:
- Открывает файл.
- Считывает все строки файла.
- Закрывает файл.
Это удобно в большинстве случаев. Поскольку считывание выполняется в одну строку и есть гарантия, что файл после использования будет закрыт и его можно без боязни вызвать исключение удалить или переместить в новое место.
Подобные инструкции можно воплотить через использования метода ReadToEnd класса StreamReader.
Запись в файл
Функционал записи текста в файл в классе File главным образом представлен методом WriteAllText. Метод имеет два параметра: строковое имя файла и строку или массив строк, которые нужно записать в файл. Метод сам откроет файл, запишет в него текст и закроет его. Весь код умещается в одну строку:
Те же самые иструкции легко выполнить методами класса StreamWriter.
Пример:
Запись в фалй с помощью средств класса StreamWriter можно выполнить асинхронноЮ если применить асинхронную версию метода записи. Например:
Данные или текст с которыми работают методы файловых классов в пространстве имен System.IO могут быть записаны не только на диск. Они также могут направляться в именованные каналы в память или на сетевой ресурс, общее название для объекта куда записываются или откуда считываются данные – это файловый поток. А использование этих объектов – организацией файлового ввода вывода.
Читайте также: