Как читать и писать структуру в файл с использованием C #? - PullRequest
2 голосов
/ 23 декабря 2008

Я могу использовать write (& stName, sizeof (stName) и & FileName) и определить ту же структуру в другой программе для чтения файла (XXX.h), когда я использую C, но я хочу сделать то же самое использование C #, и я должен Не используйте небезопасный режим. Как решить проблему?

Edit:

спасибо всем. Я попробую их

Edit:

Теперь, если я хочу использовать C, напишите Struct в file.h и используйте C # для чтения структуры из file.h, могу ли я решить эту проблему, а не считать смещение? Потому что подсчет смещения не является хорошим ответом, когда я хочу добавить некоторую переменную или другую структуру в структуру.

Ответы [ 7 ]

3 голосов
/ 23 декабря 2008

Посмотрите на интерфейс ISerializable и сериализацию в целом.

3 голосов
/ 23 декабря 2008

Даже в C это опасно для IMO. Если вы используете другой компилятор, операционную систему, архитектуру и т. Д., Вы очень легко «сломаете» свои файлы данных - вы абсолютно полагаетесь на расположение данных в памяти. Это немного похоже на выставление полей непосредственно вместо свойств - макет в памяти должен быть деталью реализации, которую можно изменить без изменения общедоступной формы (файла).

Конечно, существует множество способов хранения данных. Например:

Существуют балансы с точки зрения того, является ли файл читаемым человеком, скорость, размер и т. Д. См. этот вопрос для ответов на аналогичный вопрос о Java.

1 голос
/ 23 декабря 2008

Используйте Managed C ++ или C ++ / CLI. Он может прочитать вашу .h структуру файла. Он может читать и писать, используя:

read(in, &structure, sizeof(structure));
write(out, &structure, sizeof(structure));

, и он может очень просто передавать эти данные чему угодно в .NET.

1 голос
/ 23 декабря 2008

Посмотрите на StructLayoutAttribute

1 голос
/ 23 декабря 2008

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

0 голосов
/ 23 декабря 2008

Вы также можете просмотреть Буферы протокола Google . Возможно, вы не захотите добавлять еще одну зависимость в ваш код, но она предназначена для того, чтобы вы могли делать подобные вещи.

0 голосов
/ 23 декабря 2008

Вы должны будете конвертировать каждый член структуры индивидуально, используя Bitconverter.convert (). Это хорошо работает, когда ваша структура содержит числовые типы данных, но вам может потребоваться сделать что-то более сложное при использовании структур, которые содержат более сложные типы данных, такие как строки, массивы и коллекции. Для подобных целей вам нужно проверить возможности сериализации .Net, о которых упоминали другие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...