c# запись и чтение в бинарный файл
Было дано задание:
Данные должны храниться в бинарном файле следующего формата: [Сигнатура][Запись с id 1][Запись с id 2]…[Запись с id N]
Сигнатура файла – первые 8 букв ваших фамилии, имени и отчества на латинице. Сигнатура файла – первые 8 букв ваших фамилии, имени и отчества на латинице.
Запись должна содержать:
Флаг удаления (1 байт): 0 для существующих записей и 1 для удаленных
Тип записи (1 байт): номер варианта вашей записи
Данные ваших записей (длина – максимальный размер из ваших вариантов записей)
Данные формируются из полей вашей записи:
Поле типа int – 4 байта
Поле типа string – фиксированный размер строки с завершающим нулем (например, 100 байт
Поле типа bool – 1 байт
Как правильно установить фиксированный размер на запись строки? Например как в задании. Допустим я захочу записать строку которая будет занимать 20 символов, то как ограничить фиксированный размер строки в 100 байт? Заполнять пробелами пока не будет заполнено все 100 байт? Можно ли это сделать как то другим способом? Не очень понимаю как это реализовать.
А так же как например реализовать поиск по бинарному файлу. Допусти мне нужно найти строку c id 20. Просто идти в лоб? Запустить цикл и перебирать подходящий id? Если так,то какой цикл использовать? foreach в таком случаем не подойдет ибо он будет итерировать только по 1 символу. Помогите пожалуйста разобраться как правильно реализовать это задание
моя запись файла на данный момент выглядит так:
public TravelRouteV13 Save(TravelRouteV13 records) {
var parsedDate1 = DateTime.Parse(records.data_1);
var parsedDate2 = DateTime.Parse(records.data_2);
BinaryWriter writer = new BinaryWriter(File.Open(pathFromData, FileMode.Append));
record.Add(records);
writer.Write($"[id:{records.id},address:{records.address},activity:{records.activity},data:{parsedDate2.Subtract(parsedDate1)},delete:{0}],");
writer.Close();
return records;
}
Ответы (1 шт):
берем строчку, например
string text = "Hello world";
Преобразуем ее в массив байт используя кодировку например UTF-8
byte[] bytes = Encoding.UTF8.GetBytes(text);
Делаем длину массива 100 байт
if (bytes.Length != 100)
Array.Resize(ref bytes, 100);
Как записать массив байт с помощью BinaryWriter вы уже знаете.
Потом обратно
int eol = Array.IndexOf(bytes, 0);
if (eol > 0)
Array.Resize(ref bytes, eol);
string result = Encoding.UTF8.GetString(bytes);
Русские буквы кодируются 2 байтами, поэтому 100 байт != 100 символов.